1.添加依赖:
compile 'com.android.support:recyclerview-v7:24.2.1'
2、在mainactivity的xml布局里直接写上recyclerview
<LinearLayout 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" android:orientation="vertical" tools:context="com.qianfemg.recyclerviewtext.MainActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/recy" android:layout_width="match_parent" android:layout_height="match_parent"/> LinearLayout>
3、在mainactivity里findViewById找到这个控件mainactivity代码如下
public class MainActivity extends AppCompatActivity { protected RecyclerView mRecy; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.activity_main); 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(); //设置管理 mRecy.setLayoutManager(gridLayoutManager); MyRecyclerAdapter adapter = new MyRecyclerAdapter(); //设置适配器 mRecy.setAdapter(adapter); } private void initView() { mRecy = (RecyclerView) findViewById(R.id.recy); } }
public class MyRecyclerAdapter extends RecyclerView.Adapter{ /* 上面的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_type1, null); viewHolder = new VH(view); break; case 1: view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_type2, null); viewHolder = new VH1(view); break; case 2: view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_type3, 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"); break; case 1: VH1 vh1 = (VH1) holder; vh1.mTextView.setText("类型2"); vh1.mImageView.setImageResource(R.drawable.a); 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; } }
5、这里就写几个简单的ViewHolder(其中没个ViewHolder都对应一个布局,同listview中多布局相似)
第一个ViewHolder
public class VH extends RecyclerView.ViewHolder { TextView mTextView; public VH(View itemView) { super(itemView); mTextView = (TextView) itemView.findViewById(R.id.tv_type1); } }
其xml布局为
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="160dp"
android:background="#8c8a4b"
android:orientation="vertical"
android:padding="10dp">
android:id="@+id/tv_type1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="20dp"
android:gravity="center"
android:textColor="#2c602c"
android:textSize="18sp"/>
第二个ViewHolder
public class VH1 extends RecyclerView.ViewHolder { ImageView mImageView; TextView mTextView; public VH1(View itemView) { super(itemView); mImageView= (ImageView) itemView.findViewById(R.id.iv_type2); mTextView= (TextView) itemView.findViewById(R.id.tv_type2); } }
其xml布局为
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:padding="10dp"
android:background="#5fb5c4"
android:layout_height="160dp"
android:orientation="vertical">
android:id="@+id/tv_type2"
android:textColor="#687c3d"
android:textSize="18sp"
android:gravity="center_horizontal"
android:layout_width="match_parent"
android:layout_height="60dp"/>
android:id="@+id/iv_type2"
android:layout_width="match_parent"
android:layout_height="80dp"/>
第三个ViewHoler
public class VH2 extends RecyclerView.ViewHolder { TextView mTextView; public VH2(View itemView) { super(itemView); mTextView= (TextView) itemView.findViewById(R.id.tv_type3); } }
其xml布局为
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:padding="10dp"
android:background="#48308e"
android:layout_width="match_parent"
android:layout_height="160dp">
android:id="@+id/tv_type3"
android:layout_margin="20dp"
android:textColor="#bf2780"
android:gravity="center"
android:textSize="18sp"
android:layout_width="match_parent"
android:layout_height="match_parent"/>