App登录保存多个账号-----sharedpreferences保存list

忘记上次写博客是多久之前. 最近有优化项目中的登录模块 之前用户登录的账号密码都是在数据库中保存的,但我感觉就账号密码用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下载看这里.........

 

  • 10
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值