0

チェックボックスのあるアクティビティがあり、その下にリストビューに各連絡先のチェックボックスが入力されている連絡先のリストがあります。私の質問に起因する2つの大きな問題があります。

  1. chkbox_foo はリストビューの外側にあり、chk_bar は内側にあります。chk_foo は機能しますが、初期化後に chk_bar に関連するものがあると、アプリがクラッシュします。また、chkbox_bar の setOnCheckedChangeListener を作成すると、アプリもクラッシュします。なぜこれが起こっているのか、どうすれば修正できるのか誰にもわかりませんか?

    btn_foo = (Button) findViewById(R.id.btn_foo);
    barList = (ListView) findViewById(R.id.lv_barList);
    chk_foo = (CheckBox) findViewById(R.id.cb_foo);
    chk_bar = (CheckBox) findViewById(R.id.cb_bar);
    
    // set checkboxes state as false at beginning
    chkboxAllVisible = false;
    chkboxSingleChk = false;
    
    chk_foo.setChecked(chkboxAllVisible);
    chk_bar.setChecked(chkboxChk);  <---App crashes here
    
    // Outside of listview checkbox 
    chk_foo.setOnCheckedChangeListener(new OnCheckedChangeListener(){
    
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {
            Log.d(TAG, "checkbox changed " + isChecked);
            if(isChecked){
                chkboxAllVisible = true;
                chk_bar.setChecked(isChecked); <---app crashes here too
            } 
        }
    });
     // Outside of listview checkbox 
    chk_bar.setOnCheckedChangeListen... <---app crashes here also
    
4

2 に答える 2

1

ユーザーが「マスター」チェックボックスをクリックすると、ListViewにバインドされているリストを反復処理する必要があります。次に、各行に個別にアクセスすることで、各行のチェックボックスをマークできます。

特定の例が必要な場合は、ListViewのコードを投稿してください。

于 2012-05-09T18:28:29.617 に答える
0

chk_bar はおそらく null です。チェックボックスがリストビュー内にある場合、メイン レイアウトで findViewByID を呼び出すことはできません。それが格納/含まれているレイアウトで呼び出す必要があります。これはリストビュー項目になります。

そうは言っても、あなたはそれをする必要はありません。チェックボックスを使用している連絡先がある場合は、何らかのカスタム アダプターを使用していると思いますか? もしそうなら、これは簡単です。また、アイテム/連絡先がチェックされているかどうかを追跡していると仮定しています(チェックされていない場合は、とにかくそれを実装する必要があります。以下のチュートリアルを参照してください)

カスタム アダプターの getView で、ビューの生成中にデータ オブジェクトを確認する必要があります。IsChecked 値が true の場合は、チェックボックスをオンにします。

public View getView(int position, View convertView, ViewGroup parent)
{
    //Inflate your view
    //View listViewLayout = ...

    //Here is where you get the reference to the checkbox
    Checkbox chkBox = (CheckBox)listViewLayout.findViewById(R.id.cb_bar);

    //Get the data object from whatever your source is (maybe an array list?)
    SomeObj curObj = (SomeObj)listOfItems.get(position);

    chkBox.setChecked(curObj.IsChecked);
}

Listview 用のカスタム アダプターを実装する方法に関する完全なチュートリアルは次のとおりです

それが機能したら、あとは簡単です。

ユーザーがマスター チェックボックスをクリックすると、次のようになります。

  1. アイテムのリストを再生成しますが、すべてのチェックボックスの値を true に強制します。
  2. adapter.notifyDataSetChanged() を呼び出します

notifyDataSetChanged() を呼び出すと、リストビュー自体が再描画されます (ソース項目が実際に変更されたと思われる場合。これを参照してください: notifyDataSetChanged example )

リストビューを再生成すると、渡されたソースアイテムを反復処理し、リストを再生成してすべてのアイテムを「IsChecked」(または変数名が何であれ)としてマークしたため、各チェックボックスをオンにします。

于 2012-05-09T19:33:59.163 に答える