1

在 ListViewAdapter 中使用 OnClickListener 时,我得到了奇怪的结果。一切正常。位置分配正确 - 0,1,2,3....16,17,18...

每个位置都有自己的带有 OnClickListener 的按钮。

现在,当我单击某个位置(例如位置 2)的按钮时,将触发两个事件,分别位于位置 2 和位置 12。如果单击第 5 个按钮,则第 5 个和第 15 个位置正在发生事件。如果是 18 号,那么 18 号和 8 号。等等。

这是为什么 ?这是代码:

 @Override
 public View getView(final int position, View cell, ViewGroup parent) {
 final Holder holder;
 if (cell == null){
 holder = new Holder();
 ........
 cell.setTag(holder);
 }
 else{
 holder = (Holder)cell.getTag();
 } 

 holder.mainButton1.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    .....
      }  
   });
  return cell;
}
4

2 回答 2

0

如您所知,重用单元的列表可优化内存使用。您可能没有删除旧的侦听器。这个错误总是在滚动之后或之后?

于 2015-09-06T19:48:09.007 回答
0

我假设在短语“事件将被触发”中,事件是对列表视图中的视图项的一些更改。
你看,listview 中的视图被回收了。
如果您的屏幕最多可以包含 10 个列表视图项,则只会创建 10 个视图。
所以,一开始你会看到 1-10 个视图,然后是 2-11,然后是 3-12,但视图的创建只是在步骤 1-10 个视图。
第 11 个元素将具有第 1 个的视图,但根据您的代码具有不同的内容(因此第 1 个和第 11 个项目共享相同的视图)
因此您对第 1 个项目进行更改,例如更改背景,然后此更改将留给第 11 个项目.

所以也许你应该禁用回收或以某种方式重置回收视图

于 2015-09-06T20:17:36.050 回答