繁体   English   中英

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

[英]How to save my ListView when app closes

我已经尝试使用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);
        }
    }
}

* 查看通行证 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();
        }

    }
}

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

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

和 Gson 共享首选项,简单多了。

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

Android:应用程序关闭后将值保留在列表中

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM