Вопрос:

Android: доступ к дочерним представлениям из ListView

android android-listview

130804 просмотра

6 ответа

3346 Репутация автора

Мне нужно выяснить положение пикселя одного элемента в списке, который отображается с помощью ListView. Кажется, что я должен получить один из TextView и затем использовать getTop(), но я не могу понять, как получить дочернее представление a ListView.

Обновление: дети ViewGroupне соответствуют 1 к 1 с пунктами в списке, для a ListView. Вместо этого ViewGroupдети соответствуют только тем представлениям, которые видны прямо сейчас. Таким образом, getChildAt()работает с индексом, который является внутренним по отношению к ViewGroupи не обязательно имеет какое-либо отношение к позиции в списке, который ListViewиспользует.

Автор: lacker Источник Размещён: 02.11.2008 10:40

Ответы (6)


6 плюса

2242 Репутация автора

Быстрый поиск документов для класса ListView выявил методы getChildCount () и getChildAt (), унаследованные от ViewGroup. Можете ли вы пройти через них, используя эти? Я не уверен, но стоит попробовать.

Нашел здесь

Автор: Feet Размещён: 02.11.2008 11:04

-9 плюса

2405 Репутация автора

Это предполагает, что вы знаете положение элемента в ListView:

  View element = listView.getListAdapter().getView(position, null, null);

Тогда вы сможете вызывать getLeft () и getTop (), чтобы определить элементы на экране.

Автор: jasonhudgins Размещён: 04.12.2008 02:08

215 плюса

38890 Репутация автора

Решение

См. Android ListView: получить индекс данных видимого элемента и объединить с частью ответа Фута выше, может дать вам что-то вроде:

int wantedPosition = 10; // Whatever position you're looking for
int firstPosition = listView.getFirstVisiblePosition() - listView.getHeaderViewsCount(); // This is the same as child #0
int wantedChild = wantedPosition - firstPosition;
// Say, first visible position is 8, you want position 10, wantedChild will now be 2
// So that means your view is child #2 in the ViewGroup:
if (wantedChild < 0 || wantedChild >= listView.getChildCount()) {
  Log.w(TAG, "Unable to get view for desired position, because it's not being displayed on screen.");
  return;
}
// Could also check if wantedPosition is between listView.getFirstVisiblePosition() and listView.getLastVisiblePosition() instead.
View wantedView = listView.getChildAt(wantedChild);

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

Автор: Joe Размещён: 20.04.2010 11:01

17 плюса

3863 Репутация автора

Этот код проще в использовании:

 View rowView = listView.getChildAt(viewIndex);//The item number in the List View
    if(rowView != null)
        {
           // Your code here
        }
Автор: Kalimah Apps Размещён: 01.01.2012 08:20

5 плюса

74 Репутация автора

listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, final View view, int position, long id) {
        View v;
        int count = parent.getChildCount();
        v = parent.getChildAt(position);
        parent.requestChildFocus(v, view);
        v.setBackground(res.getDrawable(R.drawable.transparent_button));
        for (int i = 0; i < count; i++) {
            if (i != position) {
                v = parent.getChildAt(i);
                v.setBackground(res.getDrawable(R.drawable.not_clicked));
            }
        }
    }
});

По сути, создайте два Drawables - один прозрачный, а другой желаемый цвет. Запросите фокусировку в выбранной позиции ( int positionкак определено) и измените цвет указанной строки. Затем пройдитесь по родителю ListViewи измените все остальные строки соответственно. Это объясняет, когда пользователь нажимает listviewнесколько раз. Это делается с помощью пользовательского макета для каждой строки в ListView. (Очень просто, просто создайте новый файл макета с TextView- не устанавливайте фокусируемый или кликабельный!).

Пользовательский адаптер не требуется - используйте ArrayAdapter

Автор: Wes Размещён: 27.06.2013 01:54

4 плюса

182 Репутация автора

int position = 0;
listview.setItemChecked(position, true);
View wantedView = adapter.getView(position, null, listview);
Автор: Milaaaad Размещён: 29.01.2016 08:11
Вопросы из категории :
32x32