如何在自定义CursorAdapter中保留每行的数据

时间:2015-03-27 21:58:08

标签: android

我使用自定义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();
            }
        });

请帮助我,非常感谢:)。

1 个答案:

答案 0 :(得分:1)

ViewHolder的目的是让您快速访问视图中的子视图,这样您只能在创建视图时调用findViewById()

您正在将模型值(从光标)分配到ViewHolder中的newView()。这会导致问题,因为当您的视图被回收时,newView()将不会被调用,只会被调用bindView()。因此,您必须在bindView()内阅读光标数据。

您问,如何保留自定义CursorAdapter中每行的数据?数据已存储在游标中,因此您只需将数据从游标移动到视图中即可。 ViewHolder只是帮助您设置视图,因此访问TextView等内容非常快[与findViewById()相比]

您应该从ViewHolder删除所有列字段,并将光标数据值分配到TextView中的bindView()等。

查看更多教程,尝试了解有关视图回收在ListView中的工作原理的更多信息。