5

たくさんの数字(重み)を表示するListActivityに取り組んでいます。ListViewの特定の行の背景を変更したいのですが。これを行うために、ArrayAdapterクラスのカスタム実装を作成し、getViewメソッドをオーバーライドしました。アダプターは番号のリストを受け入れ、番号20の行の背景を黄色に設定します(簡単にするため)。

    public class WeightListAdapter extends ArrayAdapter<Integer> {

    private List<Integer> mWeights;

    public WeightListAdapter(Context context, List<Integer> objects) {
        super(context, android.R.layout.simple_list_item_1, objects);

        mWeights = objects;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = super.getView(position, convertView, parent);

        int itemWeight = mWeights.get(position);
        if (itemWeight == 20) {
            v.setBackgroundColor(Color.YELLOW);
        }
        return v;
    }

}

問題は、番号20の行だけでなく、番号0の行(最初の行)も黄色になることです。これがなぜそうなのかわかりません。

getViewメソッドで何か間違ったことをしていますか(スーパーメソッドの呼び出しなど)?実装の私の理由は次のとおりです。返されるビューはすべて同じである必要があります(そのため、スーパーメソッドを呼び出しています)。if基準に適合するビューのみを変更する必要があります。

ご協力いただきありがとうございます!

4

3 に答える 3

3

これを適切に行う方法を見つけるために、少し調査を行いました。

これが適切な方法だと思うので、同じ問題を抱えている他の人のためにこれを書き留めています。私が間違っている場合、またはこのソリューションに目に見えない欠陥がある場合はお知らせください。

public class WeightListAdapter extends ArrayAdapter<Integer> {

  private static final int TYPE_COUNT = 2;
  private static final int TYPE_ITEM_COLORED = 1;
  private static final int TYPE_ITEM_NORMAL = 0;

  public WeightListAdapter(Context context, List<Integer> objects) {
    super(context, android.R.layout.simple_list_item_1, objects);
  }

  @Override
  public int getViewTypeCount() {
    return TYPE_COUNT;
  }

  @Override
  public int getItemViewType(int position) {
    int item = getItem(position);

    return (item == 30) ? TYPE_ITEM_COLORED : TYPE_ITEM_NORMAL;
  }

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    View v = super.getView(position, convertView, parent);
    switch (getItemViewType(position)) {
    case TYPE_ITEM_COLORED:
      v.setBackgroundColor(Color.YELLOW);
      break;
    case TYPE_ITEM_NORMAL:
      break;
    }

    return v;

  }
}

どうやら、基本クラスは既に正しいものconvertViewがメソッドに渡されることを保証するロジックを実装しています (およびメソッドgetViewに基づいて)。getViewItemTypegetViewTypeCount

于 2010-10-25T22:22:54.890 に答える
1

再利用する場合は、itemWeight が 20 でないかどうかのチェックをもう 1 つ追加してみませんか? 等しくない場合は、背景を通常に戻します。

于 2010-10-24T17:14:57.047 に答える
1

Android のビューは、各行のコンポーネントを再利用することです。私もこの問題を抱えています。

于 2010-10-24T14:35:11.497 に答える