我使用addFooterView
向ListView
添加页脚视图,这是
由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...
}
答案 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();
}
}