当前位置:   article > 正文

RecyclerView的多布局实现_recyclerview多布局实现

recyclerview多布局实现

      通过学习了RecyclerView的简单使用后,我们不得不讲讲RecyclerView的多布局的实现了,这种用法常见于各种电商类的App。要实现这个效果最主要是复写RecyclerView的适配器里面的getItemViewType()方法,这个方法是根据条件返回Item的类型。不知道你们有没有发现这个方法跟前面那三个方法中的onCreateViewHolder方法的参数viewType的名字有点像?带着这个疑问让我们一起来实现一下RecyclerView的多布局。

      首先创建一个名为RecyclerViewMulti的新项目,引入RecyclerView的包,然后在需要使用RecyclerView控件的XML中加入RecyclerView控件,然后在使用该布局的类中初始化RecyclerView。过程跟之前的简单使用差不多,不明白的请移步RecyclerView的简单使用

      接下来我们先创建一个类用来记录Item的返回类型和Item的数据,名为ItemBean,代码如下:

  1. public class ItemBean {
  2. public String tv_text;
  3. public int type;
  4. }

      然后我们开始初始化数据,创建一个数组长度为8的String类型的数组,这个跟你想要多少个Item有关我就只需要8个就好,这个看你们的需求。甚至你们不需要这个也行的,就直接生成8个数据也是可以的,我是想到时候对不同布局进行更新文字,毕竟我这个是演示。然后在通过 Random函数随机生成0-3的数字不包括3,这边我只设置了3个不一样的布局,这个也是看你们需求。代码如下:

  1. public class MainActivity extends Activity{
  2. private RecyclerView recyclerView;
  3. private String[] text = {"11","22","33","44","55","66","77","88"};
  4. private List<ItemBean> datas = new ArrayList<>();
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.activity_main);
  9. initView();
  10. initData();
  11. }
  12. private void initData() {
  13. Random random = new Random();
  14. for (int i=0;i<text.length;i++){
  15. ItemBean bean =new ItemBean();
  16. bean.tv_text = text[i];
  17. //生成一个0~3的随机数不包括3
  18. bean.type = random.nextInt(3);
  19. datas.add(bean);
  20. }
  21. }
  22. private void initView() {
  23. recyclerView = this.findViewById(R.id.rv_test);
  24. }
  25. }

           之后我们开始创建一个继承于RecyclerView.Adapter的RecyclerViewAdapter的适配器类,引入onCreateViewHolder、onBindViewHolder、getItemCount三个方法,再补充我们的RecyclerViewAdapter的构造函数。我们知道Item的布局是在onCreateViewHolder中设置的,由于我们要设置多布局我们首先复写getItemViewType方法。CTRL+O选择getItemViewType方法进行复写,我设置了三个不同的布局,我们先把三个不同类型的布局用三个静态变量来表示。接着通过传入来的数据进行配对代码如下:

  1. public class RecyclerViewAdapter extends RecyclerView.Adapter {
  2. public static final int TYPE_ONE = 0;
  3. public static final int TYPE_TWO = 1;
  4. public static final int TYPE_TREE = 2;
  5. private Context context;
  6. private List<ItemBean> datas;
  7. public RecyclerViewAdapter(Context context, List<ItemBean> datas){
  8. this.context = context;
  9. this.datas = datas;
  10. }
  11. @NonNull
  12. @Override
  13. public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
  14. return null;
  15. }
  16. @Override
  17. public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
  18. }
  19. @Override
  20. public int getItemCount() {
  21. return 0;
  22. }
  23. @Override
  24. public int getItemViewType(int position) {
  25. ItemBean bean = datas.get(position);
  26. if (bean.type == TYPE_ONE ){
  27. return TYPE_ONE;
  28. }else if (bean.type == TYPE_TWO){
  29. return TYPE_TWO;
  30. }else {
  31. return TYPE_TREE;
  32. }
  33. }
  34. }

            由于Item的布局是由ViewHolder来搭载的我们就需要自定义三个不同的ViewHolder分别对应三个布局,在onCreateViewHolder方法中根据参数ViewType的类型来判断对应加载相应的布局。看到这里大家就知道了,我们复写的getItemViewType方法得出的结果在onCreateViewHolder方法中以参数ViewType进行回调。接着我们跟着它的数值进行判断该Item使用那个布局。代码如下:

  1. public class RecyclerViewAdapter extends RecyclerView.Adapter {
  2. public static final int TYPE_ONE = 0;
  3. public static final int TYPE_TWO = 1;
  4. public static final int TYPE_THREE = 2;
  5. private Context context;
  6. private List<ItemBean> datas;
  7. public RecyclerViewAdapter(Context context, List<ItemBean> datas){
  8. this.context = context;
  9. this.datas = datas;
  10. }
  11. @NonNull
  12. @Override
  13. public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
  14. View view;
  15. if (viewType == TYPE_ONE){
  16. view = View.inflate(context,R.layout.item_one,null);
  17. return new ItemOneViewHolder(view);
  18. }else if (viewType == TYPE_TWO){
  19. view = View.inflate(context,R.layout.item_two,null);
  20. return new ItemTwoViewHolder(view);
  21. }else {
  22. view = View.inflate(context, R.layout.item_three, null);
  23. return new ItemTreeViewHolder(view);
  24. }
  25. }
  26. @Override
  27. public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
  28. }
  29. @Override
  30. public int getItemCount() {
  31. return datas.size();
  32. }
  33. @Override
  34. public int getItemViewType(int position) {
  35. ItemBean bean = datas.get(position);
  36. if (bean.type == TYPE_ONE ){
  37. return TYPE_ONE;
  38. }else if (bean.type == TYPE_TWO){
  39. return TYPE_TWO;
  40. }else {
  41. return TYPE_THREE;
  42. }
  43. }
  44. class ItemOneViewHolder extends RecyclerView.ViewHolder{
  45. public ItemOneViewHolder(@NonNull View itemView) {
  46. super(itemView);
  47. }
  48. }
  49. class ItemTwoViewHolder extends RecyclerView.ViewHolder{
  50. public ItemTwoViewHolder(@NonNull View itemView) {
  51. super(itemView);
  52. }
  53. }
  54. class ItemTreeViewHolder extends RecyclerView.ViewHolder{
  55. public ItemTreeViewHolder(@NonNull View itemView) {
  56. super(itemView);
  57. }
  58. }
  59. }

