RecyclerView用法--展示多种类型Item数据

如题,本文主要介绍RecyclerView的基本使用方法,像ListView一样展示多种类型的Item数据。

首先构造一个实体类:ItemPO,用来表示每个Item代表的数据类型:

import java.io.Serializable;
 
public class ItemPO implements Serializable {
    private static final long serialVersionUID = 7879752396036182745L;
 
    private String name;
    private int age;
 
    public ItemPO(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
    public String getName() {
        return name;
    }
 
    public int getAge() {
        return age;
    }
}

其次,创建测试的Activity页面,其布局activity_recycler_view_test.xml及RecyclerViewTestActivity如下:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</FrameLayout>
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
 
import com.example.cxc.fullscreendemo.R;
import com.example.cxc.fullscreendemo.decoration.adapter.RecyclerViewTestAdapter;
import com.example.cxc.fullscreendemo.decoration.po.ItemPO;
 
import java.util.ArrayList;
import java.util.List;
 
public class RecyclerViewTestActivity extends AppCompatActivity {
    private static final String TAG = "RecyclerViewTestActivity";
 
    private RecyclerView mRecyclerView;
 
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //设置布局
        setContentView(R.layout.activity_recycler_view_test);
 
        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
 
        //设置LayoutManager
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        mRecyclerView.setLayoutManager(layoutManager);
 
        //设置Adapter
        RecyclerViewTestAdapter adapter = new RecyclerViewTestAdapter();
        mRecyclerView.setAdapter(adapter);
 
        //设置数据
        List<ItemPO> items = fakeItems();
        adapter.notifyDataSetChanged(items);
    }
 
 
    private static final int ITEM_COUNT = 100;
 
    private static List<ItemPO> fakeItems() {
        List<ItemPO> items = new ArrayList<>(ITEM_COUNT);
 
        for (int i = 0; i < ITEM_COUNT; i++) {
            ItemPO tItem = new ItemPO("Name_" + i, i);
            items.add(tItem);
        }
 
        return items;
    }
}

布局及Activity中的逻辑都很简单明了,构造了100个用户信息Item用来展示。为了UI界面的丰富性,年龄为偶数的Item,名字和年龄分两行展示,年龄为奇数的Item名字和年龄在一行展示。如何构造ItemView并展示数据,需要使用Adapter来完成,即RecyclerViewTestAdapter
 

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
 
import com.example.cxc.fullscreendemo.R;
import com.example.cxc.fullscreendemo.decoration.po.ItemPO;
 
import java.util.List;
 
public class RecyclerViewTestAdapter extends RecyclerView.Adapter<TestBaseViewHolder> {
    private static final int TYPE_1 = 1;//横向排列名字和年龄
    private static final int TYPE_2 = 2;//竖向排列名字和年龄
 
    private List<ItemPO> items;
 
    @Override
    public int getItemViewType(int position) {
        ItemPO item = getItem(position);
        //age是奇数时使用TYPE_1,偶数时使用TYPE_2;
        return item != null && item.getAge() % 2 == 0 ? TYPE_2 : TYPE_1;
    }
 
    @Override
    public TestBaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        TestBaseViewHolder holder = null;
        switch (viewType) {
            case TYPE_1:
                View itemView1 = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_type_1_layout, parent, false);
                holder = new TestViewHolder(itemView1);
                break;
            case TYPE_2:
                View itemView2 = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_type_2_layout, parent, false);
                holder = new TestViewHolder(itemView2);
                break;
        }
        return holder;
    }
 
    @Override
    public void onBindViewHolder(TestBaseViewHolder holder, int position) {
        ItemPO item = getItem(position);
        holder.fillData(item);
    }
 
    @Override
    public int getItemCount() {
        return items == null ? 0 : items.size();
    }
 
    public ItemPO getItem(int position) {
        return position >= 0 && position < getItemCount() ? items.get(position) : null;
    }
 
    public void notifyDataSetChanged(List<ItemPO> items) {
        this.items = items;
        notifyDataSetChanged();
    }
}

其中:

public int getItemViewType(int position) :返回position位置的Item的ViewType,以便ItemView回收利用;

public int getItemCount():DataSet中数据Item的个数;

public TestBaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType):根据viewType返回相应的ViewHolder,也就是创建不同UI的ItemView;

public void onBindViewHolder(TestBaseViewHolder holder, int position):将DataSet中position位置的数据填充至该ViewHolder中展示;

运行结果如下图如示,其中红色/蓝色各代表一个用户信息,红色:名字和年龄各占一行展示;蓝色:名字和年龄共占一行展示;

 

可以根据getItemViewType()返回值在onCreateViewHolder()中创建各种各样的Ui样式,然后在onBindViewHolder()中将数据填充展示。

完整示例请参考:

GitHub:GitHub - cxcbupt/FullscreenDemo: My Test Project

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Kotlin实现RecyclerView多种item布局,需要创建多个ViewHolder来适配不同的布局类型。具体步骤如下: ```kotlin // 创建一个通用的ViewHolder类 class BaseViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { // 绑定数据的方法 fun bindData(data: Any) { // 根据不同的数据类型,绑定不同的布局 when (data) { is TypeA -> { // 绑定TypeA布局 } is TypeB -> { // 绑定TypeB布局 } // ... } } } // 创建一个通用的Adapter类 class BaseAdapter(private val dataList: List<Any>) : RecyclerView.Adapter<BaseViewHolder>() { // 根据不同的布局类型,创建不同的ViewHolder override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { return when (viewType) { TYPE_A -> { // 创建TypeA布局的ViewHolder } TYPE_B -> { // 创建TypeB布局的ViewHolder } // ... else -> { // 创建默认布局的ViewHolder } } } // 根据不同的数据类型,返回不同的布局类型 override fun getItemViewType(position: Int): Int { return when (dataList[position]) { is TypeA -> TYPE_A is TypeB -> TYPE_B // ... else -> DEFAULT_TYPE } } // 绑定数据到ViewHolder override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { holder.bindData(dataList[position]) } // 返回数据列表的大小 override fun getItemCount(): Int { return dataList.size } companion object { // 定义不同的布局类型 private const val TYPE_A = 0 private const val TYPE_B = 1 // ... private const val DEFAULT_TYPE = -1 } } ``` 在上述代码中,我们创建了一个通用的ViewHolder类和一个通用的Adapter类。ViewHolder类中的bindData方法根据不同的数据类型,绑定不同的布局。Adapter类中的getItemViewType方法根据不同的数据类型,返回不同的布局类型。在onCreateViewHolder方法中,根据不同的布局类型,创建不同的ViewHolder。在onBindViewHolder方法中,将数据绑定到ViewHolder上。最后,在RecyclerView中设置Adapter即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值