Intereting Posts

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

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

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

Solutions Collecting From Web of "Android: доступ к дочерним представлениям из списка ListView"

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

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