- 一、直接上代码
- 二、使用
- 三、效果
- 四、注意事项
1、创建CommonAdapter.java
public class CommonAdapterextends RecyclerView.Adapter { private List mList; // 声明绑定数据接口 private OnBindDataListener onBindDataListener; // 声明绑定多类型的数据接口 private OnMoreBindDataListener onMoreBindDataListener; public CommonAdapter(List mList, OnBindDataListener onBindDataListener) { this.mList = mList; this.onBindDataListener = onBindDataListener; } public CommonAdapter(List mList, OnMoreBindDataListener onMoreBindDataListener) { this.mList = mList; this.onBindDataListener = onMoreBindDataListener; this.onMoreBindDataListener = onMoreBindDataListener; } public interface OnBindDataListener { // 绑定ViewHolder void onBindViewHolder(T model,CommonViewHolder viewHolder,int type,int position); // 获取布局Id int getLayoutId(int type); } public interface OnMoreBindDataListener extends OnBindDataListener { // 获取项目类型 int getItemType(int position); } @Override public int getItemViewType(int position) { if (onMoreBindDataListener != null) { return onMoreBindDataListener.getItemType(position); } return 0; } @NonNull @NotNull @Override public CommonViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) { int layoutId = onBindDataListener.getLayoutId(viewType); CommonViewHolder viewHolder = CommonViewHolder.getViewHolder(parent, layoutId); return viewHolder; } @Override public void onBindViewHolder(@NonNull @NotNull CommonViewHolder holder, int position) { onBindDataListener.onBindViewHolder(mList.get(position),holder,getItemViewType(position),position); } @Override public int getItemCount() { return mList == null ? 0 : mList.size(); } }
2、创建CommonViewHolder.java
public class CommonViewHolder extends RecyclerView.ViewHolder {
// 子View的集合,使用SparseArray保存View是比较高效的
private SparseArray mView;
private View mContentView;
public CommonViewHolder(@NonNull @NotNull View itemView) {
super(itemView);
mView = new SparseArray<>();
mContentView = itemView;
}
public static CommonViewHolder getViewHolder(ViewGroup parent, int layoutId){
return new CommonViewHolder(View.inflate(parent.getContext(), layoutId,null));
}
public T getView(int viewId){
View view = mView.get(viewId);
if (view == null) {
view = mContentView.findViewById(viewId);
mView.put(viewId,view);
}
return (T) view;
}
public CommonViewHolder setText(int viewId,String text){
TextView tv = getView(viewId);
tv.setText(text);
return this;
}
public CommonViewHolder setImageUrl(Context context,int viewId, String url){
ImageView iv = getView(viewId);
GlideHelper.loadUrl(context,url,iv);
return this;
}
public CommonViewHolder setImageResource(int viewId,int resId){
ImageView iv = getView(viewId);
iv.setImageResource(resId);
return this;
}
public CommonViewHolder setVisibility(int viewId,int visibility){
LinearLayout ll = getView(viewId);
ll.setVisibility(visibility);
return this;
}
}
二、使用
1、使用前的配置
1.1、创建layout_search_user_item.xml
1.2、创建layout_search_title_item.xml
1.3、创建AddFriendModel.java
public class AddFriendModel {
//类型
private int type;
//标题
private String title;
//内容
private String userId;
private String photo;
private boolean sex;
private int age;
private String nickName;
private String desc;
//联系人
private boolean isContact = false;
private String contactName;
private String contactPhone;
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getPhoto() {
return photo;
}
public void setPhoto(String photo) {
this.photo = photo;
}
public boolean isSex() {
return sex;
}
public void setSex(boolean sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public boolean isContact() {
return isContact;
}
public void setContact(boolean contact) {
isContact = contact;
}
public String getContactName() {
return contactName;
}
public void setContactName(String contactName) {
this.contactName = contactName;
}
public String getContactPhone() {
return contactPhone;
}
public void setContactPhone(String contactPhone) {
this.contactPhone = contactPhone;
}
}
1.4、创建activity_add_friend.xml
2、开始使用
2.1、多种类型
// 标题 public static final int TYPE_TITLE = 0; // 内容 public static final int TYPE_ConTENT = 1; // RecyclerView适配器 private CommonAdaptermAddFriendAdapter; // RecyclerView数据源 private List mList = new ArrayList<>(); @Override protected void initView() { // 列表的实现 // RecyclerView设置布局管理器 binding.mSearchResultView.setLayoutManager(new LinearLayoutManager(this)); // 添加列表项下划线 binding.mSearchResultView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL)); // 设置适配器 mAddFriendAdapter = new CommonAdapter (mList, new CommonAdapter.OnMoreBindDataListener () { @Override public int getItemType(int position) { return mList.get(position).getType(); } @Override public void onBindViewHolder(AddFriendModel model, CommonViewHolder viewHolder, int type, int position) { if (model.getType() == TYPE_TITLE){ // 设置标题 viewHolder.setText(R.id.tv_title,model.getTitle()); }else if (model.getType() == TYPE_CONTENT){ // 设置头像 viewHolder.setImageUrl(AddFriendActivity.this,R.id.iv_photo,model.getPhoto()); // 设置性别 viewHolder.setImageResource(R.id.iv_sex,model.isSex() ? R.drawable.img_boy_icon : R.drawable.img_girl_icon); // 设置昵称 viewHolder.setText(R.id.tv_nickname,model.getNickName()); //点击事件 viewHolder.itemView.setOnClickListener(v -> {}); } } @Override public int getLayoutId(int type) { if (type == TYPE_TITLE) { return R.layout.layout_search_title_item; }else if (type == TYPE_CONTENT){ return R.layout.layout_search_user_item; } return 0; } }); // 添加适配器 binding.mSearchResultView.setAdapter(mAddFriendAdapter); }
2.2、单个类型
// RecyclerView适配器 private CommonAdapter三、效果mCommonAdapter; // RecyclerView数据源 private List mList = new ArrayList<>(); @Override protected void initView() { // RecyclerView设置布局管理器 binding.mContactView.setLayoutManager(new LinearLayoutManager(this)); // 添加列表项下划线 binding.mContactView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL)); // 设置适配器 mCommonAdapter = new CommonAdapter<>(mList, new CommonAdapter.OnBindDataListener () { @Override public void onBindViewHolder(AddFriendModel model, CommonViewHolder viewHolder, int type, int position) { // 设置头像 viewHolder.setImageUrl(ContactFriendActivity.this,R.id.iv_photo,model.getPhoto()); // 设置性别 viewHolder.setImageResource(R.id.iv_sex,model.isSex() ? R.drawable.img_boy_icon : R.drawable.img_girl_icon); // 设置昵称 viewHolder.setText(R.id.tv_nickname,model.getNickName()); //点击事件 viewHolder.itemView.setOnClickListener(v -> {}); } @Override public int getLayoutId(int type) { return R.layout.layout_search_user_item; } }); binding.mContactView.setAdapter(mCommonAdapter); }
1、多种类型
2、单个类型
1、代码中的binding指的是使用ViewBinding绑定的布局,ViewBinding官方教程:链接。
2、TYPE_TITLE 和 TYPE_ConTENT 在使用前就设置到AddFriendModel里了,所以直接使用getType()方法是有数据的。
3、RecyclerView官方教程:链接。



