Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android: Access child views from a ListView

I need to find out the pixel position of one element in a list that's been displayed using a ListView. It seems like I should get one of the TextView's and then use getTop(), but I can't figure out how to get a child view of a ListView.

Update: The children of the ViewGroup do not correspond 1-to-1 with the items in the list, for a ListView. Instead, the ViewGroup's children correspond to only those views that are visible right now. So getChildAt() operates on an index that's internal to the ViewGroup and doesn't necessarily have anything to do with the position in the list that the ListView uses.

like image 490
lacker Avatar asked Nov 02 '08 22:11

lacker


2 Answers

See: Android ListView: get data index of visible item and combine with part of Feet's answer above, can give you something like:

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); 

The benefit is that you aren't iterating over the ListView's children, which could take a performance hit.

like image 113
Joe Avatar answered Sep 29 '22 20:09

Joe


This code is easier to use:

 View rowView = listView.getChildAt(viewIndex);//The item number in the List View     if(rowView != null)         {            // Your code here         } 
like image 43
Kalimah Avatar answered Sep 29 '22 18:09

Kalimah