为什么Android listView onitemclicklistener更新列表中的多个项目?

时间:2012-12-22 23:23:53

标签: android listview onitemclicklistener

我使用视图持有者来保存列表视图中的视图,以及她的代码

public class MyAdapter extends BaseAdapter{
Context context;
private LayoutInflater mInflater;
 ViewHolder holder;

public MyAdapter(Context context/*,List<Music> list*//*,ListView listView*/){
    this.context = context;
}
@Override
public int getCount() {
    return 15;
}

@Override
public Object getItem(int position) {
    return position;
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    int p = 0;
    View view = null;
    if(convertView == null){
        holder= new ViewHolder();
        convertView = View.inflate(context, R.layout.item, null);   
        holder.set = (TextView)convertView.findViewById(R.id.set);
        holder.button = (Button)convertView.findViewById(R.id.button1);
        convertView.setTag(holder);
    }
    else{

        holder = (ViewHolder) convertView.getTag();
    }
holder.button.setOnClickListener(new lis(position,holder));

    return convertView;
}
class lis implements OnClickListener{
    private int p;
    private ViewHolder holder;



    public lis(int p,ViewHolder holder){
    this.p = p;
    this.holder = holder;

}
int counter=0;
    @Override
    public void onClick(View v) {
        p++;
        counter++;
        Log.e("counter ",String.valueOf(counter));
        holder.set.setText("" + counter);
    }

}
  static class ViewHolder{
    Button button = null;
    TextView set = null;
}

}

但是当我点击列表中的某个项目时,例如我点击第1项将其值增加+1,但在此代码中它还会增加其他两个项目+1,因为我的问题在哪里码?

1 个答案:

答案 0 :(得分:3)

这是因为您将数据存储在点击侦听器中。 它不应该。

ListView组件不会为列表中的每个项生成视图。因此,在您的案例中不会有15个。屏幕上可以容纳多少。滚动列表时,旧的项目(不再可见)将被回收。然后使用getView调用convertView != null,并且适配器为您提供更新此回收项视图的机会。由于您不更新视图,并且只分配新的点击监听器,因此项似乎count1,但它只是旧的项目视图回收

此外,更新回收视图对您的情况无济于事,因为项目数据是在您的点击监听器中声明的。将其移到外面,例如在适配器中:

private int[] counters = new int[15];

然后,在点击监听器中,按其位置访问相关项目的计数:

@Override
public void onClick(View v) {
    counters[p]++;
    int count = counters[p];
    holder.set.setText(String.valueOf(count));
}

最后,在getView()中,始终更新项目视图以反映当前计数:

holder.button.setOnClickListener(new lis(position,holder));
holder.set.setText(String.valueOf(counters[position]));