这个问题在我和这里遇到了很多机构,但我还没有看到一个有效的答案。 我有一个列表视图和列表中每个项目的删除按钮。当我点击按钮时,该项目将从数据库中删除,并从列表中删除,但列表视图不刷新项目。
我调用方法notifyDataSetChanged()
但没有结果。(当项目被删除时,下一个项目的标题出现,似乎有两个项目有一个标题,一个接一个地排序)。
myListView.invalidateViews()
和myListView.invalidate()
也不起作用。
究竟是什么原因,绝对解决方案是什么?
这是我的代码:
以下是整个代码:
public class AdapterNote扩展了ArrayAdapter {
public AdapterNote(ArrayList<StructNote> notes) {
super(G.context, R.layout.adapter_note, notes);
}
private class ViewHolder {
TextView txtTitle;
ImageView imgDelete;
public ViewHolder(View view) {
txtTitle = (TextView) view.findViewById(R.id.txtTitle);
imgDelete = (ImageView) view.findViewById(R.id.imgDelete);
}
public void fill(final ArrayAdapter<StructNote> adapter, final StructNote item, final int position) {
txtTitle.setText(item.title + "");
imgDelete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
G.notes.remove(item);
adapter.remove(item);
deleteDataFromDatabase(item.id);
G.adapter.notifyDataSetChanged();
}
});
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
StructNote item = getItem(position);
if (convertView == null) {
convertView = G.inflater.inflate(R.layout.adapter_note, parent, false);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
}
holder.fill(this, item, position);
return convertView;
}
}
答案 0 :(得分:0)
根据列表索引从列表中删除项目或ArrayList属于适配器,然后尝试调用notifyDataSetChanged()
答案 1 :(得分:0)
您遇到的问题涉及具有相同标题部分的两个项目&#39;与侦听器和当前位置之间的同步丢失有关。如果您的自定义项类型为:
,请尝试这样的操作Object item
将它放在视图中,与文本视图一起显示。在给视图充气后,请执行以下操作:
holder.item = getItem(position);
然后,而不是item.xx执行它:
holder.item.xx
答案 2 :(得分:0)
通过调用yourAdapterObject.remove(POSITION);
此处,yourAdapterObject
是适配器的对象,POSITION
是您要从列表视图中删除的位置。
之后,您需要使用剩余的数据和信息刷新适配器。所以,你需要打电话如下:
yourAdapterObject.notifyDataStateChanged();
另外here是开发者网站提供的用于显示动画的动画演示。但他们还展示了如何从列表中删除项目并将其添加到列表中。一切正常,动画效果很好。
我想它会帮助你。
享受编码......:)
答案 3 :(得分:0)
只需将其从数组列表中删除,然后再次将适配器设置为列表视图。在 OnItemClickListener 。
中执行此操作private OnItemClickListener listPairedClickItem = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
arrlist.remove(2);
lv.setAdapter(adapter);
}
};
答案 4 :(得分:0)
int pos = nameList.indexOf(object);
nameList.remove(pos);
listAdapter.notifyDataSetChanged();
答案 5 :(得分:0)
讨论的后期......
当我从使用适配器的类中执行此操作时,listview将不会刷新。更糟糕的是,有时它会更新,有时则不然。我打电话给adapter.notifyDataSetChanged();
。
最后,我通过制作一个直接在适配器中删除项目的方法来实现它,如下所示:
CustomAdapter extends BaseAdapter {
public void deleteItem(AdapterItem ai) {
dataList.remove(ai); /*dataList = data source used by adapter*/
notifyDataSetChanged();
}
}