应用关闭时如何保存我的ListView

时间:2017-01-13 19:13:26

标签: java android sharedpreferences android-internal-storage

我已尝试同时使用SharedPrefrences并保存到internal storage,但我无法获得我想要的结果。我取得的唯一成果是崩溃。

我有一个根据用户选项生成自定义密码的应用,然后如果用户单击按钮保存密码,则会将这些密码输入Arraylist。但是,当应用关闭时,所有数据都会丢失。

如何保存已填充的ArrayListListView,以便当用户点击查看密码时,他们可以看到以前保存的密码?

*主要活动JAVA *

package com.jrfapplications.passgen;

import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;

import static com.jrfapplications.passgen.SettingsPage.CustPass;
import static com.jrfapplications.passgen.SettingsPage.FBPass;
import static com.jrfapplications.passgen.SettingsPage.custword;
import static com.jrfapplications.passgen.SettingsPage.custwordend;
import static com.jrfapplications.passgen.SettingsPage.isEndWordChecked;
import static com.jrfapplications.passgen.SettingsPage.isHighCaseChecked;
import static com.jrfapplications.passgen.SettingsPage.isNumbChecked;
import static com.jrfapplications.passgen.SettingsPage.isSpecChecked;
import static com.jrfapplications.passgen.SettingsPage.isStartCustWordChecked;
import static com.jrfapplications.passgen.SettingsPage.passLength;

public class MainActivity extends AppCompatActivity implements Serializable {

    //Buttons
    Button btnGoToSet;
    Button btnGenPass;
    Button btnViewPass;
    Button btnSavePass;

    //TextView
    TextView passView;

    //Saved Pass Array
    static ArrayList<String> SavedCustomPasswords = new ArrayList<>();
    static ArrayList<String> SavedFacebookPasswords = new ArrayList<>();

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

        //Find Buttons
        btnGoToSet = (Button) findViewById(R.id.settingsbtn);
        btnGenPass = (Button) findViewById(R.id.genpass);
        btnViewPass = (Button) findViewById(R.id.viewpassbtn);
        btnSavePass = (Button) findViewById(R.id.SavePassBtn);

        //Find TextView
        passView = (TextView) findViewById(R.id.pwEditTxt);

        //Button Functions
        btnGoToSet.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, SettingsPage.class));
            }
        });

        btnGenPass.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                generatePassword(generateCharSet());
            }
        });

        btnSavePass.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (CustPass == 1){
                    if (SavedCustomPasswords.contains(passView.getText().toString())){
                        Toast.makeText(getApplicationContext(), "Password Already Saved", Toast.LENGTH_SHORT).show();

                    }else{
                        SavedCustomPasswords.add(passView.getText().toString());
                        Toast.makeText(getApplicationContext(), "Password Saved", Toast.LENGTH_SHORT).show();

                    }
                }
                if (FBPass == 1){
                    if (SavedFacebookPasswords.contains(passView.getText().toString())){
                        Toast.makeText(getApplicationContext(), "Password Already Saved", Toast.LENGTH_SHORT).show();
                    }else{
                        SavedFacebookPasswords.add(passView.getText().toString());
                        Toast.makeText(getApplicationContext(), "Password Saved", Toast.LENGTH_SHORT).show();
                    }
                }
            }
        });

        btnViewPass.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, view_pass.class));
            }
        });
    }

    public char[] generateCharSet() {
        String numbers = "0123456789";
        String special = "!£$%^&*()";
        String alphabetsLower = "abcdefghijklmnopqrstuvwxyz";
        String alphabetsUpper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

        // Add lower alphabets by default
        StringBuilder finalCharset = new StringBuilder(alphabetsLower);

        // Add special chars if option is selected
        if (isSpecChecked == 1) {
            finalCharset.append(special);
        }

        // Add upper case chars if option is selected
        if (isHighCaseChecked == 1) {
            finalCharset.append(alphabetsUpper);
        }

        // Add numbers if option is selected
        if (isNumbChecked == 1) {
            finalCharset.append(numbers);
        }

        // build the final character set
        return finalCharset.toString().toCharArray();
    }

    public void generatePassword(char[] charset) {
        final StringBuilder sb = new StringBuilder();
        Random random = new Random();
        for (int i = 0; i < passLength; i++) {
            char c = charset[random.nextInt(charset.length)];
            sb.append(c);
        }

        if (isStartCustWordChecked == 1 && isEndWordChecked == 1){
            final String output = custword + sb.toString() + custwordend;
            passView.setText(output);
        }else if (isStartCustWordChecked == 1){
            final String output = custword + sb.toString();
            passView.setText(output);
        }else if (isEndWordChecked == 1){
            final String output = sb.toString() + custwordend;
            passView.setText(output);
        }else
        {
            final String output = sb.toString();
            passView.setText(output);
        }
    }
}

