0

假设我有一个包含 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);
    }
4

2 回答 2

0

根据我的实验,这是它的工作原理。ListView 是适配器的一部分。因此,如果一个适配器有 500 个项目,而 ListView 有十 (10) 个项目。ListView 中的十个代表动态视图。因此,如果 firstVisibleItem 是适配器中的项目 217,则 ListView 的索引范围将为 (217,…,226),而 listView.getChildCount() 仍将返回 10。

因此“listview.getChildAt(0)”会失败。

于 2013-10-03T19:30:26.973 回答
0

您的问题的答案是“listview.getChildAt(0)”(如果且仅当元素 104 是第一个可见元素时),ListView 的工作方式是重用“行”或创建的元素,因此它会进行某种旋转在内部填充您的值的机制,但是当涉及到“孩子”时,它一次只会有可见的元素数量,并且这些元素会在所有元素中重用。所以如果你有 300 个元素,但一次只能看到 5 个,这意味着列表视图中的子元素数量为 5 + 1 或 2 来做“最后一个”和“第一个”元素效果......

现在,如果您想要的是用于填充视图的实际元素(而不是视图本身),那么您要做的就是将适配器从列表视图中取出并调用 Adapter.getItem(104),这将为您提供元素用于填充行...

希望这可以帮助...

问候!

于 2013-10-02T21:09:06.993 回答