我的ListView仅在我点击

时间:2015-12-07 20:14:11

标签: android listview android-listview

我打电话

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中,以便在用户上线和离线时更新。如果你们有任何建议,请告诉我们:)

1 个答案:

答案 0 :(得分:0)

我们走了。

首先,如果您的数据发生变化,或者您的某些方法(如adapter.notifyDataSetChanged();ListView仅适用,请致电RecyclerView onClickonItemClickListene单击视图或滚动视图后,这意味着某些内容阻止了您的UiThread,并且在您中断后UiThread被取消阻止。

可能是您的通知电话造成的。您在上一次通知操作完成之前尝试通知适配器。我认为这会导致你的问题。

我不知道是否有其他有效的方式来实现您尝试实施的内容,但如果您必须通过presenceChanged方法通知,只需通知项目哪一个&# 39;数据已经改变。

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

如果通知单个更改的项目不适合您,您可能需要更改您的实施。

祝你好运。