用于通过带有圆角布局和特定阴影效果来显示各种数据。CardView 可以用于创建 ListView 或 RecyclerView 中的条目布局。
创建CardView
1. CardView 条目布局
一个用于表示 RecyclerView 中单个条目布局的 XML 布局文件。
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="220dp"
android:layout_margin="8dp"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:cardBackgroundColor="@color/black"
app:cardElevation="20dp"
app:cardCornerRadius="40dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/image_view"
android:layout_width="0dp"
android:layout_height="0dp"
android:src="@drawable/basketball"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/text_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:text="Title"
android:textSize="48sp"
android:textColor="@color/black"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
2. RecyclerView
在 Activity 中创建一个 RecyclerView 并初始化。activity_main.xml 布局文件的内容,如下所示
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ImageView
android:id="@+id/imageView3"
android:layout_width="0dp"
android:layout_height="220dp"
android:layout_marginTop="4dp"
android:src="@drawable/header"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageView3" />
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.java 文件的内容,如下所示
package com.stewednoodles.sportsapp;
import android.os.Bundle;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
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 java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private List<Sport> sports;
private SportAdapter sportAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
recyclerView = findViewById(R.id.recycler_view);
sports = new ArrayList<>() ;
sports.add(new Sport("Football", R.drawable.football));
sports.add(new Sport("Basketball", R.drawable.basketball));
sports.add(new Sport("Ping Ping", R.drawable.ping));
sports.add(new Sport("Volleyball", R.drawable.volley));
sports.add(new Sport("Tennis", R.drawable.tennis));
sportAdapter = new SportAdapter(sports);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(sportAdapter);
}
}
3. Model Class 模型类
表示用于保存 RecyclerView 每个条目信息的数据结构。
package com.stewednoodles.sportsapp;
public class Sport {
private String sportName;
private int sportImage;
public Sport(String sportName, int sportImage) {
this.sportName = sportName;
this.sportImage = sportImage;
}
public String getSportName() {
return sportName;
}
public void setSportName(String sportName) {
this.sportName = sportName;
}
public int getSportImage() {
return sportImage;
}
public void setSportImage(int sportImage) {
this.sportImage = sportImage;
}
}
4. Adapter Class 适配器类
包含所有与 RecyclerView 实现相关的方法(创建、绑定以及确定条目数量)。
package com.stewednoodles.sportsapp;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class SportAdapter extends RecyclerView.Adapter<SportAdapter.SportViewHolder> {
private List<Sport> sports;
public SportAdapter(List<Sport> sports) {
this.sports = sports;
}
@NonNull
@Override
public SportViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
// 从XML布局中创建View
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.card_item_layout, parent, false);
return new SportViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull SportViewHolder holder, int position) {
// 获取数据
Sport sport = sports.get(position);
// 绑定数据
holder.backgroundImageView.setImageResource(sport.getSportImage());
holder.titleTextView.setText(sport.getSportName());
}
@Override
public int getItemCount() {
return sports.size();
}
public static class SportViewHolder extends RecyclerView.ViewHolder {
ImageView backgroundImageView;
TextView titleTextView;
public SportViewHolder(View itemView) {
super(itemView);
// 查找 View
backgroundImageView = itemView.findViewById(R.id.image_view);
titleTextView = itemView.findViewById(R.id.text_view);
}
}
}
5. View Holder
保存每个条目布局中视图的引用,用于优化视图查找效率。View Holder 的示例代码,见 4. Adapter Class 适配器类
运行效果
示例代码的运行效果,如下所示

© 版权声明
THE END











暂无评论内容