我有一个ListView
,其中包含一个扩展BaseAdapter
并具有两种视图类型的自定义适配器。当我运行adapter.removeRow(position)
方法时,适配器的数据已正确更新,列表反映了这一点,但视图类型未正确更新。适配器由
ArrayList<Map<String, String>> rows = new ArrayList<Map<String, String>>();
我有一个子集
List<Integer> flashSet = new ArrayList<Integer>();
是ViewType 1的所有位置的列表(与标准视图类型0相对)。
这是我的适配器removeRow(position)
方法:
public void removeRow(int position) {
if (getItemViewType(position) == TYPE_FLASH) {
flashSet.remove(position);
}
for (int flashPosition:flashSet) {
System.out.println(tag+"is "+flashPosition+" going to be moved?");
if (flashPosition > position) {
flashPosition -= 1;
System.out.println(tag+"Yes! It's been moved to "+flashPosition);
}
}
rows.remove(position);
notifyDataSetChanged();
}
这是我的getView
方法:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
FlashHolder flashHolder;
ClipHolder clipHolder;
int type = getItemViewType(position);
if (convertView == null) {
if (type == TYPE_CLIP) {
convertView = rowInflater.inflate(R.layout.clip_note_row_layout, null);
clipHolder = new ClipHolder();
flashHolder = null;
clipHolder.textView = (TextView)(convertView.findViewById(R.id.clip_text));
convertView.setTag(clipHolder);
} else {
convertView = rowInflater.inflate(R.layout.flash_row_layout, null);
clipHolder = null;
flashHolder = new FlashHolder();
flashHolder.front = (TextView)(convertView.findViewById(R.id.flash_text));
flashHolder.back = (TextView)(convertView.findViewById(R.id.clip_text));
convertView.setTag(flashHolder);
}
} else {
if (type == TYPE_CLIP) {
clipHolder = (ClipHolder)convertView.getTag();
flashHolder = null;
} else {
clipHolder = null;
flashHolder = (FlashHolder)convertView.getTag();
}
}
if (type == TYPE_CLIP) {
clipHolder.textView.setText(rows.get(position).get("clip"));
} else {
flashHolder.front.setText(rows.get(position).get("flash_text"));
flashHolder.back.setText(rows.get(position).get("clip"));
}
return convertView;
}
我知道我可以创建一个新的adapter
,为其提供更新的ArrayList
并致电listView.setAdapter(adapter)
但是当我只是想从一个项目中移除一个项目时,这似乎完全矫枉过正可能很长的清单。在删除之前和之后看到图片:
然后我删除第一项。隐藏在“让我看它”项目后面的“哪个”这个词现在被“灵感来自...”项目隐藏在一个空白项目3后面。
因此,数据正在更新,而视图类型则没有。谢谢你的帮助!
答案 0 :(得分:1)
我明白了。这对任何人都没用,因为我不指望别人犯同样的错误。
我天真地想到这样做
for (int flashPosition:flashSet) {
System.out.println(tag+"is "+flashPosition+" going to be moved?");
if (flashPosition > position) {
flashPosition -= 1;
System.out.println(tag+"Yes! It's been moved to "+flashPosition);
}
}
我正在更改List<Integer> flashSet = new ArrayList<Integer>();
事实上,我需要做以下事情:
for (int flashPosition:flashSet) {
System.out.println(tag+"is "+flashPosition+" going to be moved?");
if (flashPosition > position) {
flashSet.remove((Object)flashPosition);
flashPosition -= 1;
flashSet.add(flashPosition);
System.out.println(tag+"Yes! It's been moved to "+flashPosition);
}
}
答案 1 :(得分:0)
试试这个,删除或添加项目后,需要调用适配器刷新。
Youradapter.notifyDataSetChanged();
答案 2 :(得分:0)
使用yourlistview.invalidateViews()
而不是
notifyDataSetChanged();
它对我有用。