我打电话
adapter.notifyDataSetChanged();
但没有任何反应直到我点击列表视图滚动它,然后列表视图更新。我想让它自动更新..我该怎么办?
我试过这个answer,但它对我不起作用
Obs:我正在使用自定义数组适配器。它是一个聊天应用程序,需要自动更新其在线用户。
以下是我如何使用调用AsyncTask的按钮声明适配器和数组适配器(onCreate),我在AsyncTask内调用notifyDataSetChanged但在onPostExecute
内:
peopleList = (ListView) findViewById(R.id.peopleList);
adapter = new MyAdapter(this, people);
peopleList.setAdapter(adapter);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new ConnectAndLoad(MainActivity.this).execute();
}
});
这是我的适配器:
public class PeopleAdapter extends ArrayAdapter<People> {
private ArrayList<People> events_list = new ArrayList<>();
Context context;
public PeopleAdapter(Context context, ArrayList<People> users) {
super(context, 0, users);
this.context = context;
this.events_list = users;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
People user = getItem(position);
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.people_list, parent, false);
}
TextView tvName = (TextView) convertView.findViewById(R.id.name);
TextView tvStatus = (TextView) convertView.findViewById(R.id.status);
tvName.setText(user.name);
tvStatus.setText(user.status);
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "You Clicked " + events_list.get(position).name, Toast.LENGTH_SHORT).show();
Intent i = new Intent(context, ConversationActivity.class);
i.putExtra("user", events_list.get(position).name);
context.startActivity(i);
}
});
return convertView;
}
}
最后这里是调用notifyDataSetChanged的AsyncTask的onPostExecute,每当用户改变它的存在时,它应该将新用户添加到people列表中,然后调用notifyDataSetChanged(它将新的人添加到列表,它实际上更改了数据集,唯一的问题是,我单击列表视图后才能看到更新的列表!):
protected void onPostExecute(Boolean boo) {
roster.addRosterListener(new RosterListener() {
public void entriesDeleted(Collection<String> addresses) {
}
public void entriesUpdated(Collection<String> addresses) {
}
public void entriesAdded(Collection<String> addresses) {
}
@Override
public void presenceChanged(Presence presence) {
people.add(new People(presence.getFrom(), presence.getStatus()));
adapter.notifyDataSetChanged();
}
});
dialog.dismiss();
}
编辑:我按照@savepopulation说的那样,将adapter.notifyDataSetChanged();
带出了存在更改并且有效。但是我需要将它放在presenceChanged中,以便在用户上线和离线时更新。如果你们有任何建议,请告诉我们:)
答案 0 :(得分:0)
我们走了。
首先,如果您的数据发生变化,或者您的某些方法(如adapter.notifyDataSetChanged();
或ListView
仅适用,请致电RecyclerView
onClick
或onItemClickListene
单击视图或滚动视图后,这意味着某些内容阻止了您的UiThread,并且在您中断后UiThread被取消阻止。
可能是您的通知电话造成的。您在上一次通知操作完成之前尝试通知适配器。我认为这会导致你的问题。
我不知道是否有其他有效的方式来实现您尝试实施的内容,但如果您必须通过presenceChanged
方法通知,只需通知项目哪一个&# 39;数据已经改变。
您可以使用RecyclerView
代替ListView
并使用notifyItemChanged
方法。只需通知更改的项目。不要通知整个清单。这可以解决您的问题。您也可以从onPresenceChanged
方法中获取通知方法。这解决了您的问题,但它不适合您的业务。
如果通知单个更改的项目不适合您,您可能需要更改您的实施。
祝你好运。