重复ViewHolder ImageView setVisibility

时间:2015-03-15 16:10:20

标签: android listview adapter android-viewholder

我有一个ViewHolder模式的适配器。它有一个TextView和一个ImageView。我必须在适配器中检查数据库以显示ImageView。 问题是将View.VISIBLE的可见性设置为其他位置的其他ImageView。我确定我的数据库不包含与这些imageview相关的数据,但仅包含正确设置的数据。

这是我的代码(我删除了textview的一部分,因为它运行良好):

public class ChaptersAdapter extends ArrayAdapter<List> {
    private final Context context;
    private final ArrayList<List> list;
    ViewHolder viewHolder;
    DatabaseHandler dh;
    SQLiteDatabase db;
    ArrayList<BookmarksHandler> bookmarksAL;

    public ChaptersAdapter(Context context, ArrayList<List> list) {
        super(context, R.layout.chaptersadapter, list);

        this.context = context;
        this.list = list;
    }

    static class ViewHolder{
        TextView titolo;
        ImageView imageView;
    }

    @Override
    public View getView(int position, View rowView, ViewGroup parent) {
        dh = new DatabaseHandler(context);
        db = dh.getWritableDatabase();
        bookmarksAL = dh.getAllBookmarks(db);

        List chapters = getItem(position);

        if(rowView==null){
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            rowView = inflater.inflate(R.layout.chaptersadapter, parent, false);

            viewHolder = new ViewHolder();

            viewHolder.titolo = (TextView) rowView.findViewById(R.id.textView);
            viewHolder.imageView = (ImageView) rowView.findViewById(R.id.imageView);

            rowView.setTag(viewHolder);
        }
        else {
            viewHolder = (ViewHolder) rowView.getTag();
        }

        for(int i = 0; i<bookmarksAL.size(); i++){
            if(bookmarksAL.get(i).getId_chapter().equals((String)chapters.get(3))){
                viewHolder.imageView.setVisibility(View.VISIBLE);
            }
        }


        return rowView;
    }
}

这是我的意思的屏幕: screen viewholder

只需要添加带圆圈的图像视图,而不是上面带有X的图像视图。如果我向下滚动列表视图,则视图持有者将可见性设置为对我的数据库中不包含的其他图像视图也可见。

2 个答案:

答案 0 :(得分:4)

由于其回收机制,它是ListView的正常行为。如果不满足条件,请重置ImageView的可见性

for(int i = 0; i<bookmarksAL.size(); i++){            
  if(bookmarksAL.get(i).getId_chapter().equals((String)chapters.get(3)))  {            
      viewHolder.imageView.setVisibility(View.VISIBLE);
      break;
  } else {
      viewHolder.imageView.setVisibility(View.GONE);
  }
}

答案 1 :(得分:0)

对于其他不可见的项目,您还需要设置如下:

  for(int i = 0; i<bookmarksAL.size(); i++){
        if(bookmarksAL.get(i).getId_chapter().equals((String)chapters.get(3))){
            viewHolder.imageView.setVisibility(View.VISIBLE);
        }
        else
            viewHolder.imageView.setVisibility(View.INVISIBLE);
    }

最好设置INVISIBLE,因为GONE会更改您的布局。

希望这有帮助!