2010-12-22 95 views
6

球员我的列表视图出现问题。滚动时,任何人都可以帮助我,它运行的很慢。 我的listview是自定义布局,使用相对3个textview和1个imageview每行,所有内容都从网上检索。 我使用自定义适配器和视图持有人。android自定义列表视图滚动时很慢

下面是我如何使用适配器的代码。

public class MessageList extends ListActivity { 


    @Override 
    public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
     setContentView(R.layout.listarticle); 

     loadFeed(link); 
     setListAdapter(new IconAdapter(this)); 

    } 

/* This method load xml file and parse it into message object*/ 
private void loadFeed(String link){ 
    try{ 
     BaseFeedParser parser = new BaseFeedParser(link); 
     messages = parser.parse(); 
     titles = new ArrayList<String>(messages.size()); 
     image = new ArrayList<String>(messages.size()); 
     date_post = new ArrayList<String>(messages.size()); 
     descs = new ArrayList<String>(messages.size()); 
     for (Message msg : messages){ 
     titles.add(msg.getTitle()); 
     image.add(msg.getImageLink().toString()); 
     date_post.add(msg.getDate()); 
     descs.add(msg.getDescription()); 

     } 
     } catch (Throwable t){ 
     Log.e("AndroidNews",t.getMessage(),t); 
    } 
    } 

/*this is my custom baseadapter */ 
class IconAdapter extends BaseAdapter{ 
    private LayoutInflater mInflater; 


    public IconAdapter(Context cxt){ 
    mInflater = LayoutInflater.from(cxt); 


    } 

    public class ViewHolder{ 
    private TextView title; 
    private TextView date; 
    private TextView desc; 
    private ImageView thumb; 
    } 

    public View getView(int positiion, View convertView, ViewGroup parent){ 
    ViewHolder holder; 

    if (convertView==null){ 
    convertView = mInflater.inflate(R.layout.row, null); 

    holder = new ViewHolder(); 

    holder.title = (TextView) convertView.findViewById(R.id.title); 
    holder.date = (TextView) convertView.findViewById(R.id.date); 
    holder.desc = (TextView) convertView.findViewById(R.id.deskripsi); 
    holder.thumb = (ImageView) convertView.findViewById(R.id.thumbnail); 

    convertView.setTag(holder); 
    }else{ 

    holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.title.setText(titles.get(positiion)); 
    holder.date.setText(date_post.get(positiion)); 
    holder.desc.setText(descs.get(positiion).substring(0, 55)+"..."); 
    Drawable draw = LoadImageFromWebOperation(image.get(positiion)); 

    holder.thumb.setImageDrawable(draw); 

    return convertView; 
    } 
    /* this method take image from url that retrieve from xml*/ 
    public Drawable LoadImageFromWebOperation(String url){ 
    try{ 
    InputStream is = (InputStream) new URL(url).getContent(); 
    Drawable d = Drawable.createFromStream(is, "src name"); 
    return d; 
    }catch (Exception e){ 
    Log.d("image", url, e); 
    return null; 
    } 
    } 

    @Override 
    public int getCount() { 
    return messages.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
    return messages.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
    return position; 
    } 

} 
+0

编辑和格式化问题中的代码以更好地理解您的问题。 – 2010-12-22 07:37:11

+0

thx。我删除了一些代码。希望你能理解这个问题 – Rahadyanteja 2010-12-22 07:57:57

+0

@Raha,在你的构造函数中,让所有的URL请求都存储在一个数组中,在`getView`中不要再加载它们......这会加快速度。 – st0le 2010-12-22 08:01:41

回答

12
public View getView(int positiion, View convertView, ViewGroup parent){ 
     ... 
     Drawable draw = LoadImageFromWebOperation(image.get(positiion)); 
     ... 
    } 

这就是问题所在。你永远不应该在UI线程中进行联网。为这项工作实施一些异步任务。 另外,您可以使用traceview http://developer.android.com/guide/developing/tools/traceview.html工具来确定性能瓶颈。

4

这是你的问题,就在这里..

Drawable draw = LoadImageFromWebOperation(image.get(positiion)); 

而不是在你的getView()使得重复URL请求,请立即您的所有要求,并存储在Drawables一个数组,然后用里面的数组getView。这将使其速度更快...

0
Please use View Holder pattern in getview. 

ViewHolder holder = null; 

String fileName = arrfiles.get(position); 
     if (convertView == null) { 
      holder = new ViewHolder(); 
      LayoutInflater inflator = ((Activity) context).getLayoutInflater(); 
      convertView = inflator.inflate(R.layout.unsubmited_row, parent, 
        false); 
      convertView.setClickable(false); 
     } 
     else 
     { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     holder.txtFileName = (TextView) convertView 
       .findViewById(R.id.txtFileName); 
     holder.txtisActive = (TextView) convertView 
       .findViewById(R.id.txtIsActive); 
     holder.txtFileName.setText(fileName); 
     convertView.setTag(holder);