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"

相关推荐
rocpp7 小时前
Android 相册选择与拍照接入实践:MediaStore 分页、权限适配与 FileProvider
android
Flynt8 小时前
升级Flutter 3.44,我踩了HCPP和AGP 9的坑
android·flutter·dart
白色牙膏9 小时前
Cocos Creator 2.4.x 接入 AdMob 插件的迁移实践
android
我命由我1234511 小时前
C++ - 面向对象 - 常成员函数
android·java·linux·c语言·开发语言·c++·算法
tryqaaa_11 小时前
学习日志(四)【php反序列化魔术方法以及pop构造配实战】
android
Java小学生丶13 小时前
记录一下我的 Gradle 开发环境配置过程
android·java·gradle·maven·安卓
问心无愧051314 小时前
ctf show web 入门256
android·前端·笔记
霸道流氓气质14 小时前
MySQL 索引设计实战指南
android·数据库·mysql
R语言爱好者14 小时前
叠氮酸介绍
android
方白羽14 小时前
Android WebView 中实现第三方 QQ 登录的架构与流程详解
android·app