【Android】四种不同类型的ViewHolder的xml布局

发布于:2025-08-15 ⋅ 阅读:(17) ⋅ 点赞:(0)

在这里插入图片描述

三三要成为安卓糕手
书接上文

一:四种不同类型的ViewHolder的xml布局

广告样式

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/white">

    <ImageView
        android:id="@+id/iv_picture"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:scaleType="centerCrop"
        android:src="@drawable/bg_ad1"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


    <TextView
        android:id="@+id/tv_close"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:ellipsize="end"
        android:maxLines="2"
        android:text="点击关闭广告"
        android:textColor="@color/white"
        android:textSize="18sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="@id/iv_picture" />


</androidx.constraintlayout.widget.ConstraintLayout>

单张图片的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/iv_picture"
        android:layout_width="100dp"
        android:layout_height="70dp"
        android:scaleType="centerCrop"
        android:src="@drawable/icon_logo"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:ellipsize="end"
        android:maxLines="2"
        android:text="落魄谷中寒风吹,春秋蝉鸣少年归,荡魂山处石人泪,定仙游走魔向北,逆流河上万仙退,爱情不敌坚持泪,宿命天成命中败,仙尊悔而我不悔"
        android:textSize="18sp"
        android:textStyle="bold"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@id/iv_picture"
        app:layout_constraintTop_toTopOf="@id/iv_picture" />

    <TextView
        android:id="@+id/tv_author"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:ellipsize="end"
        android:maxLines="1"
        android:text="作者:大爱仙尊"
        android:textSize="16sp"
        app:layout_constraintStart_toEndOf="@id/iv_picture"
        app:layout_constraintTop_toBottomOf="@+id/tv_title" />


</androidx.constraintlayout.widget.ConstraintLayout>

两张图片的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/white"
    android:padding="12dp">


    <TextView
        android:id="@+id/tv_title"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:ellipsize="end"
        android:maxLines="2"
        android:text="我是一个标题我是一个标题我是一个标题我是一个标题我是一个标题我是一个标题我是一个标题我是一个标题我是一个标题我是一个标题"
        android:textColor="@color/black"
        android:textSize="18sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


    <TextView
        android:id="@+id/tv_author"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:ellipsize="end"
        android:maxLines="1"
        android:text="我是作者我是作者我是作者"
        android:textSize="16sp"
        app:layout_constraintEnd_toEndOf="@id/iv_picture2"
        app:layout_constraintTop_toBottomOf="@id/iv_picture2" />

    <ImageView
        android:id="@+id/iv_picture1"
        android:layout_width="0dp"
        android:layout_height="100dp"
        android:scaleType="centerCrop"
        android:layout_marginTop="8dp"
        android:src="@drawable/ic_article_1"
        app:layout_constraintEnd_toStartOf="@id/iv_picture2"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/tv_title" />

    <ImageView
        android:id="@+id/iv_picture2"
        android:layout_width="0dp"
        android:layout_height="100dp"
        android:layout_marginLeft="20dp"
        android:scaleType="centerCrop"
        android:src="@drawable/ic_article_2"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@id/iv_picture1"
        app:layout_constraintTop_toTopOf="@id/iv_picture1" />


</androidx.constraintlayout.widget.ConstraintLayout>

三张图片的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/white"
    android:padding="12dp">


    <TextView
        android:id="@+id/tv_title"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:ellipsize="end"
        android:maxLines="2"
        android:text="我是一个标题我是一个标题我是一个标题我是一个标题我是一个标题我是一个标题我是一个标题我是一个标题我是一个标题我是一个标题"
        android:textColor="@color/black"
        android:textSize="18sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


    <TextView
        android:id="@+id/tv_author"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:ellipsize="end"
        android:maxLines="1"
        android:text="我是作者我是作者我是作者"
        android:textSize="16sp"
        app:layout_constraintEnd_toEndOf="@id/iv_picture3"
        app:layout_constraintTop_toBottomOf="@id/iv_picture3" />

    <ImageView
        android:id="@+id/iv_picture1"
        android:layout_width="0dp"
        android:layout_height="100dp"
        android:layout_marginTop="8dp"
        android:scaleType="centerCrop"
        android:src="@drawable/ic_article_1"
        app:layout_constraintEnd_toStartOf="@id/iv_picture2"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/tv_title" />

    <ImageView
        android:id="@+id/iv_picture2"
        android:layout_width="0dp"
        android:layout_height="100dp"
        android:layout_marginLeft="6dp"
        android:scaleType="centerCrop"
        android:src="@drawable/ic_article_2"
        app:layout_constraintEnd_toStartOf="@id/iv_picture3"
        app:layout_constraintStart_toEndOf="@id/iv_picture1"
        app:layout_constraintTop_toTopOf="@id/iv_picture1" />

    <ImageView
        android:id="@+id/iv_picture3"
        android:layout_width="0dp"
        android:layout_height="100dp"
        android:layout_marginLeft="6dp"
        android:scaleType="centerCrop"
        android:src="@drawable/ic_article_3"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@id/iv_picture2"
        app:layout_constraintTop_toTopOf="@id/iv_picture1" />


</androidx.constraintlayout.widget.ConstraintLayout>

二:getItemViewType

新的知识点,用来判断布局类型,提前设计好int类成员变量用于返回值;在创建Holder(杯子)时,返回值直接作为参数传递给onCreateViewHolder方法中的形参viewtype了,具体内部源代码是怎么实现的不深究