* VIEW PASS JAVA *

package com.jrfapplications.passgen;

import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class view_pass extends AppCompatActivity {

    private ListView mListView1, mListView2;

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

        mListView1 = (ListView)findViewById(R.id.listView1);
        mListView2 = (ListView)findViewById(R.id.listView2);

        mListView1.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, MainActivity.SavedCustomPasswords));
        mListView2.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, MainActivity.SavedFacebookPasswords));

        ListUtils.setDynamicHeight(mListView1);
        ListUtils.setDynamicHeight(mListView2);
    }


    public static class ListUtils {
        public static void setDynamicHeight(ListView mListView) {
            ListAdapter mListAdapter = mListView.getAdapter();
            if (mListAdapter == null) {
                // when adapter is null
                return;
            }
            int height = 0;
            int desiredWidth = View.MeasureSpec.makeMeasureSpec(mListView.getWidth(), View.MeasureSpec.UNSPECIFIED);
            for (int i = 0; i < mListAdapter.getCount(); i++) {
                View listItem = mListAdapter.getView(i, null, mListView);
                listItem.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED);
                height += listItem.getMeasuredHeight();
            }
            ViewGroup.LayoutParams params = mListView.getLayoutParams();
            params.height = height + (mListView.getDividerHeight() * (mListAdapter.getCount() - 1));
            mListView.setLayoutParams(params);
            mListView.requestLayout();
        }

    }
}

4 个答案:

答案 0 :(得分:1)

这可以通过简单地将生成的密码存储到sqlite数据库中来完成。 https://developer.android.com/training/basics/data-storage/databases.html 您还可以使用游标加载器以获得更好的性能。 https://developer.android.com/guide/components/loaders.html

答案 1 :(得分:0)

尝试使用DBMS,如果您希望将其存储在本地,我建议使用SQL或基于云的系统,如Firebase

答案 2 :(得分:0)

共享偏好和Gson,非常简单。

答案 3 :(得分:0)

我使用共享首选项来保存我的ArrayLists,谢谢你的方向! 用这个作为我的答案:

Android: keep values in list after app shutdown

SavedCustomPasswords = getArray();
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, SavedCustomPasswords);
adapter.notifyDataSetChanged();
public boolean saveArray() {
    SharedPreferences sp = this.getSharedPreferences(SHARED_PREFS_NAME, Activity.MODE_PRIVATE);
    SharedPreferences.Editor mEdit1 = sp.edit();
    Set<String> set = new HashSet<String>();
    set.addAll(SavedCustomPasswords);
    mEdit1.putStringSet("list", set);
    return mEdit1.commit();
}
public void onStop() {
    saveArray();
    super.onStop();
}

public ArrayList<String> getArray() {
    SharedPreferences sp = this.getSharedPreferences(SHARED_PREFS_NAME, Activity.MODE_PRIVATE);

    //NOTE: if shared preference is null, the method return empty Hashset and not null
    Set<String> set = sp.getStringSet("list", new HashSet<String>());

    return new ArrayList<String>(set);
}
int strindex(char s[], char t[]) {
int index,k;

for (int i = 0; s[i] != '\n'; i++) {
    for (int j = i, k = 0; t[k] != '\0' && s[j] == t[k]; j++, k++)
        continue;
    if (k > 0 && t[k] = '\0')
        return i;

    }
}