-1

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

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,我的代码中的问题在哪里?

4

1 回答 1

3

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

ListView组件不会为列表中的每个项目生成视图。所以,在你的情况下不会有15他们。屏幕上将有尽可能多的内容。当您滚动列表时,不再可见的旧项目将被回收。然后getView调用convertView != null并且适配器为您提供更新此回收项目视图的机会。由于您不更新视图,并且只分配了一个新的单击侦听器,因此该项目似乎有一个countof 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]));
于 2012-12-23T00:06:55.090 回答