0

私はListViewセットを持っていますonItemClickListener

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    // not important
    if (!found) {
        activity.addSelectedIngredient(ingred);
        parent.getChildAt(position).setBackgroundColor(Color.parseColor("#ff99FE80"));
    } else {
        activity.removeSelectedIngredient(ingred);
        parent.getChildAt(position).setBackgroundColor(Color.WHITE);
    }
}

親が選択したNullPointerException位置(例:15)に子を持っていない場合にスローされます。なんで?彼女がすでに要素を選択している場合、その要素が存在しない可能性はどのようにありますか?

編集:

if (!found) {
    activity.addSelectedIngredient(ingred);
    view.setBackgroundColor(Color.parseColor("#ff99FE80"));
} else {
    activity.removeSelectedIngredient(ingred);
    view.setBackgroundColor(Color.WHITE);
}
4

2 に答える 2

3

getChildAtは、listViewの子を返します。getChildAtの位置は、アダプター内の位置と同じではありません。ビューは再利用されているため、アダプタには1000個のアイテムを、リストビューには複数のchildViewのみを含めることができます。

私はあなたが変えるべきだと思います

parent.getChildAt(position).setBackgroundColor(Color.WHITE);

view.setBackgroundColor(Color.WHITE);
于 2013-01-24T20:49:02.893 に答える
1

試す、

if (!found) {
    activity.addSelectedIngredient(ingred);
    view.setBackgroundColor(Color.parseColor("#ff99FE80"));
} else {
    activity.removeSelectedIngredient(ingred);
    view.setBackgroundColor(Color.WHITE);
}

説明:つまり、親はそのビューを持っていますが、索引付けはリセットされています。したがって、どのインデックスが要素に割り当てられているかは明らかにわかりません。これは、リストビューが要素をキャッシュしたキャッシュによって異なります。したがって、子を取得する代わりに、ビューを使用する必要があります。これは、クリックしたアイテムとまったく同じです。

于 2013-01-24T20:48:35.623 に答える