一个列表的基本写法
第一步:创建列表单元格,创建 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"