【问题标题】:How to save my ListView when app closes应用程序关闭时如何保存我的 ListView
【发布时间】:2017-01-13 19:13:25
【问题描述】:

我尝试过同时使用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();
        }

    }
}

【问题讨论】:

标签: java android sharedpreferences android-internal-storage


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我使用共享首选项来关闭我的 ArrayLists,感谢指导人员! 用这个作为我的答案:

        Android: keep values in list after app shutdown

        static ArrayList<String> SavedCustomPasswords = new ArrayList<>();
        

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

        【讨论】:

          猜你喜欢
          • 2017-08-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-23
          • 1970-01-01
          • 2020-03-06
          • 2014-08-06
          相关资源
          最近更新 更多