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