【发布时间】:2015-12-07 20:14:11
【问题描述】:
我打电话
adapter.notifyDataSetChanged();
但是在我单击列表视图滚动它之前什么都没有发生,然后列表视图会更新。我希望它自动更新.. 我该怎么办?
我已经尝试过这个answer,但它对我不起作用
Obs:我正在使用自定义数组适配器。它是一款需要自动更新在线用户的聊天应用。
以下是我如何使用调用 AsyncTask 的按钮声明适配器和数组适配器 (onCreate),我在 AsyncTask 内部但在 onPostExecute 内部调用 notifyDataSetChanged:
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,每次用户的状态发生变化时,都应该将新用户添加到人员列表中,然后调用 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 中取出,并且成功了。但我需要将它放在 PresenceChanged 中,以便在用户上线和下线时更新。如果你们有什么建议,请告诉我:)
【问题讨论】:
-
请添加更多代码。您能否在声明适配器和数组适配器的位置添加您的活动文件(如果您有自定义的)
-
你是在异步方法中调用它吗? -> 需要使用runUIThread()
-
很难找到没有代码的解决方案,但根据您的帖子,还有其他操作会阻塞您的 ui 线程。我建议您检查如何更改适配器数据。你能把代码发送到你更改适配器项目的地方吗?
-
@savepopulation 添加了代码,请查看
-
@TimCastelijns 添加了代码,请检查一下,是的,我正在使用 AsyncTask,但我在 onPostExecute 内部调用它,我假设它在 UI 线程上运行?
标签: android listview android-listview