九宫格实现效果图,自定义每一个item,控制占位长度。
具体代码
MainActivity
18/3=6、18/6=3、18/9=2
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayList<MyModel> list = initData();
RecyclerView recyclerView = findViewById(R.id.recycle);
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 18);
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
int remain = position % 18;
Integer[] arr1 = {0, 1, 2};
Integer[] arr2 = {3, 4, 5, 6, 7, 8,};
Integer[] arr3 = {9, 10, 11, 12, 13, 14, 15, 16, 17};
List<Integer> list1 = Arrays.asList(arr1);
List<Integer> list2 = Arrays.asList(arr2);
List<Integer> list3 = Arrays.asList(arr3);
if (list1.contains(remain)) {
return 6;
} else if (list2.contains(remain)) {
return 3;
} else if (list3.contains(remain)) {
return 2;
} else {
return -1;
}
}
});
recyclerView.setLayoutManager(gridLayoutManager);
MyAdapter myAdapter = new MyAdapter(list);
recyclerView.setAdapter(myAdapter);
}
private ArrayList<MyModel> initData() {
ArrayList<MyModel> list = new ArrayList<>();
for (int i = 0; i < 200; i++) {
MyModel myModel = new MyModel();
myModel.setName("嘿嘿");
myModel.setId(i + 1);
list.add(myModel);
}
return list;
}
}
MyAdapter,3个不同的holder
import android.annotation.SuppressLint;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.Arrays;
import java.util.List;
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int red = 0;
private static final int green = 1;
private static final int blue = 2;
private final List<MyModel> dataList;
// 构造函数,初始化数据等
public MyAdapter(List<MyModel> dataList) {
this.dataList = dataList;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType == red) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.red, parent, false);
return new RedViewHolder(view);
} else if (viewType == green) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.green, parent, false);
return new GreenViewHolder(view);
} else if (viewType == blue) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.blue, parent, false);
return new BlueViewHolder(view);
} else {
return null;
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
MyModel myModel = dataList.get(position);
if (holder instanceof RedViewHolder) {
// 绑定红视图
((RedViewHolder) holder).bind(myModel);
} else if (holder instanceof GreenViewHolder) {
// 绑定绿视图
((GreenViewHolder) holder).bind(myModel);
} else if (holder instanceof BlueViewHolder) {
// 绑定蓝视图
((BlueViewHolder) holder).bind(myModel);
}
}
@Override
public int getItemViewType(int position) {
int remain = position % 18;
Integer[] arr1 = {0, 1, 2};
Integer[] arr2 = {3, 4, 5, 6, 7, 8,};
Integer[] arr3 = {9, 10, 11, 12, 13, 14, 15, 16, 17};
List<Integer> list1 = Arrays.asList(arr1);
List<Integer> list2 = Arrays.asList(arr2);
List<Integer> list3 = Arrays.asList(arr3);
if (list1.contains(remain)) {
return red;
} else if (list2.contains(remain)) {
return green;
} else if (list3.contains(remain)) {
return blue;
} else {
return -1;
}
}
@Override
public int getItemCount() {
return dataList.size();
}
public static class RedViewHolder extends RecyclerView.ViewHolder {
private final TextView textView;
@SuppressLint("SetTextI18n")
public RedViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.text);
}
@SuppressLint("SetTextI18n")
public void bind(MyModel myModel) {
textView.setText(myModel.getId() + myModel.getName());
textView.setBackgroundColor(Color.YELLOW);
}
}
public static class GreenViewHolder extends RecyclerView.ViewHolder {
private final TextView textView;
@SuppressLint("SetTextI18n")
public GreenViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.text);
}
@SuppressLint("SetTextI18n")
public void bind(MyModel myModel) {
textView.setText(myModel.getId() + myModel.getName());
textView.setBackgroundColor(Color.GREEN);
}
}
public static class BlueViewHolder extends RecyclerView.ViewHolder {
private final TextView textView;
@SuppressLint("SetTextI18n")
public BlueViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.text);
}
@SuppressLint("SetTextI18n")
public void bind(MyModel myModel) {
textView.setText(myModel.getId() + myModel.getName());
textView.setBackgroundColor(Color.CYAN);
}
}
}
MyModel
public class MyModel {
private String name;
private int id;
public MyModel() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
布局
activity_main
<?xml version="1.0" encoding="utf-8"?>
<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=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycle"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
剩下三个布局一样的,只传一个
blue
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_gravity="center"
android:gravity="center"
android:textSize="32sp" />
</LinearLayout>
</LinearLayout>