Android:从ListView访问子视图

我需要找出ListView已经显示的列表中的一个元素的像素位置。 看来我应该得到一个TextView的 ,然后使用getTop() ,但我不知道如何获得一个ListView的子视图。

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

请参阅: Android ListView:获取可见项的数据索引,并结合上面的脚的部分答案,可以给你类似于:

 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的子元素,这可能会带来性能上的冲击。

此代码更易于使用:

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

快速searchListView类的文档后,getGildCount()和getChildAt()方法从ViewGroupinheritance。 你可以使用它们遍历它们吗? 我不确定,但值得一试。

在这里find它

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

基本上,创build两个可绘制的 – 一个是透明的,另一个是所需的颜色。 请求焦点在被点击的位置(定义的int位置)并改变所述行的颜色。 然后遍历父级listview ,并相应地更改所有其他行。 这是用户多次点击listview 。 这是用listview每一行的自定义布局完成的。 (非常简单,只是一个带有textview的新布局文件 – 不要设置可聚焦或可点击!)不需要自定义的适配器 – 使用arrays适配器

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

这假定你知道元素在ListView中的位置:

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

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