Android一些基础-06-一个列表的基本写法

一个列表的基本写法

第一步:创建列表单元格,创建 layout xml 文件,其中实现单元格的布局,举例 :使用 CardView 写个 item

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>  
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="wrap_content"  
    android:layout_margin="5dp"  
    app:cardBackgroundColor="#facd4e"  
    xmlns:app="http://schemas.android.com/apk/res-auto"  
    android:id="@+id/card_view">  
    <androidx.constraintlayout.widget.ConstraintLayout  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:padding="16dp"  
  
        >  
        <TextView  
            android:id="@+id/list_title"  
            android:layout_width="0dp"  
            android:layout_height="wrap_content"  
            android:textSize="18sp"  
            app:layout_constraintStart_toStartOf="parent"  
            app:layout_constraintEnd_toEndOf="parent"  
            app:layout_constraintTop_toTopOf="parent"  
            >  
        </TextView>  
        <TextView  
            android:id="@+id/list_detail"  
            android:layout_width="0dp"  
            android:layout_height="wrap_content"  
            app:layout_constraintTop_toBottomOf="@id/list_title"  
            app:layout_constraintStart_toStartOf="parent"  
            app:layout_constraintEnd_toEndOf="parent"  
            app:layout_constraintBottom_toBottomOf="parent"  
            android:textSize="14sp"  
            android:layout_marginTop="5dp"  
            >  
  
        </TextView>  
  
    </androidx.constraintlayout.widget.ConstraintLayout>  
  
</androidx.cardview.widget.CardView>

第二步:创建继承自 RecyclerView.Adapter<RecyclerAdapter.ViewHolder> 的 adapter 创建 ViewHolder 静态类用于获取刚刚创建的单元格中的组件

重写 onCreateViewHolder 方法设置布局文件的视图到 ViewHolder 上

重写 onBindViewHolder 方法进行对组件数据的绑定

重写 getItemCount 方法返回单元格数量

java 复制代码
package com.example.basepractice.baseUI.demo3;  
  
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 com.example.basepractice.R;  
  
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {  
  
    private String[] data = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"};  
    private String[] dataDetail = {"day1", "day2", "day3", "day4", "day5", "day6", "day7", "day8", "day9", "day10"};  
  
    public static class ViewHolder extends RecyclerView.ViewHolder {  
        public TextView listTitleTxt;  
        public TextView listDetailTxt;  
        public ViewHolder(@NonNull View itemView) {  
            super(itemView);  
            listTitleTxt = itemView.findViewById(R.id.list_title);  
            listDetailTxt = itemView.findViewById(R.id.list_detail);  
  
        }  
    }  
  
    @NonNull  
    @Override    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {  
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_layout, parent, false);  
        return new ViewHolder(view);  
    }  
  
    @Override  
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {  
        holder.listTitleTxt.setText(data[position]);  
        holder.listDetailTxt.setText(dataDetail[position]);  
    }  
  
    @Override  
    public int getItemCount() {  
        return data.length;  
    }  
}

第三步:在相关 Activity 创建 RecyclerView LayoutManager 和 adapter 创建 RecyclerView 然后创建 LayoutManager选择是线性、表格或者瀑布流,构造函数的参数 context 传 this
RecyclerView 再设置 LayoutManager到 RecyclerView 上

再创建 Adapter 把 adapter 设置到 RecyclerView 上

java 复制代码
package com.example.basepractice.baseUI.demo3;  
  
import android.os.Bundle;  
  
import androidx.activity.EdgeToEdge;  
import androidx.appcompat.app.AppCompatActivity;  
import androidx.constraintlayout.widget.ConstraintLayout;  
import androidx.core.graphics.Insets;  
import androidx.core.view.ViewCompat;  
import androidx.core.view.WindowInsetsCompat;  
import androidx.recyclerview.widget.LinearLayoutManager;  
import androidx.recyclerview.widget.RecyclerView;  
  
import com.example.basepractice.R;  
import com.example.basepractice.baseUI.basic.BasicActivity;  
  
public class Demo3Activity extends BasicActivity {  
    private RecyclerView recyclerView;  
    private RecyclerView.LayoutManager layoutManager;  
  
