3

我有一个带有 ViewHolder 模式的适配器。它有一个TextView 和一个ImageView。我必须对适配器中的数据库进行一些检查以显示 ImageView 与否。问题在于将 View.VISIBLE 的可见性设置为其他位置的其他 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;
    }
}

这是我的意思的屏幕: 屏幕取景器

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

4

2 回答 2

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);
  }
}
于 2015-03-15T16:13:27.493 回答
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会改变你的布局。

希望这有帮助!

于 2015-03-15T16:26:09.740 回答