1

我正在使用addFooterView向 a 添加页脚视图ListView,该视图由CursorAdapter控制填充Loader。然而,有时 ListView尝试回收页脚视图(通过 CursorAdapter.bindView)。这会导致ClassCastException(如果我允许回收)或某些项目视图显示为页脚视图(如果我不允许回收)。

如果我理解正确,添加的页脚视图addFooterView不应该被回收(“页脚视图是列表底部的特殊视图,不应在布局期间回收”)。所以这可能是 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...
}
4

2 回答 2

1

我自己解决了。

感谢这个答案,我覆盖了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);
}
于 2013-08-11T17:07:11.230 回答
0

以防万一它对其他人有帮助,我有同样的症状(列表视图试图回收页脚视图),原因是我正在使用以下代码更新页脚视图的高度:

 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();
    }
}
于 2014-10-04T03:51:08.640 回答