Получить список пользователей 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);
}
}
Ответы
Ответ 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().