Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.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
Java 为什么listview返回前台后不刷新?_Java_Android_Listview_Arraylist_Notifydatasetchanged - Fatal编程技术网

Java 为什么listview返回前台后不刷新?

Java 为什么listview返回前台后不刷新?,java,android,listview,arraylist,notifydatasetchanged,Java,Android,Listview,Arraylist,Notifydatasetchanged,我正在尝试用两个活动来做一个聊天应用程序。在第一个计划中,有一个简短的列表,其中包含每行最后发送的消息。第二个活动包含所有对话。我使用socket.io,我的问题是,当我单击“上一步”按钮,然后返回到我的应用程序notifyDataSetChanged()时,它停止工作。我的应用程序从与安卓应用程序合作的网站接收来自对话框的消息。在控制台日志中,我看到接收到来自网站的消息,并调用了onTaskComplete()方法,但listview没有刷新。我读到适配器在重新启动活动后丢失了对listvie

我正在尝试用两个活动来做一个聊天应用程序。在第一个计划中,有一个简短的列表,其中包含每行最后发送的消息。第二个活动包含所有对话。我使用socket.io,我的问题是,当我单击“上一步”按钮,然后返回到我的应用程序notifyDataSetChanged()时,它停止工作。我的应用程序从与安卓应用程序合作的网站接收来自对话框的消息。在控制台日志中,我看到接收到来自网站的消息,并调用了onTaskComplete()方法,但listview没有刷新。我读到适配器在重新启动活动后丢失了对listview的引用,但如何在代码中看到我在onResume()方法中创建了一个新适配器。我不明白我做错了什么? 而如果我将抛出超出条件“mSocket.on(“message”,onMessage);”的消息,则返回应用程序后会刷新列表视图,但消息的次数是返回次数的倍数

下面是我的代码,请帮忙

主要活动:

package com.example.seadog.fb_dialog;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Typeface;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;

import io.socket.client.Socket;
import io.socket.emitter.Emitter;

public class MainActivity extends Activity implements MyListener {

    public ListView listView;
    public MyBaseAdapter adapter;

    public TextView textView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        /*
         * Get Socket.io Object
         */

        SocketIO socketIo = new SocketIO();

        Socket mSocket = socketIo.getSocket();  // get socket
        Integer id = socketIo.getId();          // get Website ID

        if(mSocket == null) {

            socketIo.Connection();
            mSocket = socketIo.getSocket();

            mSocket.on("message", onMessage);

        }

        listView = (ListView) findViewById(R.id.listView);


        /*
         * OnItemClickListener
         */

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                Intent intent = new Intent(MainActivity.this, Conversation.class);
                intent.putExtra("item", position);
                startActivity(intent);

                TextView textView = (TextView) view.findViewById(R.id.descitem);
                textView.setTypeface(null, Typeface.NORMAL);

            }

        });

        textView = (TextView) findViewById(R.id.count);

    }

    private Emitter.Listener onMessage = new Emitter.Listener() {

            /*
             * Message Listener
             */

        @Override
        public void call(Object... args) {

            Boolean isset = false;

            try {

                JSONObject object = (JSONObject) args[0];


                String _id = object.getString("_id");
                String message = object.getString("message");

                JSONObject obj = new JSONObject();
                obj.put("direction", "fb-lt");
                obj.put("message", message);
                obj.put("date", "2017-05-29T12:15:49.245Z");


                for(int i = 0; i < arrayList.size(); i++){

                    ListData ld = (ListData) arrayList.get(i);
                    String id = ld.getId();

                    if(_id.equals(id)){

                        JSONArray Data = ld.getData();
                        Data.put(obj);
                        ld.setDescription(message);

                        arrayList.set(i, ld);

                        isset = true;

                        Log.d("LOG", message);
                    }

                }

                if(!isset) {

                    JSONArray jsonArray = new JSONArray();
                    jsonArray.put(obj);

                    ListData ld = new ListData();
                    ld.set_id(_id);
                    ld.setID(1);
                    ld.setTitle("Klient:");
                    ld.setDescription(message);
                    ld.setData(jsonArray);

                    arrayList.add(ld);

                }

                onTaskComplete();

            } catch (JSONException e) {
                e.printStackTrace();
            }

        }

    };


    public void onResume() {

        super.onResume();

        ArrayList clone = (ArrayList) arrayList.clone();
        arrayList.clear();
        arrayList.addAll(clone);

        adapter = new MyBaseAdapter(this, arrayList);
        listView.setAdapter(adapter);

    }

    @Override
    public void onTaskComplete() {

        runOnUiThread(new Runnable() {

            @Override
            public void run () {
                Log.d("LOG:","refresh");
                adapter.notifyDataSetChanged();
            }

        });

    }

}

如果我记得很清楚的话,当你在安卓系统中打开一个新的活动时,这与之前的活动是不同的。 当您按下后退按钮时,它只会终止您所参与的活动并显示上一个活动

在以下情况下,当按下back时,您可以尝试执行所需的操作:

@Override
public void onBackPressed()
{
    //Do your things here  
}

希望我能帮上忙。

您是对的,但当我从第一个活动(隐藏应用程序)按“后退”按钮,然后打开应用程序时,我的列表视图不会刷新。只有当我单击“后退”按钮然后返回时,它才会停止工作,但当我按下“主页”按钮或“购物车视图”然后返回时,它才工作。该应用程序仍在后台运行,并没有真正停止。尝试手动终止它,然后查看是否刷新了listview。尝试添加finish();在onBackPressed()函数中。但每次启动时都需要重新加载所有内容。我不是专家,所以我可能错了:/I我希望我的应用程序在后台运行。它必须像messenger/viber等一样工作。当我收到消息时,声音将播放,我将再次打开我的应用程序。每时每刻都有一个列表视图需要刷新。看看这个,也许它会对你有所帮助。可以在onResume()函数中刷新listview。我在项目中使用了onResume()方法,但不起作用。如何创建对arraylist的新引用?也许这是个问题?看。。。当我第一次打开我的应用程序时,它工作得很好。例如,我从网站发送消息,应用程序接收这些消息。下一步,当我按下后退按钮(应用程序是后台),然后回到前台,此时onResume()方法刷新列表视图,但下一步当我尝试从控制台日志中的网站发送消息时,我看到消息被接收,因为调用了onTaskComplete()方法,但未刷新列表视图。为什么?您想在再次使用返回应用程序时刷新列表视图?是的,因为当应用程序在后台运行时,当我收到新消息时,列表视图无法刷新。ArrayList已更新,但listview尚未更新。所以在来到前台的过程中,我想刷新一个列表视图。
@Override
public void onBackPressed()
{
    //Do your things here  
}