RecyclerView的使用及多布局的实现

概述:
Android 控件 RecyclerView

从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替传统的ListView,更加强大和灵活

使用:
一、引入依赖
二、在布局中使用
三、布局管理器的使用和适配
四、Adapter中方法调用顺序:
五、使用RecyclerView实现多布局

一、引入依赖

implementation 'com.android.support:recyclerview-v7:28.0.0'

二、在布局中使用
xml文件:activity_main

<androidx.recyclerview.widget.RecyclerView    
android:id="@+id/rvlist"    
android:layout_width="match_parent"    
android:layout_height="match_parent"/>
//match_parent:充满父布局
//wrap_content:包围子内容

三、布局管理器的使用和适配
在activity中加载://在oncreate中:其中传入适配器的list是自定义的一些数据,一些字符串,不重要。布局管理器这里有三个,其实根据需要任意选择一个就好。

private RecyclerView recyclerView;
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.rvlist);
// 定义一个线性布局管理器        
LinearLayoutManager lmanager = new LinearLayoutManager(this,RecyclerView.VERTICAL,false);        
//定义一个网格布局管理器        
GridLayoutManager  gmanage = new GridLayoutManager(this,4,RecyclerView.VERTICAL,false);        
//定义一个瀑布流布局管理器        
StaggeredGridLayoutManager smanage = new StaggeredGridLayoutManager(3,RecyclerView.VERTICAL);

//        参数:
//        VERTICAL:垂直
//        HORIZONTAL:水平
//        参数reverseLayout:是否反转
//        参数spanCount,几行几列

// 设置布局管理器        
recyclerView.setLayoutManager(lmanager);        
//添加分割线        
recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));            
DemoAdapter adapter = new DemoAdapter(this,list);        
recyclerView.setAdapter(adapter); // 设置adapter 

设置adapter:自定义DemoAdapter继承RecyclerView.Adapter,继承后实现父类中四个抽象方法:

getItemCount

getItemViewType

onCreateViewHolder

onBindViewHolder

在onCreateViewHolder中加载需要设置到RecyclerView容器中的子布局,然后将子布局传入到ViewHolder 中

@NonNull@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, 
int viewType) {    
View view = LayoutInflater.from(context).inflate(R.layout.item_demo,parent,false);    
return new viewHolder(view);
}

其中viewHolder一般会声明为adapter的内部类,用来找到子布局中对应的控件,子布局里面就是一个textView ,
viewHolder中代码为:

private class viewHolder extends RecyclerView.ViewHolder {    
private TextView textView;    
public viewHolder(@NonNull View itemView) {        
super(itemView);        
textView = itemView.findViewById(R.id.demoView);    
}}

修改getItemCount方法:使得其返回数据为list的大小,根据list数据确定RecyclerView中子布局加载多少次:

@Overridepublic int getItemCount() {    
return list.size();
}

最后一个方法onBindViewHolder是用来绑定数据到子布局的:其中的BaseEntity 是一个数据源,随便定义的一个类

@Overridepublic void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int position)
 {    
 BaseEntity baseEntity = list.get(position);    
 ((viewHolder)holder).textView.setText(baseEntity.toString());
 }

四、Adapter中方法调用顺序:

getItemCount–>getItemViewType–>onCreateViewHolder–>onBindViewHolder

五、使用RecyclerView实现多布局
在自定义DemoAdapter中:

1、定义两种类型:

private int TYPE_ONE = 1;
private int TYPE_TWO = 2;

2、重写上面没有用到的getItemViewType方法,设置不同的条件返回不同类型,选择当前数据用什么布局加载

@Override
    public int getItemViewType(int position) {//position:当前数据
        if(position % 2 == 0){
            return TYPE_ONE;
        } else {
            return TYPE_TWO;
        }
    }

3、在onCreateViewHolder中根据返回的不同条件不同类的类型加载不同的子布局,其中参数itemType当getItemViewType方法被调用后,就会变成该方法返回的记录类型的值

@NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int itemType) {
        View view;
        if(itemType == TYPE_ONE){
            view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.xxx, viewGroup, false);
            return new ItemOneHolder(view);
        } else if(itemType == TYPE_TWO){
            view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.xxx, viewGroup, false);
            return new ItemTwoHolder(view);
        }
        return null;
    }

4、同时也要设置两个不同的内部类,毕竟加载了两个不同的布局

class ItemOneHolder extends RecyclerView.ViewHolder{
        private TextView nText;
        public ItemOneHolder(@NonNull View itemView) {
            super(itemView);
            nText = itemView.findViewById(R.id.xx);
        }
    }

    class ItemTwoHolder extends RecyclerView.ViewHolder{
        private TextView nText;
        public ItemTwoHolder(@NonNull View itemView) {
            super(itemView);
            nText = itemView.findViewById(R.id.xx);
        }
    }
发布了43 篇原创文章 · 获赞 22 · 访问量 5948

猜你喜欢

转载自blog.csdn.net/qq_41466437/article/details/101559526
今日推荐