Meet实战|封装万能的RecyclerView

在这个项目中,用到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);
        //刷新适配器

    }
}

效果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44280408/article/details/105099692
今日推荐