Установить флажок ListView как отмеченный / не отмеченный программой в Android ListActivity

1

Пары примера, которые я упомянул для своего приложения для Android. В ListActivity перед методом OnCreate массив элементов был предварительно определен как

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 может отображаться и устанавливать флажок/флажок вручную.

МОЯ ПРОБЛЕМА: Я хочу установить некоторые элементы по программе, а не по щелчку вручную, для проверки/снятия флажка, а также галочку. Можно ли это сделать и как это сделать?

Спасибо за помощь в продвижении

Теги:
android-listview

1 ответ

0

Я думаю, что Ромен Гай, который является инженером Android в Google, в этом может решить ваш пролбэм:

Actually you want to use CheckedTextView with choiceMode. That 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 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);
            }
        }
    }
}
  • 0
    Спасибо @Gasol! Однако я не могу следовать решению. Поскольку метод setListAdapter (), который я использовал в ListView, является самым простым способом. Чтобы перейти к использованию метода setItemChecked () в предоставленном виджете AbsListView, может сделать мое приложение более сложным. Это единственный способ?
  • 0
    @cmh Нет способа сделать это в ListAdapter, см. мой обновленный ответ.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню