gpt4 book ai didi

android - ArrayAdapter.NotifyDataSetChanged() 不起作用?

转载 作者:IT老高 更新时间:2023-10-28 23:38:48 24 4
gpt4 key购买 nike

我有一个可由用户更新的列表,但 notifyDataSetChanged() 不适用于与 listView 关联的适配器。我在 fragment 中使用它。数据库得到更新,但 adpater 没有。以下是我的实现:

我的主要 fragment :

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myArrayList = new ArrayList<myList>();
myArrayList = Database.getSharedObject(getActivity()).getMyList();
if (myArrayList != null && myArrayList.size() > 0) {
adapter = new myListAdapter(getActivity(), 0, myArrayList);
}

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

View v = inflater.inflate(R.layout.mainfragment, container, false);
myListView = (ListView) v.findViewById(R.id.my_list_view);
myListView.setOnItemClickListener(this);
if (adapter != null) {
myListView.setAdapter(adapter);
}

return v;
}

在一些导航过程 List 得到更新后,在我的 onResume() 方法中,我从数据库中获取更新后的 List 并调用不更新 View 的 notifyDatasetChanged() 方法, 但是从 DB 中对应的数组被更新一个。

@Override
public void onResume() {
super.onResume();
myArrayList = Database.getSharedObject(getActivity()).getMyList();
adapter.setItems (myArrayList);
adapter.notifyDataSetChanged();

}

MyListAdapter

public class MyListAdapter extends ArrayAdapter<Message> {

private ArrayList<Message> myList;

/* Context */
private Context context;

public void setItems (ArrayList<Message> myList) {
this.myList = myList;
}

public MyListAdapter (Context context, int textViewResourceId, ArrayList<Message> myList) {
super(context, textViewResourceId, myList);
this.context = context;
this.myList = myList;
}

@Override
public View getView (int position, View v, ViewGroup parent) {
// Keeps reference to avoid future findViewById()
MyViewHolder viewHolder;

if (v == null) {
LayoutInflater li = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = li.inflate(R.layout.list_row, parent, false);

viewHolder = new MyViewHolder();
viewHolder.txtImage = (ImageView) v.findViewById(R.id.message_icon);
viewHolder.txtMessage = (TextView) v.findViewById(R.id.message);
viewHolder.txtDate = (TextView) v.findViewById(R.id.date);

v.setTag(viewHolder);
} else {
viewHolder = (MyViewHolder) v.getTag();
}

Message myMessage = new Message();
myMessage = myList.get(position);
if (myMessage != null) {
viewHolder.txtMessage.setText(myMessage.getText());
viewHolder.txtDate.setText(myMessage.getDate());
}
return v;
}

static class MyViewHolder {
ImageView txtImage;
TextView txtMessage;
TextView txtDate;
}
}

对出了什么问题有任何想法吗?为什么 ListView 没有更新?任何帮助表示赞赏。

最佳答案

notifyDataSetChanged()不会为你工作。原因

  1. 您的适配器丢失了对您列表的引用。
  2. 始终创建新列表并将其添加到适配器。这样做:在全局声明时初始化 ArrayList。

ArrayList<MyItemType> myArrayList=new ArrayList<>();//作为一个全局变量

直接将List添加到适配器,不检查null和空条件。直接将适配器设置为列表(不检查任何条件)

myListView.setAdapter(adapter);

  1. 每次向 myArrayList 添加数据(如果您的数据是全新的,那么您可以在实际向列表添加数据之前调用 adapter.clear() 和 myArrayList.clear()),但不要设置适配器即如果新数据填充到 myArrayList 中,则只需 adapter.notifyDataSetChanged()

     adapter = new myListAdapter(getActivity(), 0, myArrayList);
  2. 删除这一行

    adapter.setItems (myArrayList);

关于android - ArrayAdapter.NotifyDataSetChanged() 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15022727/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com