通过学习了RecyclerView的简单使用后,我们不得不讲讲RecyclerView的多布局的实现了,这种用法常见于各种电商类的App。要实现这个效果最主要是复写RecyclerView的适配器里面的getItemViewType()方法,这个方法是根据条件返回Item的类型。不知道你们有没有发现这个方法跟前面那三个方法中的onCreateViewHolder方法的参数viewType的名字有点像?带着这个疑问让我们一起来实现一下RecyclerView的多布局。
首先创建一个名为RecyclerViewMulti的新项目,引入RecyclerView的包,然后在需要使用RecyclerView控件的XML中加入RecyclerView控件,然后在使用该布局的类中初始化RecyclerView。过程跟之前的简单使用差不多,不明白的请移步RecyclerView的简单使用。
接下来我们先创建一个类用来记录Item的返回类型和Item的数据,名为ItemBean,代码如下:
public class ItemBean {
public String tv_text;
public int type;
}
然后我们开始初始化数据,创建一个数组长度为8的String类型的数组,这个跟你想要多少个Item有关我就只需要8个就好,这个看你们的需求。甚至你们不需要这个也行的,就直接生成8个数据也是可以的,我是想到时候对不同布局进行更新文字,毕竟我这个是演示。然后在通过 Random函数随机生成0-3的数字不包括3,这边我只设置了3个不一样的布局,这个也是看你们需求。代码如下:
public class MainActivity extends Activity{
private RecyclerView recyclerView;
private String[] text = {"11","22","33","44","55","66","77","88"};
private List datas = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
}
private void initData() {
Random random = new Random();
for (int i=0;i
之后我们开始创建一个继承于RecyclerView.Adapter的RecyclerViewAdapter的适配器类,引入onCreateViewHolder、onBindViewHolder、getItemCount三个方法,再补充我们的RecyclerViewAdapter的构造函数。我们知道Item的布局是在onCreateViewHolder中设置的,由于我们要设置多布局我们首先复写getItemViewType方法。CTRL+O选择getItemViewType方法进行复写,我设置了三个不同的布局,我们先把三个不同类型的布局用三个静态变量来表示。接着通过传入来的数据进行配对代码如下:
public class RecyclerViewAdapter extends RecyclerView.Adapter {
public static final int TYPE_ONE = 0;
public static final int TYPE_TWO = 1;
public static final int TYPE_TREE = 2;
private Context context;
private List datas;
public RecyclerViewAdapter(Context context, List datas){
this.context = context;
this.datas = datas;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return null;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
}
@Override
public int getItemCount() {
return 0;
}
@Override
public int getItemViewType(int position) {
ItemBean bean = datas.get(position);
if (bean.type == TYPE_ONE ){
return TYPE_ONE;
}else if (bean.type == TYPE_TWO){
return TYPE_TWO;
}else {
return TYPE_TREE;
}
}
}
由于Item的布局是由ViewHolder来搭载的我们就需要自定义三个不同的ViewHolder分别对应三个布局,在onCreateViewHolder方法中根据参数ViewType的类型来判断对应加载相应的布局。看到这里大家就知道了,我们复写的getItemViewType方法得出的结果在onCreateViewHolder方法中以参数ViewType进行回调。接着我们跟着它的数值进行判断该Item使用那个布局。代码如下:
public class RecyclerViewAdapter extends RecyclerView.Adapter {
public static final int TYPE_ONE = 0;
public static final int TYPE_TWO = 1;
public static final int TYPE_THREE = 2;
private Context context;
private List datas;
public RecyclerViewAdapter(Context context, List datas){
this.context = context;
this.datas = datas;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view;
if (viewType == TYPE_ONE){
view = View.inflate(context,R.layout.item_one,null);
return new ItemOneViewHolder(view);
}else if (viewType == TYPE_TWO){
view = View.inflate(context,R.layout.item_two,null);
return new ItemTwoViewHolder(view);
}else {
view = View.inflate(context, R.layout.item_three, null);
return new ItemTreeViewHolder(view);
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
}
@Override
public int getItemCount() {
return datas.size();
}
@Override
public int getItemViewType(int position) {
ItemBean bean = datas.get(position);
if (bean.type == TYPE_ONE ){
return TYPE_ONE;
}else if (bean.type == TYPE_TWO){
return TYPE_TWO;
}else {
return TYPE_THREE;
}
}
class ItemOneViewHolder extends RecyclerView.ViewHolder{
public ItemOneViewHolder(@NonNull View itemView) {
super(itemView);
}
}
class ItemTwoViewHolder extends RecyclerView.ViewHolder{
public ItemTwoViewHolder(@NonNull View itemView) {
super(itemView);
}
}
class ItemTreeViewHolder extends RecyclerView.ViewHolder{
public ItemTreeViewHolder(@NonNull View itemView) {
super(itemView);
}
}
}
同时三个布局的XML代码如下:
接下来我们回使用RecyclerView控件布局的类中对RecyclerView进行 Layout的设置和实例化我们刚刚写的RecyclerViewAdapter的类,然后设置该适配器给我们的RecyclerView,运行项目就能看到多布局的效果。代码如下:
private void initRecyclerView() {
recyclerView.setLayoutManager(new LinearLayoutManager(this));
RecyclerViewAdapter adapter = new RecyclerViewAdapter(this,datas);
recyclerView.setAdapter(adapter);
}
原创:https://blog.csdn.net/weixin_40600325