我使用自定义CursorAdapter和ViewHolder模式,我想知道如何保存每行的数据。
例如,保持收藏夹值(true或false)
我的ViewHolder:
private static class ViewHolder {
int column_id, column_gtext, column_isfav, column_isread;
TextView tvText;
ImageView btnFavorites;
boolean changeDefaultFav; // if btnFav clicked its change
}
我的新视图:
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
//return null;
View view = LayoutInflater.from(context).inflate(R.layout.goftar_lr_default, parent, false);
ViewHolder holder = new ViewHolder();
holder.tvText = (TextView)view.findViewById(R.id.goftar_text);
holder.btnFavorites = (ImageView)view.findViewById(R.id.bg_fav);
holder.tvText.setTypeface(font);
holder.column_id = cursor.getColumnIndexOrThrow("_id");
holder.column_gtext = cursor.getColumnIndexOrThrow("gtext");
holder.column_isfav = cursor.getColumnIndexOrThrow("isfav");
holder.column_isread = cursor.getColumnIndexOrThrow("isread");
holder.changeDefaultFav = false;
holder.tvGoftarText.setText(holder.tvGoftarText.getText() + "\n" + "Append NewView");
view.setTag(holder);
return view;
}
我的bindView:
@Override
public void bindView(final View view, Context context, final Cursor cursor) {
final ViewHolder holder = (ViewHolder)view.getTag();
holder.tvText.setText(cursor.getString(holder.column_gtext));
final int position = cursor.getPosition();
holder.btnFavorites.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int newValue = 1;
if(holder.changeDefaultFav == true) {
holder.changeDefaultFav = false;
newValue = 0;
}
cursor.moveToPosition(position);
dh.openDatabase();
dh.updateFavorites(cursor.getInt(holder.column_id), newValue);
dh.close();
}
});
请帮助我,非常感谢:)。
答案 0 :(得分:1)
ViewHolder
的目的是让您快速访问视图中的子视图,这样您只能在创建视图时调用findViewById()
。
您正在将模型值(从光标)分配到ViewHolder
中的newView()
。这会导致问题,因为当您的视图被回收时,newView()
将不会被调用,只会被调用bindView()
。因此,您必须在bindView()
内阅读光标数据。
您问,如何保留自定义CursorAdapter中每行的数据?数据已存储在游标中,因此您只需将数据从游标移动到视图中即可。 ViewHolder
只是帮助您设置视图,因此访问TextView
等内容非常快[与findViewById()
相比]
您应该从ViewHolder
删除所有列字段,并将光标数据值分配到TextView
中的bindView()
等。
查看更多教程,尝试了解有关视图回收在ListView
中的工作原理的更多信息。