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"

相关推荐
V少年6 分钟前
深入浅出安卓Handler内存屏障
android
好学人7 分钟前
Android Handler 机制详解
android
好学人13 分钟前
一文弄懂Fragment的生命周期
android
浅忆无痕18 分钟前
Flutter空安全最小必备知识
android·前端·flutter
虾球xz31 分钟前
游戏引擎学习第224天
android·学习·游戏引擎
牛马程序小猿猴44 分钟前
9.thinkphp的请求
android
慢热型网友.5 小时前
从PDF中提取表格:以GB/T2260—2007为例
android·pdf
安小牛5 小时前
Kotlin 学习-方法和参数类型
android·学习·kotlin·android studio
_一条咸鱼_10 小时前
大厂Android面试秘籍:Activity 结果回调处理(八)
android·面试·android jetpack
_一条咸鱼_10 小时前
大厂Android面试秘籍:Activity 与 Fragment 交互(九)
android·面试·android jetpack