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

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

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

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

105 голосов | спросил lacker 3 12008vEurope/Moscow11bEurope/MoscowMon, 03 Nov 2008 01:40:49 +0300 2008, 01:40:49

5 ответов


0

См .: Просмотр списка Android: получить индекс данных видимый предмет и в сочетании с частью ответа Ноги выше, может дать вам что-то вроде:

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 21 AMpWed, 21 Apr 2010 03:01:57 +040001Wednesday 2010, 03:01:57
0

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

 View rowView = listView.getChildAt(viewIndex);//The item number in the List View
    if(rowView != null)
        {
           // Your code here
        }
ответил Kalimah Apps 1 Jpm1000000pmSun, 01 Jan 2012 12:20:17 +040012 2012, 12:20:17
0

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

Нашел здесь

.
ответил Feet 3 12008vEurope/Moscow11bEurope/MoscowMon, 03 Nov 2008 02:04:55 +0300 2008, 02:04:55
0
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 - не устанавливайте фокусируемый или кликабельный!) Не требуется настраиваемый адаптер - используйте адаптер массива

ответил Wes 27 J0000006Europe/Moscow 2013, 17:54:47
0

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

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

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

ответил jasonhudgins 4 ThuEurope/Moscow2008-12-04T17:08:27+03:00Europe/Moscow12bEurope/MoscowThu, 04 Dec 2008 17:08:27 +0300 2008, 17:08:27

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132