忘记上次写博客是多久之前. 最近有优化项目中的登录模块 之前用户登录的账号密码都是在数据库中保存的,但我感觉就账号密码用sharedpreferences(以下简称SP)保存就够了.所以才有了这篇博客的记录.

我们在平常使用中大多数时候用sp来保存基本数据类型. 但今天我们来做一个类似qq登录一样可以保存多个账号和密码的功能.

下面我们开始

  • 先简单的画个布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <EditText
            android:id="@+id/et_id"
            android:layout_width="230dp"
            android:layout_height="wrap_content" />

        <ImageView
            android:id="@+id/iv_show_dialog"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:background="@mipmap/haier_ic_arrow_down" />
    </LinearLayout>

    <EditText
        android:id="@+id/et_pwd"
        android:layout_width="230dp"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/btn_set"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="保存" />

    <Button
        android:id="@+id/btn_get"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="取出" />
</LinearLayout>
  • 我们来看一下sp怎么保存list-----可以看到是把list转成json数据来保存
/**
     * 保存List
     *
     * @param tag 
     * @param datalist
     */
    public void setDataList(String tag, List<People> datalist) {
        if (null == datalist || datalist.size() <= 0)
            return;

        Gson gson = new Gson();
        //转换成json数据,再保存
        String strJson = gson.toJson(datalist);
        editor.clear();
        editor.putString(tag, strJson);
        editor.commit();
    }
  • 然后就是取了
/**
     * 获取List
     *
     * @param tag
     * @return
     */
    public List<People> getDataList(String tag) {
        List<People> datalist = new ArrayList<>();
        String strJson = preferences.getString(tag, null);
        if (null == strJson) {
            return datalist;
        }
        Gson gson = new Gson();
        datalist = gson.fromJson(strJson, new TypeToken<List<People>>() {
        }.getType());
        return datalist;

    }

还记的刚才我们保存的时候是把list转成了json 来进行保存的,那取的话 我们一步肯定是要把这个保存的json数据取出来它是一个String类型.然后只要对String进行解析就可以拿到里面之前保存的数据了

      就是这句话

datalist = gson.fromJson(strJson, new TypeToken<List<People>>() {
        }.getType());

 我们还需要创建一个保存账号密码的实体类

public class People implements Serializable{

    private String name;
    private String pwd;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
}

接下来我们来写Activity 来看看怎么使用

findViewById(R.id.btn_set).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                   user = new People();
                    user.setName(et_id.getText().toString());
                    user.setPwd(et_pwd.getText().toString());
                    classTests.add(user);
                    SpdataSave.setDataList("login", classTests);
             }
        });

嗯就这么几行代码就保存完了 来看一下 首先

1.获取去editText中的name和password

2.通过实体类set方法 保存.

3.把实体类添加到list中

4.然后把list存入到sp中 

这样就把list保存到sp中了.但是聪明的你会发现这么保存时没有去重的,就是 只要你输入什么 它就给你保存什么,很显然我们不需要保存重复的数据. 下面我就来看看怎么去重

findViewById(R.id.btn_set).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                user = new People();
                if (classTests.size() == 0) {
                    user.setName(et_id.getText().toString());
                    user.setPwd(et_pwd.getText().toString());
                    classTests.add(user);
                    SpdataSave.setDataList("login", classTests);
                } else {
                    List<String> userNames = new ArrayList<>();
                    for (int i = 0; i < classTests.size(); i++) {
                        userNames.add(classTests.get(i).getName());
                    }
                    boolean contains = userNames.contains(et_id.getText().toString());
                    if (contains == false) {
                        user.setName(et_id.getText().toString());
                        user.setPwd(et_pwd.getText().toString());
                        classTests.add(user);
                        SpdataSave.setDataList("javaBean", classTests);
                        Log.e("AYd", "" + classTests.contains(et_id.getText().toString()));
                    }

                }
            }
        });

首先当list的size为0时 我们就正常保存就可以..我们看else里面 在代码中 我又创建了一个list ,这个list是干啥的呢? 没错 我把之前保存账号密码的那个list里面的name全部遍历存到了这个userNames中,为什么要怎么操作了? 接着往下看.我们都知道 判断list中是否包含某个元素可以用 contanis 来判断.这里我就用它来判断 用户输入的这个name在 userNames 这个list中是否存在.如果不存在就把他存进去.存在就保存了.

  • 最后看看取 的代码
classTests = SpdataSave.getDataList("login");
        if (classTests.size() > 0) {
            Log.e("AYD", classTests.size() + "");
            et_id.setText(classTests.get(classTests.size() - 1).getName());
            et_pwd.setText(classTests.get(classTests.size() - 1).getPwd());
        }

很简单..这里呢 我取的是 最后一个登陆的账号和密码

  • 还有显示在popupwindow上的 我下面把Adapter代码贴出来 很简单..
class PopListAdapter extends BaseAdapter {
        List<People> list;
        public PopListAdapter(List<People> list) {
            this.list = list;
        }
        @Override
        public int getCount() {
            return null == list ? 0 : list.size();
        }

        @Override
        public Object getItem(int location) {
            return list.get(location);
        }

        @Override
        public long getItemId(int arg0) {
            return arg0;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup group) {
            ViewHolder viewHolder;
            if (convertView == null) {
                viewHolder = new ViewHolder();
                convertView = LayoutInflater.from(SpActivity.this).inflate(R.layout.pop_username_list_item, group, false);
                viewHolder.tv_username =convertView.findViewById(R.id.tv_username);
                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
            final People bean = list.get(position);

            if (bean == null) {
                viewHolder.tv_username.setText("没有任何账号");
            } else {
                viewHolder.tv_username.setText(bean.getName());
            }
            convertView.setClickable(true);

            convertView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    try {
                        if (null != classTests && classTests.size() > 0) {
                            people = classTests.get(position);
                            et_id.setText(people.getName());
                            if (people.getPwd() != null && !people.getPwd().equals("")) {
                                et_pwd.setText(people.getPwd());
                            } else {
                                et_pwd.setText("");
                            }
                            et_pwd.requestFocus();
                        }
                        popupWindowDissmiss();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
            return convertView;
        }
    }
    class ViewHolder {
        private TextView tv_username;
        private ImageButton ivb_clean;
    }

看完有帮助就点个赞吧~
补充: 由于当时 忘记删掉 HaierUserCenterSDK:3.3.8 这个sdk 的依赖, 导致跑项目的时候会报错,直接删掉依赖就可以,抱歉

  • Demo下载看这里.........