Android进阶之通用RecyclerView适配器打造方法

一、引言从事android开发已经快三年了,相信大家和我一样,写了无数列表View的适配器,不知大家是否厌倦了这些重复的流程和代码?反正我是早厌倦了。本篇旨在从一段司空见惯的RecyclerView适配器代码开始,一步一步抽取代码的重复部分,打造和ListView通用适配器类似的RecyclerView通用适配器,一来为大家提供快速完成RecyclerView适配器开发效率,二来提供一种代码抽取的思
摘要由CSDN通过智能技术生成

一、引言

从事android开发已经快三年了,相信大家和我一样,写了无数列表View的适配器,不知大家是否厌倦了这些重复的流程和代码?反正我是早厌倦了。本篇旨在从一段司空见惯的RecyclerView适配器代码开始,一步一步抽取代码的重复部分,打造和ListView通用适配器类似的RecyclerView通用适配器,一来为大家提供RecyclerView通用适配器,提高开发效率,二来分享一种代码抽取的思路。记得之前带我的师傅曾说过:框架不是一下子空想出来的,是”演化”而来的,就像大家熟知的Imageloarder,1.0版本绝对不是现在这个样子。。。废话就扯到这里,下面先看看一段让人熟悉到吐的适配器代码:

package com.star.xadapter;

import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.List;

/**
 * Created by kakaxicm on 16/7/7.
 */
public class TestAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
   
    private List<String> mData;
    public TestAdapter(List<String> data){
        mData = data;
    }
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new TestViewHolder(View.inflate(parent.getContext(),R.layout.item_test, null));
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        TestViewHolder tHolder = (TestViewHolder) holder;
        tHolder.tv.setText(mData.get(position));
    }

    @Override
    public int getItemCount() {
        return mData == null ? 0 : mData.size();
    }

    private class TestViewHolder extends RecyclerView.ViewHolder{
   
        TextView tv;
        public TestViewHolder(View itemView) {
            super(itemView);
            tv = (TextView) itemView.findViewById(R.id.tv);
        }


    }
}

当每个页面的RecyclerView的Model和View不同时,都得另写一个适配器,流程都是标准化的:
1.覆写getItemCount、onCreateViewHolder、onBindViewHolder方法,多类型支持还要覆写getItemViewType方法;
2.根据每个位置返回的itemview类型,构造不同的ViewHolder,ViewHolder和布局文件通过onBindViewHolder建立绑定关系。
既然流程是标准化的,那么这些公共的流程就可以抽取出来,具体的实现细节暴露给调用者实现。下面就来一步一步来“演化”代码,打造通用的适配器。

二、通用适配器初步演化

从第一节的分析,我们可以把公共的部分抽取出来,具体的细节通过接口暴露给调用者实现。那么公共部分有哪些呢?哪些细节是和业务相关的呢?
1.上面提到的四个方法规定了公共的流程,可以抽取出来;
2.数据层是一个列表,支持的Model类型由用户决定,所以可以做泛型支持;
3.View层即ViewHolder,也可以通过接口由用户构造。当然适配器在多type情况下支持不同的ViewHolder,也需要做泛型支持;
4.从以上3点的分析,那么对外暴露的接口就应该是这样:暴露两个个方法,一个方法绑定数据入参是model和viewholder,另外一个方法构造viewholder。接口代码如下:

   /**
     * 绑定数据的接口
 
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值