在这个项目中,用到RecyclerView列表展示可能会有很多,但是每个不同的列表都给一个适配器的话就显得杂乱冗余。在这里我们来封装一下RecyclerView,让它能显示不同的列表,只要传入相应的model类就好了。
- 创建CommonAdapter
package com.example.framework.adapter;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
/**
* Created By LicaiWen
* To DO:
*/
public class CommonAdapter<T> extends RecyclerView.Adapter<CommonViewHolder> {
private List<T> mlist;
private OnBindDataListener<T> onBindDataListener;
private OnMoreBindDataListener<T> onMoreBindDataListener;
//第一个构造函数,创建单type的CommonAdapter
public CommonAdapter(List<T> mlist, CommonAdapter.OnBindDataListener<T> onBindDataListener) {
this.mlist = mlist;
this.onBindDataListener = onBindDataListener;
}
//第二个构造函数,创建多type的CommonAdapter
public CommonAdapter(List<T> mlist, CommonAdapter.OnMoreBindDataListener<T> onMoreBindDataListener) {
this.mlist = mlist;
this.onMoreBindDataListener = onMoreBindDataListener;
}
//这个函数借ViewHolder的构造函数创建ViewHolder的实例并返回
@Override
public CommonViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// 需要外面给布局文件,现在还不知道,所以在OnBindDataListener里面获取传入的id,CommonViewHolder里创建静态方法,传入布局id
int layoutId = onBindDataListener.getLayoutId(viewType);
CommonViewHolder commonViewHolder = CommonViewHolder.getCommonViewHolder(parent, layoutId);
return commonViewHolder;
}
//holder是当前选项的ViewHolder,position是当前选项,该函数是具体展示holder中的组件
// 但是holder中有什么组件未知,所以在onBindDataListener里面bindViewHolder
@Override
public void onBindViewHolder(CommonViewHolder holder, int position) {
// 将当前的model,holder,type类型(单type返回0,多type返回类型值),当前位置抛出去
onBindDataListener.onBindViewHolder(mlist.get(position), holder, getItemViewType(position), position);
}
@Override
public int getItemCount() {
return mlist == null ? 0 : mlist.size();
}
//如果是多type的CommonAdapter需要获取当前item的type类型
@Override
public int getItemViewType(int position) {
if (onMoreBindDataListener != null) {//说明是创建了多type的CommonAdapter
onMoreBindDataListener.getItemType(position);
}
// 如果不是多type的返回0
return 0;
}
//绑定数据
public interface OnBindDataListener<T> {
void onBindViewHolder(T model, CommonViewHolder commonViewHolder, int type, int position);
int getLayoutId(int type);
}
//绑定多类型数据
public interface OnMoreBindDataListener<T> extends OnBindDataListener<T> {
//获取多type的当前选项的类型
int getItemType(int position);
}
}
- 创建CommonViewHolder类
package com.example.framework.adapter;
import android.content.Context;
import android.graphics.Color;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.framework.helper.GlideHelper;
/**
* Created By LicaiWen
* To DO:
*/
public class CommonViewHolder extends RecyclerView.ViewHolder {
//viewHolder中组件的集合
private SparseArray<View> mViews;
// 当前viewholder
private View mContentView;
public CommonViewHolder(View itemView) {
super(itemView);
mViews = new SparseArray<>();
mContentView = itemView;
}
// 返回得到的viewholder;
public static CommonViewHolder getCommonViewHolder(ViewGroup parent, int layoutId) {
return new CommonViewHolder(View.inflate(parent.getContext(), layoutId, null));
}
// 提供给外部访问view holder中组件的方法
public <T extends View> T getView(int viewId) {
View view = mViews.get(viewId);
if (view == null) {
view = mContentView.findViewById(viewId);
mViews.put(viewId, view);
}
return (T) view;
}
// 设置文本
public CommonViewHolder setText(int viewId, String text) {
TextView textView = getView(viewId);
textView.setText(text);
return this;
}
// 设置图片链接
public CommonViewHolder setImageUrl(int viewId, String url, Context context) {
ImageView imageView = getView(viewId);
GlideHelper.loadUrl(context, url, imageView);
return this;
}
// 设置图片
public CommonViewHolder setImage(int viewId, int resId) {
ImageView imageView = getView(viewId);
imageView.setImageResource(resId);
return this;
}
// 设置背景颜色
public CommonViewHolder setBackground(int viewId, int color) {
ImageView imageView = getView(viewId);
imageView.setBackgroundColor(color);
return this;
}
// 设置文本颜色
public CommonViewHolder setTextColor(int viewId, int color) {
TextView textView = getView(viewId);
textView.setTextColor(color);
return this;
}
// 设置空间显示隐藏
public CommonViewHolder setTextVisiblity(int viewId, boolean isShow) {
TextView textView = getView(viewId);
textView.setVisibility(isShow ? View.VISIBLE : View.GONE);
return this;
}
}
- 在Activity调用
package com.example.meet.UI;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.View;
import android.widget.Toast;
import com.example.framework.Manager.BmobManager;
import com.example.framework.adapter.CommonAdapter;
import com.example.framework.adapter.CommonViewHolder;
import com.example.framework.base.BaseBackActivity;
import com.example.framework.bmob.MyBmobUser;
import com.example.framework.utils.CommonUtils;
import com.example.framework.utils.LogUtils;
import com.example.meet.Adapter.AddFriendAdapter;
import com.example.meet.R;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import cn.bmob.v3.exception.BmobException;
import cn.bmob.v3.listener.FindListener;
import model.AddFriendModel;
public class AddContactActivity extends BaseBackActivity {
public static final int TYPE_TITLE = 0;
public static final int TYPE_CONTENT = 1;
private RecyclerView recyclerView_contact;
private Map<String, String> commonViewHolder = new HashMap<>();
//private AddFriendAdapter addFriendAdapter;
private CommonAdapter<AddFriendModel> adapter;
// private CommonViewHolder viewHolder;
private List<AddFriendModel> mlist;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_contact);
initView();
}
private void initView() {
recyclerView_contact = (RecyclerView) findViewById(R.id.recycleview_contact);
recyclerView_contact.setLayoutManager(new LinearLayoutManager(this));
//每个item间的横线
recyclerView_contact.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
mlist = new ArrayList<>();
// addFriendAdapter=new AddFriendAdapter(this,mlist);
adapter = new CommonAdapter<>(mlist, new CommonAdapter.OnBindDataListener<AddFriendModel>() {
@Override
public void onBindViewHolder(AddFriendModel model, CommonViewHolder commonViewHolder, int type, int position) {
//设置头像
commonViewHolder.setImageUrl(R.id.circleImageView_item, model.getPhoto(), AddContactActivity.this);
// 设置性别
commonViewHolder.setImage(R.id.iv_sex, model.isSex() ? R.drawable.img_boy_icon : R.drawable.img_girl_icon);
//设置昵称
commonViewHolder.setText(R.id.tv_nickName, model.getNickName());
// 设置简介
commonViewHolder.setText(R.id.tv_desc, model.getDesc());
// 设置联系可见
if (model.isContact()) {
commonViewHolder.getView(R.id.ll_contact_info).setVisibility(View.VISIBLE);
commonViewHolder.setText(R.id.contact_name, model.getContactName());
commonViewHolder.setText(R.id.contact_phone, model.getContactPhone());
}
}
@Override
public int getLayoutId(int type) {
return R.layout.layout_search_content_item;
}
});
// recyclerView_contact.setAdapter(addFriendAdapter);
recyclerView_contact.setAdapter(adapter);
/*addFriendAdapter.setClickListener(new AddFriendAdapter.OnClickListener() {
@Override
public void onClick(int position) {
Toast.makeText(AddContactActivity.this, "你点击了item", Toast.LENGTH_SHORT).show();
}
});*/
loadContact();
loadUser();
}
private void loadUser() {
if (commonViewHolder.size() > 0) {
/*for (final Map.Entry<String,String> entry:map.entrySet()) {
LogUtils.i(entry.getValue());
BmobManager.getBmobManagerInstance().queryMyBmobUserByPhone(entry.getValue(), new FindListener<MyBmobUser>() {
@Override
public void done(List<MyBmobUser> list, BmobException e) {
LogUtils.i("size"+list.size());
if (e == null) {
LogUtils.i(list.size()+"");
if(!CommonUtils.isEmpty(list)) {
MyBmobUser myBmobUser = list.get(0);
addContent(myBmobUser, entry.getKey(), entry.getValue());
}
} else {
Toast.makeText(AddContactActivity.this, "读取联系人失败" + e.toString(), Toast.LENGTH_SHORT).show();
}
}
});
}*/
for (final Map.Entry<String, String> entry : commonViewHolder.entrySet()) {
//过滤:判断你当前的号码在私有库是否存在
/* if (userListPhone.contains(entry.getValue())) {
continue;
}*/
BmobManager.getBmobManagerInstance().queryMyBmobUserByPhone(entry.getValue(), new FindListener<MyBmobUser>() {
@Override
public void done(List<MyBmobUser> list, BmobException e) {
if (e == null) {
if (!CommonUtils.isEmpty(list)) {
LogUtils.i("load..." + list.get(0).toString());
MyBmobUser imUser = list.get(0);
addContent(imUser, entry.getKey(), entry.getValue());
}
adapter.notifyDataSetChanged();
}
}
});
}
}
}
//加载联系人
private void loadContact() {
String name;
String phone;
Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
while (cursor.moveToNext()) {
name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
phone = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
phone = phone.replace(" ", "").replace("-", "");
LogUtils.i(name + phone);
commonViewHolder.put(name, phone);
}
}
//用于显示数据内容
public void addContent(MyBmobUser myBmobUser, String name, String phone) {
AddFriendModel addFriendModel = new AddFriendModel();
addFriendModel.setType(AddFriendAdapter.TYPE_CONTENT);
addFriendModel.setUserId(myBmobUser.getObjectId());
addFriendModel.setPhoto(myBmobUser.getPhoto());
addFriendModel.setAge(myBmobUser.getAge());
addFriendModel.setDesc(myBmobUser.getDoc());
addFriendModel.setNickName(myBmobUser.getNickName());
addFriendModel.setSex(myBmobUser.isSex());
//添加联系人
addFriendModel.setContact(true);
addFriendModel.setContactName(name);
addFriendModel.setContactPhone(phone);
mlist.add(addFriendModel);
//刷新适配器
}
}
效果: