2011-07-02 45 views
1

制作了一个自定义列表视图,其中包含一个图像,两个文本视图和一个复选框。我可以确定复选框被选中/取消选中,但是这个设计的问题是非常慢的滚动。如果我测试它到真实设备中,这会变得更快吗?Android自定义列表加载非常缓慢

public class ListViewActivity extends ListActivity { 

protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    ArrayAdapter<Model> compositeAdapter = new CompositeAdapter(this, 
      getModel()); 
    setListAdapter(compositeAdapter); 
    ListView lv = getListView(); 
    lv.setFastScrollEnabled(true); 
    } 
} 

private class CompositeAdapter extends ArrayAdapter<Model> { 
    private final List<Model> list; 
    private final Activity context; 

    public CompositeAdapter(Activity context, List<Model> list) { 
     super(context, R.layout.listviewactivitylayout, list); 
     this.context = context; 
     this.list = list; 
    } 

    private class ViewHolder{ 
     protected TextView textView1; 
     protected TextView textView2; 
     protected ImageView imageView; 
     protected CheckBox ckBox; 
    } 
    public View getView (int position, View convertView, ViewGroup parent) { 
     View view = null; 
     final ViewHolder vh; 
     if(convertView==null){ 
      LayoutInflater li = context.getLayoutInflater(); 
      view = li.inflate(R.layout.listviewactivitylayout, null); 
      vh = new ViewHolder(); 
      vh.ckBox =(CheckBox) view.findViewById(R.id.list_view_layout_checkbox); 
      vh.imageView = (ImageView) view.findViewById(R.id.listView_image_view); 
      vh.textView1 = (TextView)view.findViewById(R.id.list_view_layout_text_view1); 
      vh.textView2= (TextView)view.findViewById(R.id.list_view_text_view2); 
      view.setTag(vh); 
     } 
     else{ 
      view= convertView; 
      vh = (ViewHolder)view.getTag(); 
     } 

/** 
** sending text and images to the each of the list view 
** 
*/ 
+0

你在模拟器或手机上测试这个吗?仿真器往往会因我的经验而变得非常慢,所以如果您使用仿真器,那么您的代码可能没有任何问题。 – redbmk

+0

发布您的代码。没有它,很难说出了什么问题。 –

+0

@redEvo - > true。仿真器的速度是痛苦的...^H^H^H脖子 –

回答

4

您正在下载图片。需要在单独的线程中处理,并在解码时放置在imageView上。

这里是一个优秀的项目,将帮助你做到这一点。 Lazy load images

编辑

通过看你的代码有几件事我注意到:

第一:心不是你asigning画面任何地方。 (使用延迟加载适配器)

第二个:您的复选框选择会弄乱。你需要跟踪状态的检查位置并重绘在getView(hashmap或更好的稀疏阵列)

第三是摆脱你所使用的帮手视图。你不需要它。 (代码中的View view的市场)。

因此,如果convertView==null只使用convertView=inflate...并在末尾返回那个。

第四个作为一个有用的提示:将适配器类移动到新的类java文件。您已经保存活动参考和列表,您可以减少活动中的代码量。