阻止ListView尝试回收页脚视图

时间:2013-08-11 04:54:44

标签: android listview

我使用addFooterViewListView添加页脚视图,这是 由CursorAdapter控制的Loader填充。有时候 ListView尝试回收页脚视图(通过 CursorAdapter.bindView)。这会导致ClassCastException(如果 我允许回收)或一些项目视图显示为页脚视图(如果我这样做 不允许再循环)。

如果我理解正确,addFooterView添加的页脚视图就是 不应该被回收("Footer views are special views at the bottom of the list that should not be recycled during a layout")。 所以这可能是Android API中的一个错误。

有什么方法可以解决这个问题吗?什么是正确的方法 将页脚视图添加到ListView填充的CursorAdapter


一些相关代码:

在活动中:

paletteView = (ListView)findViewById(R.id.palette);
paletteView.addFooterView(new PaletteAdapter.NewSlot(this));
paletteAdapter = new PaletteAdapter(this, null);
paletteView.setAdapter(paletteAdapter);
getLoaderManager().initLoader(0, null, this);

在适配器(PaletteAdapter)中:

@Override public void
bindView(View view, Context context, Cursor cursor)
{
  if (view instanceof NewSlot)
    {
      Log.wtf(TAG, 
              ("Recycle NewSlot to ID "
               + cursor.getLong(cursor.getColumnIndex
                                (DataProvider.Palettes._ID))));
      return;
    }
  final Slot slot = (Slot)view;
  // Blah blah...
}

2 个答案:

答案 0 :(得分:1)

自己解决。

感谢this answer,我将getView函数覆盖为。{ 以下,一切运作良好。再次感谢 Abhinav 。一世 在遇到问题时应该更多地查看源代码。

@Override public View
getView(int position, View convertView, ViewGroup parent)
{
  if (convertView instanceof NewSlot)
    return super.getView(position, null, parent);
  else return super.getView(position, convertView, parent);
}

答案 1 :(得分:0)

以防它帮助其他人,我有相同的症状(listview试图回收页脚视图),原因是我用这段代码更新了页脚视图的高度: / p>

 private void setFooterViewHeight(int height) {
    LayoutParams layoutParams = new ListView.LayoutParams(LayoutParams.MATCH_PARENT, height);
    mFooterView.setLayoutParams(layoutParams);
 }

我没有意识到ListView.LayoutParams是缓存viewType的地方,当我创建一个新的LayoutParams时,它被重置为0,这意味着它有资格进行视图回收过程

我现在所拥有的是:

private void setFooterViewHeight(int height) {
    LayoutParams layoutParams = mFooterView.getLayoutParams();
    if(layoutParams == null) {
        layoutParams = new ListView.LayoutParams(LayoutParams.MATCH_PARENT, height, ListView.ITEM_VIEW_TYPE_HEADER_OR_FOOTER);
        mFooterView.setLayoutParams(layoutParams);
    } else {
        layoutParams.height = height;
        mFooterView.requestLayout();
    }
}