同时三个布局的XML代码如下:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="wrap_content"
  4. android:orientation="vertical"
  5. >
  6. <LinearLayout
  7. android:layout_width="match_parent"
  8. android:padding="7dp"
  9. android:background="#fff"
  10. android:orientation="vertical"
  11. android:layout_height="wrap_content">
  12. <TextView
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:textColor="#000"
  16. android:text="1111111111111111111111111111111111111111111111111111111"
  17. android:textSize="16sp"
  18. />
  19. <ImageView
  20. android:layout_width="match_parent"
  21. android:layout_height="150dp"
  22. android:background="@mipmap/ic_launcher"
  23. android:scaleType="fitXY"
  24. />
  25. </LinearLayout>
  26. <View
  27. android:layout_marginTop="3dp"
  28. android:layout_width="match_parent"
  29. android:layout_height="1dp"
  30. android:background="#d3d3d3"
  31. />
  32. </LinearLayout>
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="wrap_content"
  4. android:orientation="vertical"
  5. >
  6. <LinearLayout
  7. android:orientation="vertical"
  8. android:layout_width="match_parent"
  9. android:background="#fff"
  10. android:padding="7sp"
  11. android:layout_height="wrap_content">
  12. <TextView
  13. android:layout_width="match_parent"
  14. android:layout_height="wrap_content"
  15. android:text="33333333333333333333333333333333333333333333333333333333333333333333333333333333333333"
  16. android:textColor="#000"
  17. android:textSize="16sp" />
  18. <LinearLayout
  19. android:layout_width="match_parent"
  20. android:layout_height="wrap_content"
  21. android:orientation="horizontal">
  22. <ImageView
  23. android:layout_width="0dp"
  24. android:layout_height="80dp"
  25. android:layout_weight="1"
  26. android:scaleType="fitXY"
  27. android:src="@mipmap/ic_launcher" />
  28. <View
  29. android:layout_width="6dp"
  30. android:layout_height="0dp"/>
  31. <ImageView
  32. android:layout_width="0dp"
  33. android:layout_height="80dp"
  34. android:layout_weight="1"
  35. android:scaleType="fitXY"
  36. android:src="@mipmap/ic_launcher" />
  37. <View
  38. android:layout_width="6dp"
  39. android:layout_height="0dp"/>
  40. <ImageView
  41. android:layout_width="0dp"
  42. android:layout_height="80dp"
  43. android:layout_weight="1"
  44. android:scaleType="fitXY"
  45. android:src="@mipmap/ic_launcher" />
  46. </LinearLayout>
  47. </LinearLayout>
  48. <View
  49. android:layout_marginTop="3dp"
  50. android:background="#d3d3d3"
  51. android:layout_width="match_parent"
  52. android:layout_height="1dp"/>
  53. </LinearLayout>
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="100dp"
  4. android:orientation="vertical"
  5. >
  6. <LinearLayout
  7. android:layout_width="match_parent"
  8. android:layout_height="wrap_content"
  9. android:background="#fff"
  10. android:orientation="horizontal"
  11. android:padding="7dp">
  12. <TextView
  13. android:layout_width="0dp"
  14. android:layout_height="wrap_content"
  15. android:layout_weight="1"
  16. android:text="2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
  17. android:textColor="#000"
  18. android:textSize="16sp" />
  19. <ImageView
  20. android:layout_width="120dp"
  21. android:layout_height="90dp"
  22. android:background="@mipmap/ic_launcher" />
  23. </LinearLayout>
  24. <View
  25. android:layout_marginTop="3dp"
  26. android:layout_width="match_parent"
  27. android:layout_height="1dp"
  28. android:background="#d3d3d3"
  29. />
  30. </LinearLayout>

               接下来我们回使用RecyclerView控件布局的类中对RecyclerView进行 Layout的设置和实例化我们刚刚写的RecyclerViewAdapter的类,然后设置该适配器给我们的RecyclerView,运行项目就能看到多布局的效果。代码如下:

  1. private void initRecyclerView() {
  2. recyclerView.setLayoutManager(new LinearLayoutManager(this));
  3. RecyclerViewAdapter adapter = new RecyclerViewAdapter(this,datas);
  4. recyclerView.setAdapter(adapter);
  5. }

原创:https://blog.csdn.net/weixin_40600325

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/174940
推荐阅读
相关标签
  

闽ICP备14008679号