notifyDataSetChanged无法在自定义适配器中工作

时间:2016-08-01 12:26:32

标签: android listview custom-adapter notifydatasetchanged

我遇到了奇怪的问题。我已经制作了一个ListView,用适配器填充它,一切正常,直到我想要删除任何项目。按下确认按钮后,视图确实删除了,但其中的文字在下一个视图中的文本上没有变化。 例如,我在ListView中有这样的项目:

  • 第1项
  • 第2项
  • 第3项

当我按删除项目2时,项目3消失,但位置2的视图中的文本不会改变。我知道项目2已删除,因为我使用数据库存储数据,在应用程序重启后,所有内容都按预期显示。我认为问题在于View Holder重用了视图,但我无法弄清楚如何在第二个视图中更改文本。 这里的代码不起作用(至少我认为这个问题在这里)

confirmDeleteButton.setOnClickListener(new View.OnClickListener() {//this button is in dialog
                    @Override
                    public void onClick(View v) {
                        DBController.init(context).delete("main", "id=" + item.get(position).getId(), null);//deleting item from database
                        remove(getItem(position)); //removing view from adapter
                        notifyDataSetChanged(); //notifying adapter
                        dialog.dismiss(); //closing dialog
                    }
                });


只需使用RecyclerView而不是ListView。

3 个答案:

答案 0 :(得分:0)

首先,您必须从adapter.remove(adapter.getItem(position));

等适配器中删除数据

然后拨打notifyDataSetChanged()

答案 1 :(得分:0)

请勿使用get位置删除数据,首先使用setid()确认getview适配器类中使用的confirmDeleteButton.setid(position)等按钮。

然后根据getid()删除ID,如:

DBController.init(context).delete("main", "id=" + item.get(v.getid()).getId(), null);//deleting item from database 
remove(v.getid()); //removing view from adapter

答案 2 :(得分:0)

如果你使用的话会更好:

adapter.notifyItemRangeRemoved(int positionStart, int itemCount)
adapter.notifyItemRemoved(int position)

更多信息:https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html