    private RecyclerAdapter adapter;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        EdgeToEdge.enable(this);  
        setContentView(R.layout.activity_demo3);  
  
        recyclerView = findViewById(R.id.list_view);  
  
        layoutManager = new LinearLayoutManager(this);  
  
        recyclerView.setLayoutManager(layoutManager);  
  
        adapter = new RecyclerAdapter();  
  
        recyclerView.setAdapter(adapter);  
    }  
}

运行效果

AppBar

AppBar 是当应用运行时出现在屏幕顶部的区域,可配置为包含各种不同的项目,包括状态栏 status Bar、工具栏 tool bar、标签栏 tabbar 和一个灵活空间区域。

如果需要 AppBar 跟随 RecyclerView 一起滚动或者进行折叠,则 AppBarLayout 与 RecyclerView 必须放在 CoordinatorLayout 中

原因:1. 嵌套滑动机制依赖 CoordinatorLayout:
CoordinatorLayout 是 Android 中实现复杂联动交互的核心容器,其核心能力在于通过 Behavior 机制协调子视图的滚动行为。

嵌套滑动事件分发:CoordinatorLayout 负责将 RecyclerView 的滑动事件传递给 AppBarLayout,并通过 AppBarLayout.Behavior 触发折叠动画。若使用 ConstraintLayout,因缺乏 Behavior 机制,无法实现滑动联动

滚动标志生效条件:AppBarLayout 的子视图(如 Toolbar)必须设置 app:layout_scrollFlags,但这些标志仅在 AppBarLayout 是 CoordinatorLayout 的直接子视图时生效

2.布局层级与事件协调: 直接父子关系要求 :AppBarLayout 必须作为 CoordinatorLayout 的直接子视图,否则无法通过 app:layout_behavior 关联 RecyclerView 的滚动行为。若将 RecyclerView 放在 ConstraintLayout 中,事件分发链路会被破坏,导致联动失效
高度计算逻辑 :CoordinatorLayout 的测量过程会动态调整 RecyclerView 的高度,使其适配 AppBarLayout 的折叠状态。而 ConstraintLayout 的静态布局规则无法处理此类动态高度变化

app:layout_scrollFlags 属性

app:layout_scrollFlags 是 Android Material Design 中用于控制 AppBarLayout 子视图(如 Toolbar、CollapsingToolbarLayout)与可滚动视图(如 RecyclerView、NestedScrollView)联动滚动的核心属性。

注意事项:
AppBarLayout 必须嵌套在 CoordinatorLayout 内。

可滚动视图需设置 app:layout_behavior="@string/appbar_scrolling_view_behavior"

相关推荐
Starry-sky(jing)5 小时前
Vidda ADB 开启:R Pro 65 找不到开发者选项的处理与连接验收
android·adb·远程控制·电视·vidda
雨白5 小时前
从原理到实践:使用 Kotlin KSP 仿写 ButterKnifeLite
android·kotlin
疯华整猫6 小时前
把二十七个 init 从首帧前面搬走:用 Trae 把启动优化钉进 CI
android·性能优化·ai编程
传奇开心果7 小时前
【探秘 Jetpack Compose 框架深水区】 第8课:rememberSaveable 的边界在哪里?——Bundle、Saver 与什么值得跨进程存活
android·kotlin
Frankie_stand8 小时前
测试自动化实战指南:从脚本化、自动判据到 CI 集成的完整落地路径
android·ci/cd·自动化
恋猫de小郭9 小时前
Flutter 大小核优化又被回滚,然后又开新提案?
android·前端·flutter
Kapaseker9 小时前
领导问我 Kotlin 的 Nothing 是什么?
android·kotlin
韩曙亮10 小时前
【错误记录】安卓 adb 调试 5037 端口占用排查 ( adb 的三层结构 | 找出本机占用 5037 的进程 )
android·数据库·adb·安卓·错误记录
三少爷的鞋11 小时前
不改变异步本质,只改变代码组织:Telegram 项目的 Kotlin 协程实践
android
好的佩奇20 小时前
蓝牙之广播与扫描
android·flutter·蓝牙