我打算为每个可见行创建一个包含不同布局的列表视图。我还设置了setStackFromBottom(true)
。
我知道我可以在int getItemViewType(int position)
中使用View getView(int position, View convertView, ViewGroup parent)
,但它使用修复位置,而不是基于可见位置。
我想使用listview,如下面的概念所示:
如果我向下滚动,下一个项目应该替换前一个项目并使用其大型布局。 我尝试使用以下代码,但它使用修复位置,因此列表中的最后一项是最大的,而不是最后一个可见项。
@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;
}
我估计,我应该获得适配器内第一个和最后一个可见项目的位置,但我不知道该怎么做。
我可以以某种方式创建一个遵循上述概念的列表视图吗?我可以获得正确的职位吗?
答案 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()方法中更改该视图。