当前位置:  开发笔记 > Android > 正文

Android:从ListView访问子视图

如何解决《Android:从ListView访问子视图》经验,为你挑选了4个好方法。

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

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



1> Joe..:

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


很好的答案,但在列表中有标题视图时效果不佳.对`firstPosition`的赋值应该是`int firstPosition = listView.getFirstVisiblePosition() - listView.getHeaderViewsCount();`来解决这个问题.
@VictorDenisov:这只能在UI线程上发生; 因此,在执行此代码时将阻止UI线程,因此子视图是静​​止的并且不会被修改.`ListView`已经在回收旧的`convertView`s等之后处理"移动"子视图,所以你*可以*保证`ListView.getChildAt(0)`**实际上是**第一个附加的视图从适配器.它可能不完全可见(甚至根本不可见,取决于`ListView`的"可见性"阈值,然后再回收它认为"滚动到视图外"的视图)

2> Kalimah..:

此代码更易于使用:

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


ViewID参数令人困惑.这是一个指数(或位置).视图ID是由aapt工具生成的完全任意整数.
总是不起作用.getChildAt从第一个可见行计数,而不是从数据顶部计算.

3> Feet..:

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

在这里找到它



4> 小智..:
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位置)并更改所述行的颜色.然后遍历父级int position,并相应地更改所有其他行.这说明了用户ListView多次点击的时间.这是通过自定义布局完成的listview.(非常简单,只是一个新的布局文件,带有ListView- 不设置可聚焦或可点击!)无需自定义适配器 - 使用阵列适配器

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有