RecylerView打造通用万能的adapter

RecylerAdapter

public abstract class RecylerCommonAdapter<DATA> extends RecyclerView.Adapter<ViewHolder> {
    private Context mContext;
    private LayoutInflater mLayoutInflater;
    private List<DATA> mData;
    private int mLayoutId;
    private MuliteSupport mTypeSupport;

    public RecylerCommonAdapter(Context context, List<DATA> data, int layoutId) {
        mLayoutInflater = LayoutInflater.from(context);
        this.mContext = context;
        this.mData = data;
        this.mLayoutId = layoutId;
    }

    public RecylerCommonAdapter(Context context, List<DATA> data, MuliteSupport typeSupport) {
        this(context, data, -1);
        this.mTypeSupport = typeSupport;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        if(mTypeSupport!=null){
           mLayoutId=viewType;
        }
        View itemView = mLayoutInflater.inflate(mLayoutId, parent, false);
        return new ViewHolder(itemView);
    }

    @Override
    public int getItemViewType(int position) {
        //多布局
        if(mTypeSupport!=null){
            return mTypeSupport.getLayoutId(mData.get(position));
        }
        return super.getItemViewType(position);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        convert(holder, mData.get(position), position);
    }

    public abstract void convert(ViewHolder holder, DATA item, int position);

    @Override
    public int getItemCount() {
        return mData.size();
    }
}

ViewHolder

public  class ViewHolder extends RecyclerView.ViewHolder {
    private SparseArray<View> mViews;

    public ViewHolder(View itemView) {
        super(itemView);
        mViews = new SparseArray<>();
    }

    /**
     * 减少findviewById的次数
     */
    public <T extends View> T getView(int viewId) {
        View view = mViews.get(viewId);
        if (view == null) {
            view = itemView.findViewById(viewId);
            mViews.put(viewId, view);
        }
        return (T) view;
    }

    //封装一些通用的,比如setText()

    /**
     * 设置文本
     */
    public ViewHolder setText(int viewId, CharSequence text) {
        TextView tv = getView(viewId);
        tv.setText(text);
        return this;
    }

    /**
     * 设置图片资源
     */
    public ViewHolder setImageResource(int viewId, int resourceId) {
        ImageView imageView = getView(viewId);
        imageView.setImageResource(resourceId);
        return this;
    }

    //图片处理问题 路径问题 用到第三方 imageLoader Glide xutils Picasso
    //不能够直接使用第三方的图片加载
    //最终采用的方式使用自己的一套规范
    public ViewHolder setImagePath(int viewId,HolderImageLoader imageLoader) {
        ImageView imageView = getView(viewId);
        imageLoader.imageLoader(imageView,imageLoader.getPath());
        return this;
    }
    public abstract static class HolderImageLoader{
        private String mPath;
        public HolderImageLoader(String path){
            this.mPath=path;
        }
        public abstract void imageLoader(ImageView imageView,String path);

        public String getPath() {
            return mPath;
        }
    }
}

itemClickListener:点击事件的处理

public interface ItemClickListener {
    void setOnItemClickListener(int position);
}

ItemLongClickListener:长按事件处理

public interface ItemLongClickListener {
    boolean setOnItemLongClickListener(int position);
}

MuliteSupport

public interface MuliteSupport<DATA> {
    public int getLayoutId(DATA data);//根据不同数据显示不同的布局
}

以上就封装差不多了

以显示图片为案例

public class BaseImageActivity extends Activity {

    private RecyclerView mRecyclerView;
    private List<String> mDatas;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base_image);
        initData();

        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        // 指定显示的样式 LinearLayoutManager --> listView样式
        // GridLayoutManager  GridView样式
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        //设置适配器
        RecyclerViewAdapter1 adapter = new RecyclerViewAdapter1(this, mDatas);
        mRecyclerView.setAdapter(adapter);
        //添加分割线
        mRecyclerView.addItemDecoration(new LinearLayoutItemDecoration(this, R.drawable.item_driver_01));
        adapter.setItemClickListener(new ItemClickListener() {
            @Override
            public void setOnItemClickListener(int position) {
                Toast.makeText(BaseImageActivity.this, "单击->" + mDatas.get(position), Toast.LENGTH_SHORT).show();
            }
        });
        adapter.setItemLongClickListener(new ItemLongClickListener() {
            @Override
            public boolean setOnItemLongClickListener(int position) {
                Toast.makeText(BaseImageActivity.this, "长按->" + mDatas.get(position), Toast.LENGTH_SHORT).show();
                return true;//消费点击事件
            }
        });
    }

    private void initData() {
        mDatas = new ArrayList<>();
        mDatas.add(ImageUrl.image1);
        mDatas.add(ImageUrl.image2);
        mDatas.add(ImageUrl.image3);
        mDatas.add(ImageUrl.image4);
        mDatas.add(ImageUrl.image5);
        mDatas.add(ImageUrl.image7);
        mDatas.add(ImageUrl.image6);
        mDatas.add(ImageUrl.image8);
        mDatas.add(ImageUrl.image9);
        mDatas.add(ImageUrl.image10);
        mDatas.add(ImageUrl.image11);
        mDatas.add(ImageUrl.image12);
        mDatas.add(ImageUrl.image13);
        mDatas.add(ImageUrl.image14);
        mDatas.add(ImageUrl.image15);
        mDatas.add(ImageUrl.image16);
        mDatas.add(ImageUrl.image17);
        mDatas.add(ImageUrl.image18);
        mDatas.add(ImageUrl.image19);
        mDatas.add(ImageUrl.image20);
    }

}

