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