Android: неверный элемент проверен при фильтрации списка - PullRequest
3 голосов
/ 24 октября 2011

Я страдаю от той же проблемы, что и этот вопрос: Неправильный элемент проверен при фильтрации ListView в Android

Как предложено в предыдущем вопросе, у меня есть Hashset, содержащий все выбранные идентификаторы, но я не могу понять, как его использовать, когда курсор повторно заполняет отмеченные элементы.

Моя проблема носит исключительно косметический характер, например:

  • "Facebook" находитсяна 5-й позиции в нефильтрованном списке.
  • Пользователь выполнил поиск по запросу "face", в первой позиции в отфильтрованном списке появляется только "Facebook".
  • Пользователь проверяет "Facebook" в качестве выбранного ивозвращается к нефильтрованному списку.
  • Проверенный элемент - это 1-й элемент в списке, а не «Facebook» (5-й).

Примечание: За исключением этой проблемы, все остальное прекрасно работает.Например, «delete» удалит нужные элементы, потому что я использую selectedIds для этого (даже если отмеченные элементы неверны).

Один щелчок по элементу списка:

OnItemClickListener mOnItemClickListener = new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {

                //gets the Bookmark ID of selected position
                    Cursor cursor = (Cursor)parent.getItemAtPosition(position);
                    String bookmarkID = cursor.getString(0);

                    boolean currentlyChecked = checkedStates.get(position);
                    checkedStates.set(position, !currentlyChecked);

                    if (!selectedIds.contains(bookmarkID)) {

                        selectedIds.add(bookmarkID);
                        selectedLines.add(position);

                    } else {

                        selectedIds.remove(bookmarkID);
                        selectedLines.remove(position);


                        }

            }
        };

Внутри курсора: - в этом проблема.

Это заполняет проверенные элементы - проблема в том, что он делает это по позиции (pos) и чтобыла правильная позиция элемента в отфильтрованном списке, а не его позиция в нефильтрованном списке, что привело к неправильно помеченному элементу.

CheckedTextView markedItem = (CheckedTextView) row.findViewById(R.id.btitle);
markedItem.setChecked(checkedStates.get(pos));

Буду признателен за любую помощь!

Ответы [ 3 ]

1 голос
/ 24 октября 2011

Может быть, просто ListView не знает, что набор данных изменился?Вызовите notifyDatSetChanged () на вашем адаптере, чтобы сообщить об этом.

my_adapter.notifyDataSetChanged();

Это приведет к перерисовке списка с обновленными данными.

0 голосов
/ 04 января 2014

Это мое решение:

  • Чтобы выбрать элемент в виде списка после фильтрации, в начале я получил неправильный элемент, потому что использовал это:

    ItemData item = listItems.get(position);
    

Правильный путь должен быть таким:

    ItemData item = (ItemData) parent.getItemAtPosition(position);
  • Чтобы удалить элемент после фильтрации, я пробовал это:

    for(int i=0;i<listItems.size();i++){
        if(listItems.get(i).getItemID() == item.getItemID()){
            listItems.remove(i);
            myAdapter.notifyDataSetChanged();
       }
    }
    

Но это не сработало из-за моего нестандартного адаптера.В моем настраиваемом адаптере для использования фильтра у меня есть два listItems:

    ArrayList<ItemData> listItemsToShow = new ArrayList< ItemData >();
    ArrayList< ItemData > listItemsBackup = new ArrayList< ItemData >();

Итак, чтобы удалить элемент, я добавил новый метод в свой настраиваемый адаптер:

    public void deleteItem(String itemID) {
    for (int i = 0; i < listItemsToShow.size(); i++) {
        if (listItemsToShow.get(i).getId().equals(itemID)) {
            listItemsToShow.remove(i);
            break;
        }
    }

    for (int i = 0; i < listItemsBackup.size(); i++) {
        if (listItemsBackup.get(i).getId().equals(itemID)) {
            listItemsBackup.remove(i);
            break;
        }
    }

Наконец, чтобы удалитьэлемент в виде списка:

    subjectBaseAdapter.deleteItem(subject.getId());
    subjectBaseAdapter.notifyDataSetChanged();

Надеюсь, эта помощь

0 голосов
/ 25 октября 2011

Решил проблему. Как предложено в вопросе, который я добавил к моему, когда вы устанавливаете флажки, другой List / Hashset должен определить, отмечать ли элемент как отмеченный или нет.

Используя мой код:

//first you will need to get the current item ID
String bookmarkID = cursor.getString(0);

//Then, check if the current ID is in the selectedIds hash/list
//If true - mark current item view as checked, else - uncheck.
        CheckedTextView markedItem = (CheckedTextView) row.findViewById(R.id.btitle);
        if (selectedIds.contains(new String(bookmarkID))) {
            markedItem.setChecked(true);

        } else {
            markedItem.setChecked(false);
}

Очень надеюсь, что это кому-нибудь поможет! :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...