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