在android中调用onDestroy()然后调用onCreate()后恢复自定义listview和数据

在android中调用onDestroy()然后调用onCreate()后恢复自定义listview和数据,android,android-listview,android-activity,android-adapter,custom-adapter,Android,Android Listview,Android Activity,Android Adapter,Custom Adapter,我有一个带有IM样式页面的应用程序,文本使用自定义listview显示 当我离开活动并返回时,我仍然希望listview中包含我的所有数据。到目前为止,我已尝试使用onSavedInstance和onRestoredInstance保存arraylist的内容,然后在onRestoredInstance中再次设置适配器,但这不起作用 以下是我的活动代码: private ArrayList<String> nameList = new ArrayList<String>

我有一个带有IM样式页面的应用程序,文本使用自定义listview显示

当我离开活动并返回时,我仍然希望listview中包含我的所有数据。到目前为止,我已尝试使用onSavedInstance和onRestoredInstance保存arraylist的内容,然后在onRestoredInstance中再次设置适配器,但这不起作用

以下是我的活动代码:

private ArrayList<String> nameList = new ArrayList<String>();
    private ArrayList<String> messageList = new ArrayList<String>();
    private ArrayList<String> timeList = new ArrayList<String>();

    Button send = (Button) findViewById(R.id.chat_send);
    EditText send = (EditText) findViewById(R.id.edit_text);
    ListView chat_list = (ListView) findViewById(R.id.chat_list);
    MyCustomArrayAdapter myArrayAdapter = new MyCustomArrayAdapter(this, messageList, nameList,
            timeList, receiverName, senderName, language_chosen);

    chat_list.setAdapter(myArrayAdapter);       

    send.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            String new_text = edit_text.getText().toString();
            String sys_time = new Time(System.currentTimeMillis())
                    .toString();
            timeList.add(sys_time);
            messageList.add(new_text);
            nameList.add(username);
            myArrayAdapter.notifyDataSetChanged();
            chat_list.setSelection(chat_list.getChildCount()-1);
        }
    });
private ArrayList nameList=new ArrayList();
private ArrayList messageList=new ArrayList();
private ArrayList timeList=new ArrayList();
按钮发送=(按钮)findViewById(R.id.chat\u发送);
EditText send=(EditText)findviewbyd(R.id.edit\u text);
ListView聊天列表=(ListView)findViewById(R.id.chat\u列表);
MyCustomArrayAdapter myArrayAdapter=新建MyCustomArrayAdapter(此、消息列表、名称列表、,
时间列表、接收人姓名、发送者姓名、所选语言);
chat_list.setAdapter(myArrayAdapter);
send.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
String new_text=编辑_text.getText().toString();
字符串sys\u time=新时间(System.currentTimeMillis())
.toString();
添加(系统时间);
messageList.add(新文本);
名称列表。添加(用户名);
myArrayAdapter.notifyDataSetChanged();
chat_list.setSelection(chat_list.getChildCount()-1);
}
});
这是我的适配器的代码

public MyCustomArrayAdapter(Context context, ArrayList<String> planetList,
        ArrayList<String> NameList, ArrayList<String> TimeList,
        String receiver, String sender, String language) {
    super(context, R.layout.custom_chat_layout, planetList);
    this.context = context;
    messageList = planetList;
    nameList = NameList;
    timeList = TimeList;
    receiverName = receiver;
    senderName = sender;
    language_chosen = language;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    holder = new ViewHolder();

    rowView = inflater.inflate(R.layout.custom_chat_layout, parent, false);
    holder.chat_name = (TextView) rowView
            .findViewById(R.id.custom_chat_name);
    holder.chat_time = (TextView) rowView
            .findViewById(R.id.custom_chat_timestamp);
    holder.chat_text = (TextView) rowView
            .findViewById(R.id.custom_chat_text);


    holder.chat_name.setText(nameList.get(position));
    holder.chat_time.setText(timeList.get(position));
    holder.chat_text.setText(messageList.get(position));

    return rowView;
}

static class ViewHolder {
    TextView chat_name;
    TextView chat_time;
    TextView chat_text;
    RelativeLayout relative;
    RelativeLayout relative1;
}
public MyCustomArrayAdapter(上下文、ArrayList planetList、,
ArrayList名称列表,ArrayList时间列表,
字符串接收器、字符串发送器、字符串语言){
super(上下文,R.layout.custom_chat_layout,planetList);
this.context=上下文;
messageList=planetList;
名称列表=名称列表;
时间主义者=时间主义者;
接收方名称=接收方;
senderName=发送方;
选择的语言=语言;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
LayoutFlater充气器=(LayoutFlater)上下文
.getSystemService(上下文布局\充气机\服务);
holder=新的ViewHolder();
rowView=充气机。充气(R.layout.custom\u chat\u布局,父级,false);
holder.chat_name=(TextView)行视图
.findviewbyd(R.id.custom\u chat\u name);
holder.chat_time=(文本视图)行视图
.findviewbyd(R.id.custom\u chat\u时间戳);
holder.chat_text=(TextView)行视图
.findviewbyd(R.id.custom\u chat\u text);
holder.chat_name.setText(nameList.get(position));
holder.chat_time.setText(timeList.get(position));
holder.chat_text.setText(messageList.get(position));
返回行视图;
}
静态类视窗夹{
TextView聊天室名称;
文本查看聊天时间;
文本查看聊天室文本;
相对的;相对的;
相对的,相对的1;
}
在: onPause(){ 打开SharedReferences,保存列表。 }

在: onResume(){ 打开SharedReferences,恢复列表,更改设置数据
}

您应该将数据保存在
onPause
中,并在
onResume
中重新填充适配器。即时消息之类的东西应该保存到持久数据存储(例如,SQLite数据库),然后使用
游标或适配器加载。通过使用
LoaderManager
并使用
CursorLoader
加载数据,可以抽象出在
活动
生命周期中维护数据加载的许多细节

听起来你还想在后台运行一个
服务
,它可以接收消息并将即时消息保存到数据存储中,即使
活动
没有焦点。

仅在你的应用程序运行时使用。应用程序停止后,捆绑包中的所有数据都将被释放


您应该使用。

尽管您缺少一些代码,但我认为您只是忘记了保存数据。它被称为SharedReferences,当它的数据量很小时,就像您正在使用的一样。我确实使用onSavedInstance保存了我的ArrayList,但这没有起到任何作用。我是否可以在不实际使用SharedReferences的情况下使用preferences功能保存数据?
onSavedInstance
状态不用于保存持久数据。它不能保证被调用(事实上,
onDestroy
)。这就是为什么您应该在
onPause
onResume
中保存/加载数据。您确实需要将此数据保存到持久数据存储中,然后在需要时从数据存储中重新加载它。无法阻止
活动
被销毁。。。一旦它被销毁,这些数据就会丢失。我重新标记了这个问题。。。确保将来使用
android活动
而不是
activity
(与
android列表视图
android适配器
等相同:)。这会让你的问题得到更多关注,所以使用Android标签的用户。我不明白我没有使用首选项,onDestroy和onCreateyes呢?我已经设置好了服务,它运行良好,我只需要在我离开活动并返回时恢复列表视图。我现在再试一试,将这些数据保存到SQLite数据库或类似的东西会更有意义。如果用户关闭手机怎么办?当他重新打开它时,除非你以某种方式将数据保存到磁盘上,否则无法恢复该数据。。。没有这样做就无法将信息保存在内存中。使用Androids数据库听起来好多了