Android: доступ к дочерним представлениям из списка
мне нужно узнать положение пикселя одного элемента в списке, который был отображен с помощью 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)); } } } });в принципе, создать два drawables - один прозрачный, а другой желаемый цвет. Запросите фокус в нажатой позиции (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 (), чтобы определить элементы на позиции экрана.
Comments