Android: доступ к дочерним представлениям из ListView
Мне нужно выяснить положение пикселя одного элемента в списке, который был отображен с помощью ListView
, Кажется, я должен получить один из TextView и затем использовать getTop()
, но я не могу понять, как получить детское представление о ListView
,
Обновление: дети ViewGroup
не соответствуют 1-к-1 с элементами в списке, для ListView
, Вместо этого ViewGroup
Детям соответствуют только те взгляды, которые видны прямо сейчас. Так getChildAt()
работает с индексом, который является внутренним для ViewGroup
и не обязательно имеет какое-либо отношение к позиции в списке, что ListView
использует.
6 ответов
См.: 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, что может снизить производительность.
Этот код проще в использовании:
View rowView = listView.getChildAt(viewIndex);//The item number in the List View
if(rowView != null)
{
// Your code here
}
Быстрый поиск документов для класса ListView обнаружил методы getChildCount() и getChildAt(), унаследованные от ViewGroup. Можете ли вы пройти через них, используя эти? Я не уверен, но стоит попробовать.
Нашел здесь
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);t v.setBackground(res.getDrawable(R.drawable.not_clicked));
}
}
}
});
По сути, создайте два рисованных объекта - один прозрачный, а другой желаемый цвет. Запросите фокус на нажатой позиции (int position, как определено) и измените цвет указанной строки. Затем пройти через родителей listview
и измените все остальные строки соответственно. Это учитывает, когда пользователь нажимает на listview
многократно. Это делается с помощью пользовательского макета для каждой строки в listview
, (Очень просто, просто новый файл макета с textview
- не устанавливайте фокусируемый или кликабельный!) Не требуется пользовательский адаптер - используйте адаптер массива
int position = 0;
listview.setItemChecked(position, true);
View wantedView = adapter.getView(position, null, listview);
Это предполагает, что вы знаете положение элемента в ListView:
View element = listView.getListAdapter().getView(position, null, null);
Тогда вы сможете вызывать getLeft() и getTop(), чтобы определить элементы на экране.