【问题标题】:understanding ListView childAt method理解 ListView childAt 方法
【发布时间】:2013-10-02 21:05:26
【问题描述】:

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

【问题讨论】:

  • 我认为一个更好的问题是,为什么需要来自 onScroll 方法的视图?并不是说没有理由,但通常大多数您想做的事情都可以对视图执行,您可以(并且应该)在 getView() 方法中执行。
  • @kcoppock 我很高兴你问:stackoverflow.com/questions/19041222/…

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


【解决方案1】:

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

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

希望这会有所帮助...

问候!

【讨论】:

  • 出于某种原因,这似乎不是真的。
  • 究竟有什么不正确的?
  • listview.getChildAt(0) 返回 firstVisibleItem 如果 firstVisibleItem 是索引 0 是有效的。我正在尝试解决一个更大的问题。问题是我需要预测空值,而这并没有发生。
  • 如果您需要在向用户显示之前在列表视图中操作信息,那么您需要实现自己的 BaseAdapter,并且在 getView 方法中您将有机会做您想做的事...
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2010-11-23
    • 2011-12-12
    • 2015-09-09
    • 2017-09-23
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多