java - 保存 ListView 数据

标签 java android android-listview android-sqlite

我有一个问题,我有一个 ListView ,请转到另一个 Activity 来附加用户值,然后将这些值实现到 ListView 。但是,如果我返回到该 Activity 并附加一组新值,当我返回到 ListView Activity 时,将实现新值,但旧值已被删除。 sqlite数据库能解决这个问题吗?或者它与重新创建的实际列表有关吗?

ListActivity.java

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.personalproject.peter.timerapp.TestingForAlarmData.TestAlarm;

import java.util.ArrayList;
import java.util.List;


public class ListOfAlarms extends ActionBarActivity {
    private static final int RESULT = 1000;

    List<TestAlarm> alarms = new ArrayList<>();
    String title;
    int totalTime;

    ListView listOfAlarms;
    ArrayAdapter<TestAlarm> alarmArrayAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_of_alarms);



       final TextView emptyViewForList = (TextView) findViewById(R.id.emptyTextViewForList);

       listOfAlarms = (ListView) findViewById(R.id.listView);
       alarmArrayAdapter = new ArrayAdapter<>(this,android.R.layout.simple_list_item_1, alarms);
       listOfAlarms.setAdapter(alarmArrayAdapter);

//        if(listOfAlarms.getCount() <= 0){
//            emptyViewForList.setText("No Alarms Currently Available");
//            listOfAlarms.setEmptyView(emptyViewForList);
//        }

        listOfAlarms.setOnItemClickListener(new AdapterView.OnItemClickListener() {
           @Override
         public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
               alarms.get(position);

                Intent clockDownActivity = new Intent(ListOfAlarms.this, CountDownAct.class);
               clockDownActivity.putExtra("Title", title);
               clockDownActivity.putExtra("totalTime", totalTime);
                startActivity(clockDownActivity);
           }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_list_of_alarms, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    public void goToFillOut(View view) {

            Intent goingToFillOut = new Intent(this, Test.class);
            startActivityForResult(goingToFillOut, RESULT);

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == RESULT && resultCode == RESULT_OK){


               title = data.getStringExtra("title");
                totalTime = data.getIntExtra("totalTime", 0);

                alarms.add(new TestAlarm(title, totalTime));

               alarmArrayAdapter.notifyDataSetChanged();

        }
    }


}

第二个 Activity

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;


public class Test extends ActionBarActivity {
    private static final String LOGTAG = "Test.class";
    private static final long timeInterval = 1000;


    private Button complete;
    private EditText titleEditText;
    private EditText hourEditText;
    private EditText minuteEditText;
    private EditText secondEditText;
    public static   int hour;



    public static int minute;
    public static int second;
    public static String title;




    public int actualTimeFiniliazedInMilliSeconds;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);

        titleEditText = (EditText) findViewById(R.id.titleEditText);
        hourEditText = (EditText) findViewById(R.id.hourEditText);
        minuteEditText = (EditText) findViewById(R.id.minuteEditText);
        secondEditText = (EditText) findViewById(R.id.secondEditText);

        complete = (Button) findViewById(R.id.completeButton);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }


    public void saveTimer(View view) {

        if(titleEditText.getText().toString().isEmpty() || hourEditText.getText().toString().isEmpty()
                || minuteEditText.getText().toString().isEmpty() || secondEditText.getText().toString().isEmpty()) {

            Toast.makeText(this, "Oops you forgot one", Toast.LENGTH_LONG).show();
            return;

        }
//            complete.setVisibility(View.GONE);
            title = titleEditText.getText().toString();
            hour = Integer.parseInt(hourEditText.getText().toString().trim());
            minute = Integer.parseInt(minuteEditText.getText().toString().trim());
            second = Integer.parseInt(secondEditText.getText().toString().trim());

            hour *= 3600000;
            minute *= 60000;
            second *= 1000;

        actualTimeFiniliazedInMilliSeconds = hour + minute + second;


        Intent intent = new Intent(Test.this, ListOfAlarms.class);
        intent.putExtra("title", title);
        intent.putExtra("totalTime", actualTimeFiniliazedInMilliSeconds);
        setResult(RESULT_OK, intent);
        finish();

    }



}

报警.java

public class TestAlarm {

    public String title;
    public int totalTime;

    public TestAlarm (String title, int totalTime) {
        this.title = title;
        this.totalTime = totalTime;
    }

    @Override
    public String toString() {
        return title;
    }
}

最佳答案

只需尝试以下步骤,在这种情况下不需要使用 SqliteDB。

创建一个单例类 例如:

    public class Singleton {
      private static Singleton uniqInstance;

      private  List<TestAlarm> mAlarms = new ArrayList<>();

      private Singleton() {
      }

      public static synchronized Singleton getInstance() {
        if (uniqInstance == null) {
          uniqInstance = new Singleton();
        }
        return uniqInstance;
      }

    public void setAllarms(List<TestAlarm> alarms){
        this.mAlarms  = alarms;
   }

public List<TestAlarm> getAllarms(){
  return this.mAlarms;
}

    }

导航到另一个 Activity 时将警报保存在单例类上

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

            Singleton .getInstance().setAllarms(alarms); // Save the Collection

               alarms.get(position);

                Intent clockDownActivity = new Intent(ListOfAlarms.this, CountDownAct.class);
               clockDownActivity.putExtra("Title", title);
               clockDownActivity.putExtra("totalTime", totalTime);
                startActivity(clockDownActivity);
           }
        });

在 onActivityResult 上从单例类中检索保存的集合

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == RESULT && resultCode == RESULT_OK){


               title = data.getStringExtra("title");
                totalTime = data.getIntExtra("totalTime", 0);


               Singleton.getInstance().getAllarms().add(new TestAlarm(title, totalTime));

               this.alarms  = Singleton.getInstance().getAllarms();
               alarmArrayAdapter.notifyDataSetChanged();

        }
    }

关于java - 保存 ListView 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31442855/

相关文章:

java - 在 Symbian S60 中在 PC 启动时启动应用程序

java - Spring中是先创建bean还是先通过构造函数创建实例

java - JFrame 大小不一致

android - 在 res/drawable 文件夹中添加图像后,R.java 文件消失

java - 从使用 GridLayout 设置的 JPanel 中删除最后一行

android - 如果我需要以 Android API 18 为目标,并且某个方法在更高版本的 API 中被弃用,该如何进行?

android - 为什么我的 ViewGroup 的子项上的触摸事件不起作用?

android - 迁移到 New Places SDK Client 找不到符号变量 PLACE_DETECTION_API

java - 删除时 ListView 滚动到顶部

android - 使 ListView 中的整行可点击?