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;
}
}
我知道还有另一种有效的方法重用实例化的列表项。有人可以告诉我怎么做吗?
#1 楼
这正是*应该使用CursorAdapter
的方式。我确定您是在覆盖getView()
的BaseAdapter
方法时所提到的“回收”视图。因此,仅实现CursorAdapter
和newView()
即可充分利用您所要求的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
评论
我仍在使用Android应用程序。您指的是什么列表项?我指的是列表中的列表项。请看Romain家伙的这段视频,以制作一个优质高效的列表视图youtube.com/watch?v=N6YdwzAvwOA,尽管它很长。