我需要找出列表中一个元素的像素位置,该列表使用ListView
. 似乎我应该获得其中一个TextView,然后使用getTop()
,但我不知道如何获得ListView
.
更新:的子ViewGroup
项与列表中的项目不一一对应,对于ListView
. 相反,ViewGroup
的子级仅对应于现在可见的那些视图。所以getChildAt()
对内部的索引进行操作,ViewGroup
并且不一定与使用的列表中的位置有任何关系ListView
。
我需要找出列表中一个元素的像素位置,该列表使用ListView
. 似乎我应该获得其中一个TextView,然后使用getTop()
,但我不知道如何获得ListView
.
更新:的子ViewGroup
项与列表中的项目不一一对应,对于ListView
. 相反,ViewGroup
的子级仅对应于现在可见的那些视图。所以getChildAt()
对内部的索引进行操作,ViewGroup
并且不一定与使用的列表中的位置有任何关系ListView
。
请参阅: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 的子项,这可能会影响性能。
此代码更易于使用:
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
定义)并更改所述行的颜色。然后遍历 parent 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() 来确定屏幕上的元素位置。