说我有一个包含145个项目的适配器。目前在我的Listview中我有10个视图显示,其中视图代表项目104到113.现在我有一个scrollListener,其onScroll方法是
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
{
View view = getViewForPosition(??, view);//keep reading for ?? details
}
如果我需要firstVisibleItem的视图,那么适配器是104项,我如何从列表中请求它?我说listview.getChildAt(0)
吗?或者我说listview.getChildAt(104)
?
现在实际上我正在使用下面的方法,但基本问题仍然存在。
public View getViewForPosition(int position, AbsListView listview) {
int firstPosition = listview.getFirstVisiblePosition()
- ((ListView) listview).getHeaderViewsCount();
int wantedChild = position - 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()) {
return null;
}
return listview.getChildAt(wantedChild);
}
答案 0 :(得分:0)
你的问题的答案是“listview.getChildAt(0)”(如果元素104是可见的第一个元素,那么,ListView的工作方式是重用“行”或创建的元素,因此它会做一些在内部填充您的值的旋转机制,但是当涉及到“孩子”时,它将只有一次可见的元素数量,并且这些元素在所有元素中重复使用。 所以,如果你有300个elemens,但你一次只能看到5个,这意味着列表视图中的childs数是5 + 1或2来做“last”和“first”元素效果... < / p>
现在,如果您想要的是用于填充视图的实际元素(而不是视图本身),您需要做的是从listview中获取适配器并调用Adapter.getItem(104),这将给出你用来填充行的元素......
希望这会有所帮助......
问候!
答案 1 :(得分:0)
根据我的实验,这是它的工作原理。 ListView是适配器的一部分。因此,如果适配器有500个项目,ListView有10个(10)。 ListView中的十个表示动态视图。因此,如果firstVisibleItem是适配器中的项目217,那么ListView的索引范围将是(217,...,226),而listView.getChildCount()仍将返回10.。
因此“listview.getChildAt(0)”会失败。