了解ListView childAt方法

时间:2013-10-02 21:05:26

标签: android android-layout android-listview android-arrayadapter

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

2 个答案:

答案 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)”会失败。