0

ListViewカスタムレイアウトに5つの子Viewオブジェクト(4TextViewと1 )がCheckBoxあるカスタムレイアウトを使用するがあります。ただし、TextViewsバインドされてCheckBoxいるのは、データベースに対応するフィールドがありません。の目的は、CheckBox表示されているアイテムのどれを「次のステップ」で処理したいかを識別することです。私はカスタムViewBinderを使用してテキスト値を正しく割り当てています(DBからの値の一部が日付などであるため)。

ユーザーインターフェイスの一部は、リスト内の各アイテムのステータスを切り替えるために使用する「すべて」、「なし」、および「反転」の3つのボタンです。たとえば、[すべて]ボタンの場合、次のコードを使用してこれを実行します(これは正しくないことがわかっています。これを含めて、実行しようとしていることを示します)。

ListAdapter la = getListAdapter();
ListView lv = getListView();
int iCount = la.getCount();
for(int i=0; i<iCount; i++)
{
    View vv = lv.getChildAt(i);
    CheckBox cb = (CheckBox) vv.findViewById(R.id.ledgerItemCheckBox);
    cb.setChecked(true);
}

これは、リスト内のアイテムの数がリストサイズを超えない限り正常に機能し、すべてのアイテムが常に表示されます。ただし、その数を超えると、'getChildAt'関数がnullを返すことがあります。これは、(正しく理解していれば)リスト内のすべてのアイテムを返すことを意図しておらず、表示されているアイテムのみを返すことを意味するためNullPointerExceptionです。

CheckBoxビューが表示されていない場合でも、すべてのビューに適切に設定するにはどうすればよいですか?

4

1 に答える 1

1

TextViewデータの1つへの疑似バインディングを作成し、チェックボックスのバックエンドとしてブールオブジェクトのArrayListを作成します。ArrayListは、アプリケーションに最適なデータ構造ではない場合があることに注意してください。ArrayListに、カーソルのデータセットの対応する位置の初期値に設定されたブール値を入力します。バインドするときは、バックエンドデータとしてArrayListを使用します。all、none、またはinvertを選択した場合は、ArrayListのブールオブジェクトを更新してから、SimpleCursorAdapterでnotifyDataSetChanged()を呼び出します。

さらに、問題の残りの半分は、はい、チェックボックスにonClickListenerを使用しますが、同じリスナーを使用し、それぞれに新しいオブジェクトを作成しないでください。getPositionForView()メソッドを使用して、位置を取得し、基になるデータを更新します。

于 2011-09-11T02:05:28.410 に答える