栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Android 封装RecyclerView适配器

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android 封装RecyclerView适配器

封装RecyclerView适配器
  • 一、直接上代码
  • 二、使用
  • 三、效果
  • 四、注意事项

一、直接上代码

1、创建CommonAdapter.java

public class CommonAdapter extends 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 CommonAdapter mAddFriendAdapter;
// 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官方教程:链接。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/328855.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号