Android:从ListView访问子视图
我需要找出ListView
已经显示的列表中的一个元素的像素位置。 看来我应该得到一个TextView的 ,然后使用getTop()
,但我不知道如何获得一个ListView
的子视图。
更新:对于ListView
, ViewGroup
的子项与列表中的项目不一一对应。 相反, 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()来确定屏幕位置上的元素。
- 存储Android SQLite
- 用于RecyclerView的GridLayoutManager上的方形布局
- 在Android中的每行添加和删除buttonListView
- Android:创build一个具有多个选项的popup窗口
- Android AudioRecord与MediaRecorder录制audio
- 如何在Android上发现zeroconf(Bonjour)服务? 我在使用jmDNS时遇到了麻烦
- match_parent宽度在RecyclerView中不起作用
- Android – button的边框
- 用户10102和当前进程都没有android.permission.READ_PHONE_STATE