如何获取Android中适配器内最后一个可见项的位置

时间:2014-03-22 23:41:48

标签: android android-listview

我打算为每个可见行创建一个包含不同布局的列表视图。我还设置了setStackFromBottom(true)

我知道我可以在int getItemViewType(int position)中使用View getView(int position, View convertView, ViewGroup parent),但它使用修复位置,而不是基于可见位置。

我想使用listview,如下面的概念所示:

listview order

如果我向下滚动,下一个项目应该替换前一个项目并使用其大型布局。 我尝试使用以下代码,但它使用修复位置,因此列表中的最后一项是最大的,而不是最后一个可见项

 @Override
  public int getItemViewType(int position)
  {
    if(position==values.length-1)
      return 1;
    return 0;
  }

 @Override
  public View getView(int position, View convertView, ViewGroup parent)
  {
    LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View rowView = null;
    type=getItemViewType(position);
    if (type == 0)
      rowView = inflater.inflate(R.layout.list_item, parent, false);
    else
      rowView = inflater.inflate(R.layout.list_item2, parent, false);
    return rowView;
  }

我估计,我应该获得适配器内第一个和最后一个可见项目的位置,但我不知道该怎么做。

我可以以某种方式创建一个遵循上述概念的列表视图吗?我可以获得正确的职位吗?

1 个答案:

答案 0 :(得分:5)

您可以通过在ListView上设置滚动侦听器来获取大量信息:

mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        // firstVisibleItem + visibleItemCount = last item
    }
}

但是,我无法想到如何有效地使用这些信息。即使你改变getView()以在其位置与最后一项相同时返回更大的View,你也不能在向上移动时轻松调整视图的大小,因为getView()不会再被调用对于已经显示的项目,除非您反复调用适配器上的notifyDataSetChanged(),否则会导致性能下降。

我的目的是在ListView下面添加另一个View,它将在ListView中的最后一个项目下面显示更大的View。使它看起来像ListView中的最后一行。您可以在onScroll()方法中更改该视图。