0

リストビューのさまざまな側面を理解するのに長い間問題がありました。ここに 1 つの問題があります。回避策は知っていますが、なぜそれが起こるのかを理解したいです。

ArrayAdapter を拡張するクラスの getView メソッドにあります。

私はいくつかのリストアイテムを持っており、それぞれに残すべき画像があります。いくつかの listItems については、右側に情報イメージがあります。これに、アラート ダイアログを起動するリスナーを追加しました。アプリに 15 個のリスト項目のうち 2 個の情報画像があるとしましょう。しかし、下にスクロールしてから上にスクロールすると、他のすべてのリスト項目にこの情報画像が入力されます。すべてのビューに imageHolder を使用しているにもかかわらず、なぜこれが起こるのでしょうか?

public View getView(int position, View convertView, ViewGroup parent) {

    final ViewGroup theParent = parent;
    final int thePosition = position;
    View view = null;
    ViewHolder holder;

    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.main, parent, false);
        holder = new ViewHolder();
        holder.textView = (TextView) view.findViewById(R.id.label);
        holder.imageView = (ImageView) view.findViewById(R.id.icon);
        holder.infoView = (ImageView) view.findViewById(R.id.imageIcon);
        view.setTag(holder);
    }
    else {
        view = convertView;
        holder = (ViewHolder) view.getTag();
    }

    holder.textView.setText(values[position]);

    switch (thePosition) {
        case 0:
            holder.imageView.setImageResource(R.drawable.conv);
            break;
        case 1:
            holder.imageView.setImageResource(R.drawable.counting);
            break;
        case 2:
            holder.imageView.setImageResource(R.drawable.travelling);
            break;
        case 3:
            holder.imageView.setImageResource(R.drawable.love);
            break;
        case 4:
            holder.imageView.setImageResource(R.drawable.dating);
            holder.infoView.setImageResource(R.drawable.info);
            break;
        case 5:
            holder.imageView.setImageResource(R.drawable.restaurant);
            holder.infoView.setImageResource(R.drawable.info);
            break;
        case 6:
            holder.imageView.setImageResource(R.drawable.thaidishes);
            break;  
        case 7:
            holder.imageView.setImageResource(R.drawable.time_);
            break;
        case 8:
            holder.imageView.setImageResource(R.drawable.time2);
            break;  
        case 9:
            holder.imageView.setImageResource(R.drawable.colours);
            break;
        case 10:
            holder.imageView.setImageResource(R.drawable.weather);
            break;
        case 11:
            holder.imageView.setImageResource(R.drawable.directions);
            break;
        case 12:
            holder.imageView.setImageResource(R.drawable.emergency);
            break;
        case 13:
            holder.imageView.setImageResource(R.drawable.cities);
            break;
    }

    return view;
}

以前、checbox-items で同様の問題がありました。ビューの外にスクロールすると、チェックされた項目がチェックされませんでした。チェックした項目をブール値として配列リストに保存することでこれを解決しました。これに似た解決策はありますか?

私が言及した回避策は、imageResourse をゼロ (0) に設定することです。

4

1 に答える 1

1

getView メソッドによって返されたビューは、リソースの使用を最小限に抑えるために再利用されます。適切な情報画像を含むビューの 1 つがリサイクルされた場合、それはそのまま残ります。

これは意図したとおりに機能します。これに対する解決策は、すでに発見したように、setImageResource(0) または setVisibility(View.GONE) または同様のものを使用して、その正しい情報画像の状態をリセットすることです。

これは、チェックボックスの状態などにも当てはまります。

于 2013-07-04T15:36:08.853 に答える