Android - ListView不保留动态添加的项目

时间:2014-03-11 17:18:31

标签: android listview android-listview android-alertdialog savechanges

我正在创建一个具有ListViewButton的应用,以便向ListView添加新的新项目。 我想要做的是,当用户点击Button AlertDialog时,会弹出包含TextView和两个Buttons的{​​{1}}。用户将在TextView中输入项目的名称,然后点击确定 Button将该项目添加到ListView

我可以使用此代码完成上述所有操作 -

package com.Swap.StudyBuddy;

import java.util.ArrayList;

import android.os.Bundle;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.Dialog;

import android.content.DialogInterface;

import android.graphics.Typeface;

import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;

import android.view.animation.Animation;
import android.view.animation.AnimationUtils;

import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;

public class Add_Topics extends Activity {

AddTopics_MenuAdapter adapter;
ListView topics_list;
ArrayList<String> the_subjects = new ArrayList<String>();
String new_subject;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add__topics);

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

    the_subjects.add("History");
    the_subjects.add("Geography");

    overridePendingTransition(R.anim.reverse_in_left, R.anim.reverse_out_left);

    Animation enter = AnimationUtils.loadAnimation(getBaseContext(), R.anim.upcoming_menu);
    Animation enter_slow = AnimationUtils.loadAnimation(getBaseContext(), R.anim.enter_l2r_slide);

    TextView des = (TextView)findViewById(R.id.des_at);
    TextView title = (TextView)findViewById(R.id.title_at);

    Button add_topic = (Button)findViewById(R.id.add_topic_button);

    Typeface roboto_lt = Typeface.createFromAsset(getAssets(), "Roboto-Light.ttf");

    des.setTypeface(roboto_lt);
    title.setTypeface(roboto_lt);
    add_topic.setTypeface(roboto_lt);

    title.startAnimation(enter);
    des.startAnimation(enter_slow);

    adapter = new AddTopics_MenuAdapter(this, the_subjects);
    topics_list.setAdapter(adapter);
}

public void onClickAddTopic(View v) {
    showDialog(0);
}
protected Dialog onCreateDialog(int id) {
    switch(id) {
    case 0: 
        LayoutInflater li = LayoutInflater.from(this);
        View edt_txt_add_tpc = li.inflate(R.layout.add_topics_res, null);
        edt_txt_add_tpc.requestFocus();
        edt_txt_add_tpc.setSelected(true);
        final EditText tpc_nm = (EditText) edt_txt_add_tpc.findViewById(R.id.topic_name);
        Builder bld = new AlertDialog.Builder(this);
        bld.setIcon(R.drawable.ic_launcher);
        bld.setTitle("Add Topic/Subject");
        bld.setView(edt_txt_add_tpc);
        bld.setPositiveButton("OK", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int whichButon) {
                String new_topic_name = tpc_nm.getText().toString();
                new_subject = new_topic_name;
                adapter = null;
                the_subjects.add(new_topic_name);
                adapter = new AddTopics_MenuAdapter(getBaseContext(), the_subjects);
                adapter.notifyDataSetChanged();
            }

        });
        bld.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int whichButton) {

        }
        });
        return bld.create();
    }
    return null;
} 
@Override
public void onBackPressed() {
    super.onBackPressed();
    overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_left);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_add__topics, menu);
    return true;
    }


}

但是,只要重新加载ListView,修改后的Activity就会丢失所有动态添加的项目。有人请告诉我该怎么做,即使重新加载ListView后新添加的项目仍保留在Activity

先谢谢!!

3 个答案:

答案 0 :(得分:1)

ListViews不会自动保留数据。在onCreate方法中,创建一个ArrayList,向其添加两个字符串,并使用此ArrayList创建一个适配器 - 这样每次再次创建Activity时,将在ListView中显示的数据。

您需要查看storing the data somewhere,例如使用SQLite数据库。然后,可以使用此CursorLoader填充ListView - 请参阅ListView guide以开始使用。

答案 1 :(得分:1)

这取决于您希望将它们存储多长时间:

要在应用程序的生命周期中保存它们,即当应用程序重新启动时,将使用Activity.onPause和Activity.onResume将列表项保存到参数包中。

如果您希望它们在应用重新启动后保持不变,您可以使用首选项或数据库来存储值。

答案 2 :(得分:0)

尽量不要在类的顶部实例化the_subjects。在create方法中实例化它。否则它即使在恢复时也会被实例化我猜