无法使用循环和阵列适配器从共享首选项检索数据



我正在尝试使用SharedPreferences来存储来自ArrayList的数据。但我迷路了。我正在使用 for 循环来检索数据并将其存储在列表视图中。此外,当我按下按钮时,首选项也会被存储。

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;
    }
}

getSharedPreferences的参数是文件名,mode。不要把我放0。

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

更改为:

 SharedPreferences prfs;//Declare it globally

把它放在创建()

prfs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());

In setOnClickListener of bt;

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

在 for 循环中

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

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

这不使用阵列适配器。我不记得我必须为此归功于的帖子,但这里是

    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;
    }
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;
    }
}

最新更新