Как получить каждый пункт меню из списка по позиции? - PullRequest
0 голосов
/ 22 сентября 2011

Допустим, список состоит из 4 пунктов, как я могу получить представление от каждого пункта меню списка по позиции?

Ответы [ 2 ]

1 голос
/ 22 сентября 2011

К сожалению, элементы в ListView, как правило, являются только видимыми.Вместо этого вы должны выполнить итерацию ListAdapter.

Например, в некоторых моих кодах у меня есть следующее:

    SimpleCursorAdapter adapter = (SimpleCursorAdapter) this.getListAdapter();
    int iNum = adapter.getCount();
    for(int i=0; i<iNum; i++) 
    {
        Cursor c = (Cursor) adapter.getItem(i);

        // Now you can pull data from the cursor object,
        // if that's what you used to create the adapter to start with
    }

РЕДАКТИРОВАТЬ: В ответ на комментарии jeffamaphoneвот еще кое-что ... если вы пытаетесь работать с каждым элементом пользовательского интерфейса, тогда getChildAt, безусловно, более уместно, так как он возвращает представление для подпункта, но в целом вы все еще можете работать только с теми, которые видны ввремя.Если это все, что вас волнует, тогда хорошо - просто убедитесь, что вы проверяете null, когда вызов возвращается.

Если вы пытаетесь реализовать что-то вроде того, что было у меня - a «Выбрать все / Выбрать нет / Инвертировать»Функция «Выбор» для списка, который может выходить за пределы экрана, тогда вам гораздо лучше вносить изменения в адаптер или использовать внешний массив (если, как в моем случае, в адаптере не было места, чтобы сделать шаг)), а затем вызовите notifyDataSetChanged() в адаптере списка.Например, моя функция «Инвертировать» имеет такой код:

    case R.id.selectInvertLedgerItems:
        for(int i=0; i<ItemChecked.length; i++)
        {
            ItemChecked[i] = !ItemChecked[i];
        }
        la.notifyDataSetChanged();
        RecalculateTotalSelected();
        break;

Обратите внимание, что в моем случае я также использую пользовательский подпункт ListView, используя adapter.setViewBinder(this); и пользовательскую функцию setViewValue(...).

Более того Если я правильно помню, я не думаю, что «позиция» в списке обязательно совпадает с «позицией» в адаптере ... она сноваоснованный больше на позиции в списке.Таким образом, даже если вы хотите «50-й» элемент в списке, если он первый видимый, getChildAt(50) не вернет то, что вы ожидаете.Я думаю, что вы можете использовать ListView.getFirstVisiblePosition() для учета и корректировки.

0 голосов
/ 22 сентября 2011

Смотрите здесь, этот вопрос отвечает на ту же проблему, что вы упомянули здесь

Как в ListView для Android как можно перебирать / манипулировать всеми дочерними представлениями, а не только видимыми?

...