重复ViewHolder ImageView setVisibility(ViewHolder ImageView setVisibility is repeated)

编程入门 行业动态 更新时间:2024-10-28 12:22:46
重复ViewHolder ImageView setVisibility(ViewHolder ImageView setVisibility is repeated)

我有一个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; } }

这是我的意思的屏幕:

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

I have an adapter with the ViewHolder pattern. It has a TextView and an ImageView. I have to do some check with database in the adapter to show the ImageView or not. The problem is that is set the visibility to View.VISIBLE also to other ImageView in other positions. I'm sure that my database doesn't contain those data related to those imageview, but only to the one that is correctly set.

Here is my code (I deleted the part of the textview's set because it worked well):

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; } }

And here is a screen of what i mean:

Only the imageview with circle has to be added, not the one with X above. If i scroll down the listview, the viewholder set the visibility to visible also to other imageviews that aren't in my database.

最满意答案

由于它的回收机制,它是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); } }

it is the normal behavior of the ListView, due to its recycling mechanism. Reset the ImageView's visibility if the condition is not met

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); } }

更多推荐

本文发布于:2023-08-03 19:34:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1396346.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:ImageView   ViewHolder   repeated   setVisibility

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!