Android:从ListView访问子视图

时间:2008-11-02 22:40:49

标签: android android-listview

我需要找出使用ListView显示的列表中一个元素的像素位置。看起来我应该使用 TextView的之一,然后使用getTop(),但我无法弄清楚如何获得ListView的子视图。

更新:对于ViewGroupListView的孩子与列表中的项目不一一对应。相反,ViewGroup的子项仅对应于那些现在可见的视图。因此getChildAt()ViewGroup内部的索引进行操作,并且不一定与ListView使用的列表中的位置有任何关系。

6 个答案:

答案 0 :(得分:215)

请参阅:Android ListView: get data index of visible item 并结合上面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的子节点,这可能会影响性能。

答案 1 :(得分:17)

此代码更易于使用:

 View rowView = listView.getChildAt(viewIndex);//The item number in the List View
    if(rowView != null)
        {
           // Your code here
        }

答案 2 :(得分:6)

快速搜索ListView类的文档已经发现了从ViewGroup继承的getChildCount()和getChildAt()方法。你能用这些迭代它们吗?我不确定,但值得一试。

找到它here

答案 3 :(得分:5)

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位置)并更改所述行的颜色。然后遍历父listview,并相应地更改所有其他行。这可以解释用户多次点击listview的时间。这是通过listview中每一行的自定义布局完成的。 (非常简单,只是一个带有textview的新布局文件 - 不设置可聚焦或可点击!)无需自定义适配器 - 使用数组适配器

答案 4 :(得分:4)

int position = 0;
listview.setItemChecked(position, true);
View wantedView = adapter.getView(position, null, listview);

答案 5 :(得分:-9)

这假设您知道ListView中元素的位置:

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

然后你应该可以调用getLeft()和getTop()来确定屏幕位置上的元素。