1

私の Android アプリケーションで参照した例をいくつか紹介します。ListActivity では、OnCreateメソッドの前に、items配列が次のように事前定義されていました。

String[] items = new String[]{"Text for Item1", "text for item2", ....};

OnCreateメソッド内で、最も簡単な方法を使用してアダプターを設定し、以下のリスト ビューを表示します。

setListAdapter( new ArrayAdapter<String>(this,
 android.R.layout.simple_list_item_checked, items));

そして、メソッドをオーバーライドしました:

@Override    
 protected void onListItemClick(ListView l, View v, int position, long id)    
{     
     CheckedTextView textview = (CheckedTextView)v;
     textview.setChecked(!textview.isChecked());
} 

上記のコードはすべて正常に機能します。ListView の各項目のチェックマークを表示し、手動でチェック/チェックを外すことができます。

の問題は次のとおりです。手でクリックするのではなく、プログラムでいくつかの項目を設定して、チェック/チェックを外し、チェックマークも変更したいと考えています。それはできますか、そしてそれを行う方法は?

事前に助けてくれてありがとう

4

1 に答える 1

0

GoogleのAndroidエンジニアであるRomainGuyは、これであなたの問題を解決できると言ったと思います。

Actually you want to use CheckedTextView with choiceMode. That's what
CheckedTextView is for. However, you should not be calling setChecked
from bindView(), but let ListView handle it. The problem was that you
were doing ListView's job a second time. You don't need listeners
(click on onlistitem), calls to setChecked, etc.

これに対する私の解決策は次のとおりです。

class MyActivity extends ListActivity { // or ListFragment

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // some initialize

        new UpdateCheckedTask().execute(); // call after setListAdapter
    }

    // some implementation

    class UpdateChecked extends AsyncTask<Void, Void, List<Integer>> {

        @Override
        protected List<Integer> doInBackground(Void... params) {
            ListAdapter listAdapter = getListAdapter();
            if (listAdapter == null) {
                return null;
            }

            List<Integer> positionList = new ArrayList<Integer>();
            for (int position = 0; position < listAdapter.getCount(); position++) {
                Item item = (Cursor) listAdapter.getItem(position); // or cursor, depends on your ListAdapter implementaiton
                boolean checked = item.isChecked() // your model
                positionList.add(position, checked);
            }
            return positionList;
        }

        @Override
        protected void onPostExecute(List<Integer> result) { // setItemChecked in UI thread
            if (result == null) {
                return;
            }

            ListView listView = getListView();
            for (Iterator<Integer> iterator = result.iterator(); iterator.hasNext();) {
                Integer position = iterator.next();
                listView.setItemChecked(position, true);
            }
        }
    }
}
于 2012-05-30T14:57:08.407 に答える