Android:从ListView访问子视图

android android-listview

130804 观看

6回复

3346 作者的声誉

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

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

作者: lacker 的来源 发布者: 2008 年 11 月 2 日

回应 6


6

2242 作者的声誉

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

在这里找到它

作者: Feet 发布者: 2008 年 11 月 2 日

-9

2405 作者的声誉

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

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

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

作者: jasonhudgins 发布者: 2008 年 12 月 4 日

215

38890 作者的声誉

决定

请参阅: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的子节点,这可能会影响性能。

作者: Joe 发布者: 2010 年 4 月 20 日

17

3863 作者的声誉

此代码更易于使用:

 View rowView = listView.getChildAt(viewIndex);//The item number in the List View
    if(rowView != null)
        {
           // Your code here
        }
作者: Kalimah Apps 发布者: 2012 年 1 月 1 日

5

74 作者的声誉

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);
                v.setBackground(res.getDrawable(R.drawable.not_clicked));
            }
        }
    }
});

基本上,创建两个Drawable - 一个是透明的,另一个是所需的颜色。请求焦点在单击的位置(int position如定义)并更改所述行的颜色。然后遍历父级ListView,并相应地更改所有其他行。这说明了用户listview多次点击的时间。这是通过为每行中的自定义布局完成的ListView。(非常简单,只需创建一个新的布局文件TextView- 不要设置可聚焦或可点击!)。

无需自定义适配器 - 使用 ArrayAdapter

作者: Wes 发布者: 2013 年 6 月 27 日

4

182 作者的声誉

int position = 0;
listview.setItemChecked(position, true);
View wantedView = adapter.getView(position, null, listview);
作者: Milaaaad 发布者: 2016 年 1 月 29 日
32x32