这是我用于Android自定义游标适配器的代码,用于将数据绑定到列表视图。

public class MessageAdapter extends CursorAdapter {
   private Cursor mCursor;
   private Context mContext;
   private final LayoutInflater mInflater;


    public MessageAdapter(Context context, Cursor c) {
        super(context, c);
        mInflater=LayoutInflater.from(context);
    mContext=context;
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {

        TextView mobileNo=(TextView)view.findViewById(R.id.mobileNolistitem);
        mobileNo.setText(cursor.getString(cursor.getColumnIndex(TextMeDBAdapter.KEY_MOBILENO)));

        TextView frequency=(TextView)view.findViewById(R.id.frequencylistitem);
        frequency.setText(cursor.getString(cursor.getColumnIndex(TextMeDBAdapter.KEY_FREQUENCY)));

        TextView rowid=(TextView)view.findViewById(R.id.rowidlistitem);
        rowid.setText(cursor.getString(cursor.getColumnIndex(TextMeDBAdapter.KEY_ID)));

    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        final View view=mInflater.inflate(R.layout.message_list_item,parent,false); 
        return view;
    }

}


我知道还有另一种有效的方法重用实例化的列表项。有人可以告诉我怎么做吗?

评论

我仍在使用Android应用程序。您指的是什么列表项?

我指的是列表中的列表项。请看Romain家伙的这段视频,以制作一个优质高效的列表视图youtube.com/watch?v=N6YdwzAvwOA,尽管它很长。

#1 楼

这正是*应该使用CursorAdapter的方式。我确定您是在覆盖getView()BaseAdapter方法时所提到的“回收”视图。因此,仅实现CursorAdapternewView()即可充分利用您所要求的View回收。 />因此,您看到,该方法尝试通过检查bindView()来回收传入的View。如果成功,它将使用该视图并简单地调用CursorAdapter.getView()对其进行适当设置。如果convertView == null为空,它将调用bindView()创建视图,然后调用convertView进行设置。这是SE上罕见的例子之一,我可以说“您做对了!”


但是对于nitpick来说,实际上没有理由在其中保留对您上下文的引用。 newView()-您不会在任何地方使用它,并且维护对Context的引用可能导致内存泄漏,并最终导致世界末日。


评论


\ $ \ begingroup \ $
您还应该使用一件事-使用ViewHolder保存指向所有视图的指针,以免每次都找不到ViewById。
\ $ \ endgroup \ $
–paiNie
2012年1月6日20:44

#2 楼

使用SimpleCursorAdapter甚至会更容易,但对于CursorAdapter则使用完全相同的原理。通过将数据存储在views标记中,可以在视图上缓存对findViewById()的调用,甚至可以在光标上缓存对getColumnIndex的调用。通过ListView的缓慢渲染来停止使用此代码。

评论


\ $ \ begingroup \ $
ViewHolder是一个概念,它花了一点内存,但加快了视图的绑定速度。 @Tom Curran:尽管我不明白为什么要获取并保留每个视图的列索引,但是您应该在构造函数中获取它并放入两个最终字段中!
\ $ \ endgroup \ $
–雪花先生
2012年5月31日12:31