2

CheckedTextViews のリスト内の特定の行にプログラムでアクセスして、テキスト ボックスの状態を変更することは可能ですか?

私のプログラムには、ユーザーが押すと状態を切り替えることができるいくつかの CheckedTextViews を持つリストビューがあります。

ユーザーがアクティビティを離れたときにチェックボックスの状態を保存したいので、onPause メソッドに次のように記述します。

public void onPause(){
         super.onPause();
         SparseBooleanArray positions;
         positions = listView.getCheckedItemPositions();
         ListAdapter items = listView.getAdapter();
         int j = items.getCount();

         ArrayList<Long> ids = new ArrayList<Long>();
         for (int k =0; k < j;k++){
             if(positions.get(k)==true){
                 ids.add(items.getItemId(k));   
             }
         } 
         this.application.getServicesHelper().open();
         this.application.getServicesHelper().storeServices(ids,visit_id);
         this.application.getServicesHelper().close();
     }

これは非常に単純にリスト ビューを反復し、チェックされた項目を ArrayList に追加してから、その ID のリストをデータベースに保存します。

私の問題は、ユーザーがそのアクティビティに戻ったときにリストをリセットしようとすることです。

これまでの onStart メソッドで、データベースからチェック済みのアイテムを呼び出しましたが、リストビュー要素に返された ID をマーチする方法がわかりません。次のようなことができますか:

listView.getElementById(id_from_database).setChecked?

getElementById を使用できないことはわかっていますが、意味を示すためにここにあります

前もって感謝します

ケビン

4

2 に答える 2

1

あなたは呼び出すことができます

listView.setItemChecked(int position, boolean value)
于 2010-08-24T14:00:23.370 に答える
1

これは私がやったことです..しかし、それは完全なハックのようです. 基本的に、ダブル for ループを設定する必要があります。1 つはリスト要素を反復するためのもので、もう 1 つはチェック リストの状態を取得したカーソルを反復するためのものです (状態が最後だったときにチェックされた要素の ID の単純な配列)。保存されました)

私の外側の for は、チェック済みとして設定される ID のリストのループに対して各 ID をチェックするリスト要素を反復処理します。それらが互いに等しい場合は、その項目をオンに設定します。

    // mAdapter is contains the list of elements I want to display in my list. 
ServiceList.this.setListAdapter(mAdapter);

        // Getting a list of element Ids that had been previously checked by the user. getState is a function I have defined in my ServicesAdapter file.

    Cursor state = ServiceList.this.application.getServicesHelper().getState(visit_id);
    int checks = state.getCount();
    int check_service;               
    int c = mAdapter.getCount();
    if(checks>0){
        state.moveToFirst(); 
        for (int i=0; i<checks; i++) { 
            // set check_service = the next id to be checked
            check_service = state.getInt(0);
            for(int p=0;p<c;p++){

                if(mAdapter.getItemId(p)==check_service){
                        // we have found an id that needs to be checked. 'p' corresponds to its position in my listView
                    listView.setItemChecked(p,true);
                    break;
                }
            }
            state.moveToNext(); 
        } 
    }
    ServiceList.this.application.getServicesHelper().close();

これを達成するためのより効率的な方法があることを教えてください!!

ありがとう

ケビン

于 2010-08-24T16:04:25.670 に答える