测试图片的接口

public class ImageUrl {
    public static final String image1="http://p4.so.qhmsg.com/bdr/_240_/t0157596cfec8884249.jpg";
    public static final String image2="http://p3.so.qhimgs1.com/bdr/_240_/t0125644adcf2cb71d3.jpg";
    public static final String image3="http://p3.so.qhimgs1.com/bdr/_240_/t01d31b4df909c2aa13.jpg";
    public static final String image4="http://p0.so.qhmsg.com/bdr/_240_/t011fc15c16f31bb545.jpg";
    public static final String image5="http://p4.so.qhmsg.com/bdr/_240_/t0187439344feb62039.jpg";
    public static final String image6="http://p4.so.qhmsg.com/bdr/_240_/t01c867a331ee601f09.jpg";
    public static final String image7="http://p1.so.qhimgs1.com/bdr/_240_/t01d207c6bb9e46c6b1.jpg";
    public static final String image8="http://p0.so.qhmsg.com/bdr/_240_/t01d5ada99254f1b685.jpg";
    public static final String image9="http://p0.so.qhimgs1.com/bdr/_240_/t019aa0ed00b08bc6ec.jpg";
    public static final String image10="http://p1.so.qhmsg.com/bdr/_240_/t011a45058123590d96.jpg";
    public static final String image11="http://p0.so.qhmsg.com/bdr/_240_/t015a2d44aeee1bcf7f.jpg";
    public static final String image12="http://p1.so.qhimgs1.com/bdr/_240_/t01c55edc357b953b51.jpg";
    public static final String image13="http://p1.so.qhimgs1.com/bdr/_240_/t017e236ece120c9721.jpg";
    public static final String image14="http://p1.so.qhmsg.com/bdr/_240_/t01c9af3809a7b74ec6.jpg";
    public static final String image15="http://p3.so.qhmsg.com/bdr/_240_/t0169f347f8991857f8.jpg";
    public static final String image16="http://p1.so.qhimgs1.com/bdr/_240_/t016333a4d8144d0681.jpg";
    public static final String image17="http://p0.so.qhimgs1.com/bdr/_240_/t0123f85ae6dba80770.jpg";
    public static final String image18="http://p2.so.qhimgs1.com/bdr/_240_/t010d8bc3205ced32a2.jpg";
    public static final String image19="http://p1.so.qhmsg.com/bdr/_240_/t014976fa8e0ae97556.jpg";
    public static final String image20="http://p1.so.qhimgs1.com/bdr/_240_/t01a846efd527e8acc1.jpg";
}

显示图片适配器

public class RecyclerViewAdapter1 extends RecylerCommonAdapter<String> {
    private Context mContext;

    public RecyclerViewAdapter1(Context context, List<String> data) {
        super(context, data, R.layout.item_image);
        this.mContext = context;
    }

    @Override
    public void convert(ViewHolder holder, String item, final int position) {
        Log.e("TAG", item);

        holder.setImagePath(R.id.image_view, new ImageLoader(item));
        if (mItemClickListener != null) {
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mItemClickListener.setOnItemClickListener(position);
                }
            });
        }
        if (mItemLongClickListener != null)
            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    return mItemLongClickListener.setOnItemLongClickListener(position);
                }
            });
    }

    public class ImageLoader extends ViewHolder.HolderImageLoader {
        public ImageLoader(String path) {
            super(path);
        }

        @Override
        public void imageLoader(ImageView imageView, String path) {
            Glide.with(mContext)
                    .load(path)
                    .placeholder(R.mipmap.ic_launcher)//图片加载出来前,显示的图片
                    .error(R.mipmap.ic_launcher_round)//图片加载失败后,显示的图片
                    .into(imageView);
        }
    }

    private ItemClickListener mItemClickListener;
    private ItemLongClickListener mItemLongClickListener;

    public void setItemClickListener(ItemClickListener mItemClickListener) {
        this.mItemClickListener = mItemClickListener;
    }

    public void setItemLongClickListener(ItemLongClickListener mItemLongClickListener) {
        this.mItemLongClickListener = mItemLongClickListener;
    }
}

这里写图片描述

测试多布局显示

public class CommonAdapterActivity extends AppCompatActivity {
    private RecyclerView mRecyclerView;
    private List<ChatData> mChatDatas;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base_user);
        mChatDatas = new ArrayList<>();
        for (int i = 1; i < 100; i++) {
            if (i % 3 == 0) {
                mChatDatas.add(new ChatData("自己的内容" + i, 1));
            } else {
                mChatDatas.add(new ChatData("朋友的内容" + i, 0));
            }
        }
        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        mRecyclerView.setAdapter(new RecylerAdapter(this, mChatDatas));
    }

    private class RecylerAdapter extends RecylerCommonAdapter<ChatData> {

        public RecylerAdapter(Context context, List<ChatData> data) {
            super(context, data, new MuliteSupport<ChatData>() {
                @Override
                public int getLayoutId(ChatData item) {//Object网上的数据
                    if (item.isMe == 1) {
                        return R.layout.chat_list_me;
                    }
                    return R.layout.chat_list_fired;
                }
            });
        }

        @Override
        public void convert(ViewHolder holder, ChatData item, int position) {
            holder.setText(R.id.chat_list, item.chatContent);
        }
    }

    private class ChatData {
        private ChatData(String chatContent, int isMe) {
            this.chatContent = chatContent;
            this.isMe = isMe;
        }

        String chatContent;
        int isMe;
    }
}

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值