Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 我的ListView仅在单击后更新_Android_Listview_Android Listview - Fatal编程技术网

Android 我的ListView仅在单击后更新

Android 我的ListView仅在单击后更新,android,listview,android-listview,Android,Listview,Android Listview,我打电话 但在我单击列表视图滚动它之前,什么都不会发生,然后列表视图会更新。我希望它能自动更新。。我该怎么办 我试过这个,但对我不起作用 Obs:我正在使用自定义阵列适配器。它是一个聊天应用程序,需要自动更新其在线用户 下面是我如何使用调用AsyncTask的按钮声明适配器和数组适配器(onCreate),我在AsyncTask内调用notifyDataSetChanged,但在onPostExecute内调用notifyDataSetChanged: adapter.notifyDataSet

我打电话

但在我单击列表视图滚动它之前,什么都不会发生,然后列表视图会更新。我希望它能自动更新。。我该怎么办

我试过这个,但对我不起作用

Obs:我正在使用自定义阵列适配器。它是一个聊天应用程序,需要自动更新其在线用户

下面是我如何使用调用AsyncTask的按钮声明适配器和数组适配器(onCreate),我在AsyncTask内调用notifyDataSetChanged,但在onPostExecute内调用notifyDataSetChanged:

adapter.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();
        }
    });
公共类PeoConceAdapter扩展了ArrayAdapter{
private ArrayList events_list=new ArrayList();
语境;
公共应用程序(上下文、ArrayList用户){
超级(上下文,0,用户);
this.context=上下文;
this.events_list=用户;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
人员用户=getItem(职位);
if(convertView==null){
convertView=LayoutInflater.from(getContext()).flate(R.layout.people\u 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(用户状态);
convertView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
Toast.makeText(上下文,“您单击了”+events_list.get(position).name,Toast.LENGTH_SHORT.show();
意图i=新意图(上下文、会话活动.class);
i、 putExtra(“用户”,事件列表.get(位置).name);
背景。起始触觉(i);
}
});
返回视图;
}
}
最后,这里是调用notifyDataSetChanged的AsyncTask的onPostExecute,每次用户的状态发生更改时,都应该将新用户添加到人员列表中,然后调用notifyDataSetChanged(它将新的人员添加到列表中,并实际更改了数据集,唯一的问题是,我只在单击listview后看到更新的列表!):

受保护的void onPostExecute(布尔boo){
花名册.addRosterListener(新花名册Listener(){
已删除公共无效条目(集合地址){
}
已更新公共无效条目(收集地址){
}
添加了公共无效项(收款地址){
}
@凌驾
公共无效状态已更改(状态){
添加(新联系人(presence.getFrom(),presence.getStatus());
adapter.notifyDataSetChanged();
}
});
dialog.dismise();
}
编辑:我按照@savepopulation所说的操作,将
适配器。notifyDataSetChanged();
从presenceChanged中取出,它工作了。但我需要将其放在presenceChanged中,以便在用户联机和脱机时更新。如果你们有任何建议,请告诉我:)

开始

首先,当您调用
adapter.notifyDataSetChanged()时
ListView
RecyclerView
如果您的数据更改或某些方法(如
onClick
onItemClickListene
r)仅在您单击视图或滚动视图后才起作用,这意味着某些内容正在阻止您的UiThread,并且在您中断后,您的UiThread将被解锁

这可能是由你的通知电话引起的。您正在尝试在上一个通知操作完成之前通知适配器。我认为这是你的问题所在

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

您可以使用
RecyclerView
而不是
ListView
并使用
notifyItemChanged
方法。只需通知更改的项目。不要通知整个列表。这可以解决你的问题。您还可以将notify方法从
onPresenceChanged
方法中删除。这解决了您的问题,但不适合您的业务

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


祝你好运。

请添加更多代码。您是否可以在声明适配器和阵列适配器(如果您有自定义适配器)的位置添加活动文件?您是否在异步方法中调用它?->需要使用runUIThread()没有代码很难找到解决方案,但根据您的帖子,还有一个操作会阻塞您的ui线程。ı建议您检查如何更改适配器数据。您可以将代码发送到更改适配器项目的位置吗?@savepopulation添加了代码,请检查out@TimCastelijns添加了代码,请检查它,是的,我使用AsyncTask,但我在onPostExecute中调用它,我假设它在UI线程上运行?
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;
    }
}
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();
}