我使用视图持有者来保存列表视图中的视图,以及她的代码
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,因为我的问题在哪里码?
答案 0 :(得分:3)
这是因为您将数据存储在点击侦听器中。 它不应该。
ListView
组件不会为列表中的每个项生成视图。因此,在您的案例中不会有15
个。屏幕上可以容纳多少。滚动列表时,旧的项目(不再可见)将被回收。然后使用getView
调用convertView != null
,并且适配器为您提供更新此回收项视图的机会。由于您不更新视图,并且只分配新的点击监听器,因此项似乎的count
为1
,但它只是旧的项目视图回收
此外,更新回收视图对您的情况无济于事,因为项目数据是在您的点击监听器中声明的。将其移到外面,例如在适配器中:
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]));