Подтвердить что ты не робот

Получить список пользователей ListView, которые не отображаются

Для приложения, над которым я работаю, я пытаюсь получить список ListView. Для этого у меня есть следующий фрагмент кода:

View listItem = mListView.getChildAt(i);

Однако это работает только для детей, которые находятся в поле зрения. Мне нужно также охватить детей, которых нет в виду. Как мне это сделать?

EDIT:

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

RelativeLayout listItem1 = (RelativeLayout) mListView.getAdapter().getView(i, null, mListView);
RelativeLayout listItem2 = (RelativeLayout) mListView.getChildAt(i);
Log.d("Checks", "listItem1: " + listItem1);
Log.d("Checks", "listItem2: " + listItem2);

08-27 14:16:56.628: D/Checks(15025): listItem1: [email protected]
08-27 14:16:56.628: D/Checks(15025): listItem2: [email protected]
08-27 14:16:56.628: D/Checks(15025): listItem1: [email protected]
08-27 14:16:56.628: D/Checks(15025): listItem2: [email protected]
08-27 14:16:56.638: D/Checks(15025): listItem1: [email protected]
08-27 14:16:56.638: D/Checks(15025): listItem2: [email protected]
08-27 14:16:56.638: D/Checks(15025): listItem1: [email protected]
08-27 14:16:56.638: D/Checks(15025): listItem2: [email protected]
08-27 14:16:56.648: D/Checks(15025): listItem1: [email protected]
08-27 14:16:56.648: D/Checks(15025): listItem2: [email protected]
08-27 14:16:56.648: D/Checks(15025): listItem1: [email protected]
08-27 14:16:56.648: D/Checks(15025): listItem2: [email protected]

listItem2 указывает на фактический вид в ListView, который я хочу, за исключением того, что он работает только для просмотров, которые находятся в поле зрения. Из файла журнала вы можете видеть, что listItem1 и listItem2 не соответствуют.

ИЗМЕНИТЬ 2:

Я придумал следующее:

for (int i = 0; i < mListView.getCount(); i++) {
    RelativeLayout listItem = (RelativeLayout) mListView.getAdapter().getView(i, mListView.getChildAt(i), mListView);
}

Это возвращает представления правильно для всех видимых элементов в списке. Однако он возвращает другой вид для тех, которые не отображаются.

ИЗМЕНИТЬ 3:

Благодаря nfirex у меня есть рабочий ответ. Это вернет представления, даже если они не отображаются непосредственно:

public View getViewByPosition(int position, ListView listView) {
    final int firstListItemPosition = listView.getFirstVisiblePosition();
    final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;

    if (position < firstListItemPosition || position > lastListItemPosition ) {
        return listView.getAdapter().getView(position, listView.getChildAt(position), listView);
    } else {
        final int childIndex = position - firstListItemPosition;
        return listView.getChildAt(childIndex);
    }
}
4b9b3361

Ответ 1

Вам нужен метод Adapter.getView():

final View view = mListView.getAdapter().getView(position, null, mListView);

UPDATE:

Вам нужно создать свой метод. Что-то вроде этого:

public View getViewByPosition(int position, ListView listView) {
    final int firstListItemPosition = listView.getFirstVisiblePosition();
    final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;

    if (position < firstListItemPosition || position > lastListItemPosition ) {
        return listView.getAdapter().getView(position, null, listView);
    } else {
        final int childIndex = position - firstListItemPosition;
        return listView.getChildAt(childIndex);
    }
}

Ответ 2

Вы можете использовать этот код

private static void initRecyclerBin(AbsListView view) {
        try {
            Field localField = AbsListView.class.getDeclaredField("mRecycler");
            localField.setAccessible(true);
            Object recyclerBin = localField.get(view);
            Class<?> clazz = Class.forName("android.widget.AbsListView$RecycleBin");
            Field scrapField = clazz.getDeclaredField("mScrapViews");
            scrapField.setAccessible(true);
            ArrayList<View>[] scrapViews;
            scrapViews = (ArrayList<View>[]) scrapField.get(recyclerBin);
            if (null != scrapViews) {
                int length = scrapViews.length;
                for (int i = 0, count = 0; i < length; i++) {
                    if (null != scrapViews[i] && !scrapViews[i].isEmpty()) {
                        for (int j = 0; j < scrapViews[i].size(); j++) {
                            scrapViews[i].get(j);//this is the scrapViews
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

и ListView getChildViews().