RecyclerView多样式不同的布局

RecyclerView是一个很强大的控件,对那些要求复杂的列表能很好的支持,先看看效果

可以看到一个RecyclerView可以实现多种样式的布局

先贴布局

activity_main.xml

 

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.multistylerecyclerview.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</android.support.constraint.ConstraintLayout>

 

item_type_1.xml,item_type_2.xml,item_type_3.xml,item_type_4.xml除了背景颜色都一样

 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="100dp">
    <TextView
        android:id="@+id/text_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="5dp"
        android:background="#534345"/>
</RelativeLayout>

 

MainActivity.java

 

public class MainActivity extends AppCompatActivity {

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

        List<StyleData> list = new ArrayList<>();
        for (int i = 0; i < 24; i++) {
            StyleData data = new StyleData();
            data.item = "" + i;
            if (i > 3 && i < 7 || i == 11 || i == 13) {
                data.type = 2;//占两个span
            }else if (i == 15 || i == 18) {
                data.type = 3;//占三个span
            }else if(i == 19){
                data.type = 4;//占四个span
            }else {
                data.type = 1;//占一个span
            }
            list.add(data);
        }

        RecyclerView recyclerView = findViewById(R.id.recycler_view);
        GridLayoutManager manager = new GridLayoutManager(this, 4);
        recyclerView.setLayoutManager(manager);
        StyleAdapter adapter = new StyleAdapter(this,manager, list);
        recyclerView.setAdapter(adapter);
    }
    class StyleAdapter extends RecyclerView.Adapter<StyleAdapter.StyleViewHolder> {
        private Context context;
        private List<StyleData> list;
        private GridLayoutManager manager;


        public StyleAdapter(Context context, GridLayoutManager manager, List<StyleData> list) {
            this.context = context;
            this.manager = manager;
            this.list = list;
            manager.setSpanSizeLookup(new GridSpanSizeLookup());
        }

        @Override
        public int getItemViewType(int position) {
            return list.get(position).type;
        }

        @Override
        public StyleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            StyleViewHolder holder;
            if(viewType == 4){
                holder = new ViewHolder4(LayoutInflater.from(context).inflate(R.layout.item_type_4, parent,
                        false));
            }else if(viewType == 3){
                holder = new ViewHolder3(LayoutInflater.from(context).inflate(R.layout.item_type_3, parent,
                        false));
            }else if(viewType == 2){
                holder = new ViewHolder2(LayoutInflater.from(context).inflate(R.layout.item_type_2, parent,
                        false));
            }else{
                holder = new ViewHolder1(LayoutInflater.from(context).inflate(R.layout.item_type_1, parent,
                        false));
            }
            return holder;
        }

        @Override
        public void onBindViewHolder(StyleViewHolder holder, int position) {
            holder.textView.setText(list.get(position).item);
        }

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

        class StyleViewHolder extends RecyclerView.ViewHolder {

            TextView textView;

            public StyleViewHolder(View view) {
                super(view);
            }
        }

        class ViewHolder1 extends StyleViewHolder{
            public ViewHolder1(View view) {
                super(view);
                textView = view.findViewById(R.id.text_view);
            }
        }
        class ViewHolder2 extends StyleViewHolder{
            public ViewHolder2(View view) {
                super(view);
                textView = view.findViewById(R.id.text_view);
            }
        }
        class ViewHolder3 extends StyleViewHolder{
            public ViewHolder3(View view) {
                super(view);
                textView = view.findViewById(R.id.text_view);
            }
        }
        class ViewHolder4 extends StyleViewHolder{
            public ViewHolder4(View view) {
                super(view);
                textView = view.findViewById(R.id.text_view);
            }
        }

        //GridSpanSizeLookup.getSpanSize 返回1表示占1个span,返回gridManager.getSpanCount()表示占用整行
        public class GridSpanSizeLookup extends GridLayoutManager.SpanSizeLookup {
            @Override
            public int getSpanSize(int position) {

                //return gridManager.getSpanCount();
                return list.get(position).type;
            }
        }
    }

    class StyleData {
        int type;
        String item;
    }
}

 

代码很简单主要用到GridLayoutManager.SpanSizeLookup

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值