-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増やしますが、このコードでは、他の2つのアイテムも+1で増やします。私のコードの問題はどこですか?

4

1 に答える 1

3

これは、データがクリック リスナーに格納されているためです。すべきではありません。

コンポーネントは、リスト内の各項目のListViewビューを生成しません。15したがって、あなたの場合にはそれらはありません。画面に収まる数だけ表示されます。リストをスクロールすると、表示されなくなった古いアイテムがリサイクルされます。次にgetViewが呼び出されconvertView != null、アダプターはこのリサイクルされたアイテム ビューを更新する機会を与えます。ビューを更新せず、新しいクリック リスナーを割り当てるだけなので、アイテムにはofがあるように見えますが、古いアイテム ビューがリサイクルされているだけです。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]));
于 2012-12-23T00:06:55.090 に答える