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 LayoutManageradapter 创建 RecyclerView 然后创建 LayoutManager选择是线性、表格或者瀑布流,构造函数的参数 context 传 this
RecyclerView 再设置 LayoutManagerRecyclerView

再创建 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 一起滚动或者进行折叠,则 AppBarLayoutRecyclerView 必须放在 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 子视图(如 ToolbarCollapsingToolbarLayout)与可滚动视图(如 RecyclerViewNestedScrollView)联动滚动的核心属性。

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

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

相关推荐
QiLinkOS36 分钟前
QiLink OS的失败数据共享平台的运作模式是否适用于所有行业?
android·开发语言·人工智能·算法·重构·开源
杉氧1 小时前
Framework 补完计划 (2):BufferQueue 与 SurfaceFlinger —— 像素的跨进程“接力赛”
android·架构·android jetpack
牢七1 小时前
RCE?复现成功
android
一化十1 小时前
Android16 自定义全局手势 任意界面依次点击屏幕四个角返回Home界面
android
三少爷的鞋3 小时前
Android 面试系列:Kotlin 协程的 delay 到底发生在哪个线程?
android
TechNomad14 小时前
Kotlin_Lambda编程详解
android·kotlin
熊猫_豆豆15 小时前
QT6 Android C++ 自制美观闹钟
android·c++·qt·闹钟
美狐美颜SDK开放平台15 小时前
Android/iOS直播APP平台开发中的视频美颜SDK优化技巧
android·ios·音视频·美颜sdk·第三方美颜sdk
聚美智数18 小时前
黄历查询-运势查询-国际法定节假日查询-API接口介绍
android·java·数据库
私人珍藏库19 小时前
[Android] 一木百宝箱-万能百宝箱+抖音去水印等几百种功能
android·人工智能·app·软件·多功能