废话不多说,直接上代码。
首先定义一个Activity
package com.example.administrator.my_zky.buju1; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import com.example.administrator.my_zky.R; public class MainActivity_Recyclerview extends AppCompatActivity { private RecyclerView my_recyclerview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main__recyclerview); initView(); initData(); } private void initData() { //下面的2代表的一行的size是4 GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 4); gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { //返回position对应的条目所占的size @Override public int getSpanSize(int position) { if (position < 4) //这里返回4,指的是当position满足上面条件时,一个条目占得size是4 //也就是说这个条目占一行,因为上面设置的一行的size是4 return 4; else if (3 <= position && position < 6) //这里返回2,指的是当position满足上面条件时,一个条目占得size是2 // 也就是说这个条目占半行,因为上面设置的一行的size是4 return 2; else //这里返回1,指的是当position满足上面条件时,一个条目占得size是1 // 也就是说这个条目占1/4行,因为上面设置的一行的size是4 return 1; } }); //用来添加分割线 //mRecy.addItemDecoration(); //设置管理 my_recyclerview.setLayoutManager(gridLayoutManager); MyRecyclerAdapter adapter = new MyRecyclerAdapter(); //设置适配器 my_recyclerview.setAdapter(adapter); } private void initView() { my_recyclerview = (RecyclerView) findViewById(R.id.my_recyclerview); } }
定义适配器:
package com.example.administrator.my_zky.buju1; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.example.administrator.my_zky.R; /** * Created by Administrator on 2018/3/12. */ public class MyRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { /* 上面的ViewHolder是这个适配器必要的泛型,必须有。布局里有几种Type,下面就要写几个自定义的 ViewHlder,这些自定义的ViewHolder都要继承于RecyclerView.ViewHolder。 */ @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = null; RecyclerView.ViewHolder viewHolder = null; //根据viewType生成viewHolder switch (viewType) { case 0: view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_one, null); viewHolder = new VH(view); break; case 1: view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_two, null); viewHolder = new VH1(view); break; case 2: view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_three, null); viewHolder = new VH2(view); break; } return viewHolder; } @Override public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) { //根据条目的类型给holder中的控件填充数据 int itemViewType = getItemViewType(position); switch (itemViewType) { case 0: VH vh = (VH) holder; vh.mTextView.setText("类型1"); vh.mImageView.setImageResource(R.drawable.ic_launcher_background); break; case 1: VH1 vh1 = (VH1) holder; vh1.mTextView.setText("类型2"); break; case 2: VH2 vh2 = (VH2) holder; vh2.mTextView.setText("类型3"); break; } } @Override public int getItemCount() { //获取条目数,模拟数据,这里是写死的 return 30; } @Override public int getItemViewType(int position) { //跟据position对应的条目返回去对应的样式(Type) if (position < 4) { return 0; } else if (4 <= position && position < 6) { return 1; } else return 2; } }
定义三个item类
package com.example.administrator.my_zky.buju1; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import com.example.administrator.my_zky.R; public class VH extends RecyclerView.ViewHolder { TextView mTextView; ImageView mImageView; public VH(View itemView) { super(itemView); mImageView= (ImageView) itemView.findViewById(R.id.one_avatar); mTextView = (TextView) itemView.findViewById(R.id.one_name); } }
package com.example.administrator.my_zky.buju1; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.TextView; import com.example.administrator.my_zky.R; /** * Created by Administrator on 2018/3/12. */ public class VH1 extends RecyclerView.ViewHolder { TextView mTextView; public VH1(View itemView) { super(itemView); mTextView= (TextView) itemView.findViewById(R.id.two_content); } }
package com.example.administrator.my_zky.buju1; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.TextView; import com.example.administrator.my_zky.R; /** * Created by Administrator on 2018/3/12. */ public class VH2 extends RecyclerView.ViewHolder { TextView mTextView; public VH2(View itemView) { super(itemView); mTextView= (TextView) itemView.findViewById(R.id.three_name); } }
XML布局
activity的布局:
<android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/my_recyclerview" ></android.support.v7.widget.RecyclerView>
三个item
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ImageView android:id="@+id/one_avatar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:scaleType="centerCrop" android:src="@mipmap/ic_launcher"/> <TextView android:id="@+id/one_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="第一个item"/> </LinearLayout>
-------------------------------------------------
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="100dp" android:orientation="horizontal"> <ImageView android:id="@+id/three_avatar" android:layout_width="100dp" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_marginRight="10dp" app:srcCompat="@mipmap/ic_launcher"/> <TextView android:id="@+id/three_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="10dp" tools:text="名称"/> </RelativeLayout>
-------------------------------------------------
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ImageView android:id="@+id/one_avatar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:scaleType="centerCrop" android:src="@mipmap/ic_launcher"/> <TextView android:id="@+id/one_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="第2个item"/> <TextView android:id="@+id/two_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="第2个item"/> </LinearLayout>
这样就简单实现了一个Recyclerview的多布局。