RecyclerView的多布局实现

      通过学习了RecyclerView的简单使用后,我们不得不讲讲RecyclerView的多布局的实现了,这种用法常见于各种电商类的App。要实现这个效果最主要是复写RecyclerView的适配器里面的getItemViewType()方法,这个方法是根据条件返回Item的类型。不知道你们有没有发现这个方法跟前面那三个方法中的onCreateViewHolder方法的参数viewType的名字有点像?带着这个疑问让我们一起来实现一下RecyclerView的多布局。

      首先创建一个名为RecyclerViewMulti的新项目,引入RecyclerView的包,然后在需要使用RecyclerView控件的XML中加入RecyclerView控件,然后在使用该布局的类中初始化RecyclerView。过程跟之前的简单使用差不多,不明白的请移步RecyclerView的简单使用。

      接下来我们先创建一个类用来记录Item的返回类型和Item的数据,名为ItemBean,代码如下:

public class ItemBean {
    public String tv_text;
    public int type;
}

      然后我们开始初始化数据,创建一个数组长度为8的String类型的数组,这个跟你想要多少个Item有关我就只需要8个就好,这个看你们的需求。甚至你们不需要这个也行的,就直接生成8个数据也是可以的,我是想到时候对不同布局进行更新文字,毕竟我这个是演示。然后在通过 Random函数随机生成0-3的数字不包括3,这边我只设置了3个不一样的布局,这个也是看你们需求。代码如下:

public class MainActivity extends Activity{

    private RecyclerView recyclerView;
    private String[] text = {"11","22","33","44","55","66","77","88"};
    private List datas = new ArrayList<>();

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

    private void initData() {

        Random random = new Random();
        for (int i=0;i

           之后我们开始创建一个继承于RecyclerView.Adapter的RecyclerViewAdapter的适配器类,引入onCreateViewHolder、onBindViewHolder、getItemCount三个方法,再补充我们的RecyclerViewAdapter的构造函数。我们知道Item的布局是在onCreateViewHolder中设置的,由于我们要设置多布局我们首先复写getItemViewType方法。CTRL+O选择getItemViewType方法进行复写,我设置了三个不同的布局,我们先把三个不同类型的布局用三个静态变量来表示。接着通过传入来的数据进行配对代码如下:

public class RecyclerViewAdapter extends RecyclerView.Adapter {

    public static final int TYPE_ONE = 0;
    public static final int TYPE_TWO = 1;
    public static final int TYPE_TREE = 2;

    private Context context;
    private List datas;

    public RecyclerViewAdapter(Context context, List datas){
        this.context = context;
        this.datas = datas;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return null;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

    }

    @Override
    public int getItemCount() {
        return 0;
    }

    @Override
    public int getItemViewType(int position) {
        ItemBean bean = datas.get(position);
        if (bean.type == TYPE_ONE ){
            return TYPE_ONE;
        }else if (bean.type == TYPE_TWO){
            return TYPE_TWO;
        }else {
            return TYPE_TREE;
        }
    }
}

            由于Item的布局是由ViewHolder来搭载的我们就需要自定义三个不同的ViewHolder分别对应三个布局,在onCreateViewHolder方法中根据参数ViewType的类型来判断对应加载相应的布局。看到这里大家就知道了,我们复写的getItemViewType方法得出的结果在onCreateViewHolder方法中以参数ViewType进行回调。接着我们跟着它的数值进行判断该Item使用那个布局。代码如下:

public class RecyclerViewAdapter extends RecyclerView.Adapter {

    public static final int TYPE_ONE = 0;
    public static final int TYPE_TWO = 1;
    public static final int TYPE_THREE = 2;

    private Context context;
    private List datas;

    public RecyclerViewAdapter(Context context, List datas){
        this.context = context;
        this.datas = datas;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view;
        if (viewType == TYPE_ONE){
            view = View.inflate(context,R.layout.item_one,null);
            return new ItemOneViewHolder(view);
        }else if (viewType == TYPE_TWO){
            view = View.inflate(context,R.layout.item_two,null);
            return new ItemTwoViewHolder(view);
        }else {
            view = View.inflate(context, R.layout.item_three, null);
            return new ItemTreeViewHolder(view);
        }
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

    }

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

    @Override
    public int getItemViewType(int position) {
        ItemBean bean = datas.get(position);
        if (bean.type == TYPE_ONE ){
            return TYPE_ONE;
        }else if (bean.type == TYPE_TWO){
            return TYPE_TWO;
        }else {
            return TYPE_THREE;
        }
    }

    class ItemOneViewHolder extends RecyclerView.ViewHolder{

        public ItemOneViewHolder(@NonNull View itemView) {
            super(itemView);
        }
    }

    class ItemTwoViewHolder extends RecyclerView.ViewHolder{

        public ItemTwoViewHolder(@NonNull View itemView) {
            super(itemView);
        }
    }

    class ItemTreeViewHolder extends RecyclerView.ViewHolder{

        public ItemTreeViewHolder(@NonNull View itemView) {
            super(itemView);
        }
    }
}

同时三个布局的XML代码如下:


    
        
        
    
    


    
        

        

            
            

            
            
            


        


    
    


    

        

        
    
    

               接下来我们回使用RecyclerView控件布局的类中对RecyclerView进行 Layout的设置和实例化我们刚刚写的RecyclerViewAdapter的类,然后设置该适配器给我们的RecyclerView,运行项目就能看到多布局的效果。代码如下:

 private void initRecyclerView() {

        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        RecyclerViewAdapter adapter = new RecyclerViewAdapter(this,datas);
        recyclerView.setAdapter(adapter);
    }

原创:https://blog.csdn.net/weixin_40600325

你可能感兴趣的:(android,UI,android)