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