Answers:
请参阅: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的子级,这可能会降低性能。
ListView
已在处理“移动”子视图回收旧后围绕convertView
S,等等,这样你就可以被保证ListView.getChildAt(0)
是实际上从适配器第一贴附视图。它可能不完全可见(甚至可能根本不可见,这取决于在ListView
回收认为“滚动”的视图之前,“可见性”的阈值)
此代码更易于使用:
View rowView = listView.getChildAt(viewIndex);//The item number in the List View
if(rowView != null)
{
// Your code here
}
快速搜索ListView类的文档已启用从ViewGroup继承的getChildCount()和getChildAt()方法。您可以使用它们遍历它们吗?我不确定,但是值得一试。
在这里找到
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
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()来确定屏幕位置上的元素。
getView()
填充列表时,由ListView在内部调用。您不应该使用它来获取列表中该位置的视图,因为getView()
使用null进行调用convertView
会导致适配器从适配器的布局资源中充气一个新视图(不会获得已经显示的视图)。
firstPosition
应该是int firstPosition = listView.getFirstVisiblePosition() - listView.getHeaderViewsCount();
解决这个问题。