我已经阅读了多次调用getView的问题和所有的答案。 但是,我没有find解决我的问题。
我有一个列在哪里有两个状态:读或不。 那么,我想第一次看到的项目有不同的颜色,当我滚动列表,他们改变他们的颜色“阅读状态”。
为了做到这一点,在我的适配器的getView方法中,当该项目的行被绘制时,我设置了一个字段isRead。 但问题在于:由于方法getView被多次调用,所以该字段被标记为已读,并且当列表显示在屏幕上时,就好像它已经被读取一样。
任何想法解决这个问题?
谢谢
我假设你的意思是多次请求同一视图的getView问题。
ListView这样做是因为它需要为不同的原因(滚动条的大小,布局等)
这个问题通常可以通过不使用listview中的“wrap_content”属性来避免。
除此之外,使用getView来确定是否显示视图是一个坏主意。 ListView有很多优化,每一行都会调用getView命令,因此无法知道将会发生什么情况,并且您的应用程序将开始显示奇怪的行为。
尽量避免视图和数据之间的任何关系,而不是视图的概念作为数据的显示。
相反,让listactivity中的一些工作线程或事件监听器监视列表中的哪些项目已经显示给用户,更新数据并在适配器上调用dataSetChanged。
我有同样的问题,我没有任何参考“wrap_content”在布局attirbute。 虽然这是一个古老的线程,我不知道如何解决这个问题。 因此,我通过在保存已经绘制位置的适配器中添加一个List来缓解它,如下面的代码所示。 我认为这不是马上做到这一点,但它对我有效。
public class ImageAdapter extends BaseAdapter { private Context mContext; private List<Integer> usedPositions = new ArrayList<Integer>(); public ImageAdapter(Context c, List<String> imageUrls) { mContext = c; ... } ... // create a new ImageView for each item referenced by the Adapter public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView; if (convertView == null) { imageView = new ImageView(mContext); imageView.setLayoutParams(new GridView.LayoutParams(85, 85)); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); imageView.setPadding(8, 8, 8, 8); } else { imageView = (ImageView) convertView; } if (!usedPositions.contains(position)) { // Your code to fill the imageView object content usedPositions.add(position); // holds the used position } return imageView; } }
不是你想要它的工作方式。 多次调用getView()
的原因是允许操作系统测量行,以便知道如何布置它们。 您需要将其标记为已读或单击时,或选中一个框或东西。
这是避免双重调用的一个非常简单的方法,当你不知道什么时候,这块代码将会扭曲布局。
private static List<String> usedPositions = new ArrayList<String>();
…
@Override public View getView(int position, View rowView, ViewGroup parent) { rowView = inflater.inflate(R.layout.download_listview_item, null); Log.d(LOG_TAG, "--> Position: " + position); if (!usedPositions.contains(String.valueOf(position))){ usedPositions.add(String.valueOf(position)); return rowView; }else{ usedPositions.remove(String.valueOf(position)); }
…