【问题标题】:My ListView only updates after I click on it我的 ListView 仅在我点击后更新
【发布时间】: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


【解决方案1】:

我们开始吧。

首先,当您调用adapter.notifyDataSetChanged(); ListViewRecyclerView 时,如果您的数据发生更改或您的某些方法(例如onClickonItemClickListener)仅在您单击视图或滚动视图后才有效这意味着有东西阻塞了你的 UiThread 并且你的 UiThread 在你中断后会被解除阻塞。

这可能是由您的通知调用引起的。您正在尝试在之前的通知操作完成之前通知您的适配器。我认为这会导致您的问题。

我不知道是否有其他有效的方法来实现您尝试实现的内容,但如果您必须在 presenceChanged 方法中通知,只需通知项目哪些数据已更改。

您可以使用RecyclerView 代替ListView 并使用notifyItemChanged 方法。只需通知更改的项目。不要通知整个列表。这可以解决您的问题。您也可以从onPresenceChanged 方法中取出通知方法。这可以解决您的问题,但不适合您的业务。

如果通知单个更改项对您不起作用,您可能需要更改您的实现。

祝你好运。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    相关资源
    最近更新 更多