三:Article类的设计

package com.xlong.myapplication.recyclerview;

public class Article {
    private String title;//标题
    private String desc;//描述
    private String author;//作者
    private long publish;//发布时间
    private int picture;//图片资源

    private int picture2;//图片资源2
    private int picture3;//图片资源3
    private boolean idAd;//当前的咨询是不是广告
    private int adPicture;//广告对应的图片资源

    public int getPicture2() {
        return picture2;
    }

    public void setPicture2(int picture2) {
        this.picture2 = picture2;
    }

    public int getPicture3() {
        return picture3;
    }

    public void setPicture3(int picture3) {
        this.picture3 = picture3;
    }

    public boolean isIdAd() {
        return idAd;
    }

    public void setIdAd(boolean idAd) {
        this.idAd = idAd;
    }

    public int getAdPicture() {
        return adPicture;
    }

    public void setAdPicture(int adPicture) {
        this.adPicture = adPicture;
    }

    public Article(boolean idAd, int adPicture) {
        this.idAd = idAd;
        this.adPicture = adPicture;
    }


    public Article(String title, String author, int picture) {
        this.title = title;
        this.author = author;
        this.picture = picture;
    }

    public int getPicture() {
        return picture;
    }

    public void setPicture(int picture) {
        this.picture = picture;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public long getPublish() {
        return publish;
    }

    public void setPublish(long publish) {
        this.publish = publish;
    }
}

四:一些细节

1:设计

图片成员变量怎么设计

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

创建数据中不同的Article类型(两、三张图片,广告),使用不同的构造方法,或者get和set方法。这些都是基本功要掌握扎实

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2:数据源的创建细节

在设置循环视图中,数据在适配器的添加之前,或者之后问题都不大

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因为setArticles中notifyDataSetChanged();的调用会告诉RecycleView刷新数据

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3:多布局的设计,不要用泛型

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4:case + default 允许共存

在写创建Holder,内部代码逻辑的时候不要返回一个null,无论如何都需要给onCreateViewHolder返回一个viewHolder

switch 结构里:

  • case 用于匹配具体的条件分支,处理特定的情况(比如 case ITEM_TYPE_ARTICLE_1 想处理类型为 ITEM_TYPE_ARTICLE_1 的情况 )。
  • default 是 “兜底” 分支,当所有 case 都没匹配上时,才会走 default 里的逻辑。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5:对比一下

对比一下就明白了,左图是一种视图类型所以只用一个MyVIewHolder(用的是泛型)即可;我们增加到了4种MyviewHolder如右图代码处理逻辑

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

6:效果图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

五:为RecyclerView添加分割线

需求:为每一个item做一个分割线

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

思路在每一个四种xml布局中单独,设置一个view分割线,

    <View
        android:layout_width="match_parent"
        android:layout_height="1px"
        android:background="@color/my_blue"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

但是会比较麻烦一点:单独做一个分割线,要加内边距,嵌套什么的,得不偿失,只作为备选方案,就比如以下的代码

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="12dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">


        <ImageView
            android:id="@+id/iv_picture"
            android:layout_width="100dp"
            android:layout_height="70dp"
            android:scaleType="centerCrop"
            android:src="@drawable/icon_logo"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/tv_title"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="8dp"
            android:ellipsize="end"
            android:maxLines="2"
            android:text="落魄谷中寒风吹,春秋蝉鸣少年归,荡魂山处石人泪,定仙游走魔向北,逆流河上万仙退,爱情不敌坚持泪,宿命天成命中败,仙尊悔而我不悔"
            android:textSize="18sp"
            android:textStyle="bold"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@id/iv_picture"
            app:layout_constraintTop_toTopOf="@id/iv_picture" />

        <TextView
            android:id="@+id/tv_author"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="8dp"
            android:ellipsize="end"
            android:maxLines="1"
            android:text="作者:大爱仙尊"
            android:textSize="16sp"
            app:layout_constraintStart_toEndOf="@id/iv_picture"
            app:layout_constraintTop_toBottomOf="@+id/tv_title" />


    </androidx.constraintlayout.widget.ConstraintLayout>

效果如下,一般般吧

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1:安卓默认自带分割线

Recycle中提供了直接添加分割线的方法


            //4.1系统自带分割线
        recyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));

(1)addItemDecoration()

添加item装饰;参数是 ItemDecoration 的子类实例

(2)new DividerItemDecoration()

这是 Android 系统提供的一个ItemDecoration子类

创建item装饰分割器,

  • 第一个参数 context:上下文对象,通常是当前 Activity

  • 第二个参数 orientation:分割线方向

    • DividerItemDecoration.VERTICAL:垂直方向的分割线(用于垂直滚动的列表)
    • DividerItemDecoration.HORIZONTAL:水平方向的分割线(用于水平滚动的列表)

2:用图片当做分割线

//4.2使用图片素材作为分割线
        DividerItemDecoration decoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL);
        Drawable drawable = getDrawable(R.drawable.item_div);
        decoration.setDrawable(drawable);
        recyclerView.addItemDecoration(decoration);

其实就比上面的代码多了一个setDrawable(),上面代码内部应该有默认设置了一个Drawable

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

自定义图片作为分割线,对照片的要求更高,后面还会学习在安卓studio中,自己去画一些图片,现在就先学这两种方式就OK了