我有一个可由用户更新的列表,但notifyDataSetChanged()
无法处理与listView
关联的适配器。我在一个片段中使用它。数据库会更新,但adpater不会。以下是我的实施:
我的主要信息:
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;
}
在一些导航过程之后,列表得到更新,并且在我的onResume()
方法中,我从数据库中获取更新的列表并调用不更新我的视图的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不会更新?任何帮助表示赞赏。
答案 0 :(得分:30)
notifyDataSetChanged()
不适合您。
始终在适配器上创建并添加新列表。这样做: 在全局声明的同时初始化ArrayList。
ArrayList<myList> myArrayList=new ArrayList<myList>();
//作为全局变量
直接向适配器添加列表,不检查null和空条件。直接将适配器设置为列表(不检查任何条件)
myListView.setAdapter(adapter);
将数据添加到myArrayList每次(如果您的数据完全是新的,您可以在实际向列表中添加数据之前调用adapter.clear()和myArrayList.clear())但不要设置适配器
即如果新数据填充在myArrayList中而不仅仅是adapter.notifyDataSetChanged()
adapter = new myListAdapter(getActivity(), 0, myArrayList);
删除此行
adapter.setItems (myArrayList);
答案 1 :(得分:8)
刚过来的getCount方法
@Override
public int getCount() {
return myArrayList.count();
}
答案 2 :(得分:5)
在你的setItems方法中尝试清除旧的ArrayList。
而不是:
public void setItems(ArrayList<Message> myList) {
this.myList = myList;
}
试试这个:
public void setItems(ArrayList<Message> myList) {
this.myList.clear();
this.myList.addAll(myList);
notifyDataSetChanged();
}
答案 3 :(得分:0)
问题出在MyListAdapter
的构造函数中而不是
public MyListAdapter(Context context, int textViewResourceId, ArrayList<Message> myList) {
super(context, textViewResourceId, scheduledMessageList);
this.context = context;
this.myList = myList;
}
尝试
public MyListAdapter(Context context, int textViewResourceId, ArrayList<Message> myList) {
super(context, textViewResourceId, myList);
this.context = context;
this.myList = myList;
}
您也应该调用adapter.clear();
,然后调用adapter.addAll(myArrayList);
答案 4 :(得分:-2)
如果你可以在适配器中使用notifyDataSetChanged()
!
在