2013-09-28 38 views
1

我想使用SharedPreferences來存儲來自ArrayList的數據。但我迷路了。我正在使用for循環來檢索數據並將其存儲在listview中。另外,當我按下按鈕時,首選項被存儲。無法使用循環和arrayadapter從sharedpreferences檢索數據

package com.example.todolist; 

import java.util.ArrayList; 

import android.app.Activity; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 
import android.os.Bundle; 
import android.view.KeyEvent; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.View.OnKeyListener; 
import android.view.Window; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

    ArrayList<String> items; 
    ArrayAdapter<String> adapter; 
    ListView l; 
    EditText et; 
    Button bt, bt2; 
    Object ob; 
    int i = 0, k = 0; 

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

     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 

     setContentView(R.layout.activity_main); 

     et = (EditText) findViewById(R.id.editText1); 
     bt = (Button) findViewById(R.id.button1); 
     bt2 = (Button) findViewById(R.id.button2); 
     l = (ListView) findViewById(R.id.listView1); 

     items = new ArrayList<String>(); 

     adapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, items); 

     l.setAdapter(adapter); 

     bt.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 

       action(); 

       SharedPreferences prfs = getSharedPreferences("PREFS", i); 
       Editor edit = prfs.edit(); 

       edit.putString("" + i, et.getText().toString()); 
       edit.putInt("counter", i); 
       edit.commit(); 

       et.setText(""); 

       k = prfs.getInt("counter", 0); 
       i = i + 1; 

      } 

     }); 

     for (i = 0; i < k + 1; i++) { 

      SharedPreferences prfs = getSharedPreferences("PREFS", i); 
      items.add(0, (String) prfs.getString("" + i, "Null")); 
      adapter.notifyDataSetChanged(); 

     } 

    } 

    private void action() { 
     // TODO Auto-generated method stub 

     if (!("".equals(et.getText().toString()))) { 

      ob = et.getText().toString(); 
      items.add(0, (String) ob); 
      adapter.notifyDataSetChanged(); 

     } else { 

      Toast.makeText(getBaseContext(), "Field should not be empty!", 
        Toast.LENGTH_LONG).show(); 
     } 

    } 

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

} 

回答

0

更改爲:

SharedPreferences prfs;//Declare it globally 

放入的onCreate()

prfs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); 

在BT setOnClickListener;

  Editor edit = prfs.edit(); 

      edit.putString("MyString" + String.ValueOf(i), et.getText().toString()); 
      edit.putInt("counter", i); 
      edit.commit(); 

在用於循環getSharedPreferences的

for (i = 0; i < k + 1; i++) { 


      items.add(0, (String) prfs.getString("MyString" + String.ValueOf(i), "Null")); 
      adapter.notifyDataSetChanged(); 

     } 
+0

仍然沒有工作。我猜這些值正在被存儲但沒有被顯示。 – user2574723

+0

嘗試刪除您的for循環並將靜態鍵像「MyString0」&檢查日誌中的值。如果它會顯示值,那麼問題是在for循環。 –

+0

每次登錄你的i&k。 –

0

參數是文件名,模式。不要把我把0.

SharedPreferences prfs = getSharedPreferences("PREFS", 0); 
+0

我也試過這個..我把一個預定義的常量。但它不顯示..如果我在for循環添加語句中放置其他字符串,項目正在顯示。 – user2574723

0

這不使用陣列適配器。我不記得我後必須功勞這一點,但在這裏它是

public void saveArray(int[] value) { 
     SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); 
     SharedPreferences.Editor mEdit = sharedPrefs.edit(); 

     for (int i = 0; i < value.length; i++) { 
     mEdit.putInt("myArrayKey" + i, value[i]); 
     } 
     mEdit.commit(); 
    } 

    public int[] loadArray() { 
     int[] value = new int[Constant.PAGES + 1]; 
     SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); 

     for (int i = 0; i < Constant.PAGES + 1; i++) { 
     String myString = "myArrayKey" + i; 
     value[i] = sharedPrefs.getInt(myString, 0); 
     } 
     return value; 
    } 
0
I assigned the value to k outside the loop and it is working now. Here is the code. Thanks. 


package com.example.todolist; 

import java.util.ArrayList; 

import android.app.Activity; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 
import android.os.Bundle; 
import android.preference.PreferenceManager; 
import android.view.KeyEvent; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.View.OnKeyListener; 
import android.view.Window; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView; 
import android.widget.Toast; 

public class EditList extends Activity implements View.OnClickListener { 

    ArrayList<String> items; 
    ArrayAdapter<String> adapter; 
    Object ob; 

    ListView l; 
    EditText et; 
    Button mAdd, mDelete; 

    int i = 0, k; 

    SharedPreferences prfs; 
    Editor edit; 

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

     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 

     setContentView(R.layout.add_list); 

     initialize(); 

     prfs = PreferenceManager.getDefaultSharedPreferences(this); 

     edit = prfs.edit(); 
     k = prfs.getInt("counter", 0); 

     items = new ArrayList<String>(); 

     adapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, items); 

     l.setAdapter(adapter); 

     mDelete.setOnClickListener(this); 

     mAdd.setOnClickListener(this); 


     for (i = 0; i < k; i++) { 

      items.add(0, (String) prfs.getString(String.valueOf(i), "null")); 
      adapter.notifyDataSetChanged(); 

     } 

    } 

    private void initialize() { 

     et = (EditText) findViewById(R.id.editText1); 
     mAdd = (Button) findViewById(R.id.button1); 
     mDelete = (Button) findViewById(R.id.button2); 

     l = (ListView) findViewById(R.id.listView1); 

    } 

    @Override 
    public void onClick(View arg0) { 
     // TODO Auto-generated method stub 

     switch (arg0.getId()) { 

     case R.id.button1: 
      addItem(); 
      break; 

     case R.id.button2: 
      i = 0; 
      adapter.clear(); 
      edit.clear(); 
      edit.commit(); 
      finish(); 
      break; 

     } 

    } 

    private void addItem() { 

     if (!("".equals(et.getText().toString()))) { 

      ob = et.getText().toString(); 
      items.add(0, (String) ob); 
      adapter.notifyDataSetChanged(); 

      edit.putString(String.valueOf(i), et.getText().toString()); 
      edit.putInt("counter", i + 1); 
      edit.commit(); 

      et.setText(""); 

      i = i + 1; 

     } else { 

      Toast.makeText(getBaseContext(), "Field should not be empty!", 
        Toast.LENGTH_LONG).show(); 
     } 

    } 

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

}