一、技术概述
1.1 recyclerView
recyclerView 是 Android 中用于显示大数据集合的高性能视图控件。它是 ListView 和 GridView 的现代替代品,提供了更灵活、可定制的布局和更高效的数据展示方式。
以下是recyclerView的特点:
①灵活性和可定制性: RecyclerView 提供了灵活的布局管理器(LayoutManager),允许以不同的方式排列和展示数据。我们可以使用线性布局、网格布局、瀑布流布局等,也可以自定义布局管理器。
②ViewHolder 模式: 与 ListView 不同,RecyclerView 引入了 ViewHolder 模式,将视图的创建和绑定数据分离。这提高了滚动性能,因为它只在需要时创建新的视图,而不是为每个数据项都创建一个新的视图。
③Item 动画: RecyclerView 支持内置的 item 动画,你可以轻松地添加动画效果来提升用户体验。这包括添加、删除、移动等操作的动画效果。
recyclerView包括的元素有以下:
①Adapter(适配器): RecyclerView 使用适配器来将数据绑定到视图。适配器负责创建 ViewHolder 对象,以及将数据绑定到这些 ViewHolder 上。你需要自定义适配器来适应你的数据源和视图布局。
②ViewHolder(视图持有者): ViewHolder 是一种模式,它将每个视图的元素缓存起来,以便在滚动过程中能够快速重用。通过减少视图的创建次数,ViewHolder 模式可以提高性能。在适配器中,你需要创建一个 ViewHolder 类,它继承自 RecyclerView.ViewHolder,并用于保存每个子项的视图引用。
③LayoutManager(布局管理器): 布局管理器负责确定 RecyclerView 中每个子项的排列方式。Android 提供了一些默认的布局管理器,如 LinearLayoutManager(线性布局,支持垂直和水平方向)、GridLayoutManager(网格布局,支持网格形式的排列)和 StaggeredGridLayoutManager(瀑布流布局,支持交错的排列)。你也可以自定义布局管理器。
④ItemDecoration(装饰器): ItemDecoration 用于在 RecyclerView 的子项之间添加装饰,如分割线或者背景。这是一种简单的方式来定制 RecyclerView 的外观。
⑤ItemAnimator(动画): ItemAnimator 用于控制在数据变化时 RecyclerView 子项的动画效果。Android 提供了一些默认的 ItemAnimator,也可以自定义以满足特定需求。
⑥RecyclerView.ViewHolder: 这是一个泛型类,用于保存每个子项的视图引用。在适配器中创建和使用 ViewHolder 对象,以提高性能。
⑦RecyclerView.Adapter: 这是一个泛型类,负责管理数据集并创建 ViewHolder。适配器负责将数据绑定到 ViewHolder 上,以及处理数据集的变化。
⑧RecyclerView: 这是 RecyclerView 的主体部分,负责显示子项、处理滚动和触摸事件。通过设置适配器、布局管理器等来配置 RecyclerView。
1.2 Intent
在 Android 开发中,Intent 是一个用于在不同组件之间传递信息的对象。它主要用于启动组件(如启动 Activity、Service、BroadcastReceiver),但也可用于在组件之间传递数据。以下是 Intent 的一些关键概念和用法:
① 启动组件: Intent 主要用于启动应用中的各种组件。通过 Intent,你可以请求系统启动一个 Activity、Service 或者发送一个广播给 BroadcastReceiver。
② 显式 Intent 和隐式 Intent:
显式 Intent: 当你明确指定要启动的组件时,使用显式 Intent。例如,启动另一个应用的特定 Activity。
Intent explicitIntent = new Intent(CurrentActivity.this, TargetActivity.class);
startActivity(explicitIntent);
隐式 Intent: 当你希望系统根据某个操作、数据类型或者其他条件来选择要启动的组件时,使用隐式 Intent。例如,打开浏览器显示特定网址。
Intent implicitIntent = new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.baidu.com"));
startActivity(implicitIntent);
③传递数据: 你可以使用 Intent 在组件之间传递数据。通过在 Intent 中添加额外的信息,可以将数据从一个组件传递到另一个组件。
Intent intent = new Intent(CurrentActivity.this, TargetActivity.class);
intent.putExtra("key", "value");
startActivity(intent);
在目标组件中,你可以使用 getIntent()
方法获取传递的 Intent,然后使用 getStringExtra("key")
获取传递的值。
二、项目介绍
本项目分为四个界面:
①第一个界面名为装备界面,使用了recyclerView瀑布流控件,展现一些羽毛球装备,可以上下滑动查看,点击图片,会显示当前点击的标题。
②第二个界面名为球星界面,通过将球星的信息封装为Sportsman类,实例化出对象,将这些对象通过recyclerView展现出来,此外,点击球星的简介栏,可以跳转到详情界面,查看球星的具体信息,最后也可以返回到原界面。
③第三个和第四个界面和第一次作业中一直,只显示“这里是消息界面”和“这里是我的界面的字样”。
三、界面一(瀑布流recyclerView)
主要包括以下几个部分:
①RecyclerIntentFragment2.java:
一个继承自Fragment
的类,表示一个碎片(Fragment)。
通过newInstance
方法创建一个新的RecyclerIntentFragment2
实例。
包含一个RecyclerView
用于显示卡片列表。
在onCreateView
方法中,通过布局文件fragment_recycler_intent2.xml
初始化布局,并使用StaggeredGridLayoutManager
设置RecyclerView
的布局为瀑布流样式。
创建卡片数据列表,设置适配器,并将适配器绑定到RecyclerView
上。
核心代码:
private RecyclerView recyclerView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// 将布局文件fragment_recycler_intent2.xml填充到该碎片中
View view = inflater.inflate(R.layout.fragment_recycler_intent2, container, false);
// 创建卡片数据列表
List<Card> cardList = new ArrayList<Card>();
// 获取布局文件中的RecyclerView实例
recyclerView = view.findViewById(R.id.recyclerView_intent2);
// 添加卡片数据到列表
Card c1 = new Card("bg80", R.drawable.bg80);
cardList.add(c1);
Card c2 = new Card("9200td", R.drawable.pd9200);
cardList.add(c2);
Card c3 = new Card("003", R.drawable.bao);
cardList.add(c3);
Card c4 = new Card("102C", R.drawable.c102);
cardList.add(c4);
Card c5 = new Card("天斧99pro", R.drawable.pro99);
cardList.add(c5);
Card c6 = new Card("lining战戟8000", R.drawable.zj8000);
cardList.add(c6);
Card c7 = new Card("龙牙之刃一代", R.drawable.longya);
cardList.add(c7);
Card c8 = new Card("天斧1000zz", R.drawable.zz1000);
cardList.add(c8);
Card c9 = new Card("亚狮龙7号球", R.drawable.ya5);
cardList.add(c9);
// 设置RecyclerView的布局管理器为瀑布流样式,2列,垂直方向
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager);
// 创建并设置RecyclerView的适配器,将卡片数据列表传递给适配器
Myadapter_stream adapter = new Myadapter_stream(cardList);
recyclerView.setAdapter(adapter);
// 返回填充后的视图
return view;
}
②Myadapter_stream.java:
一个自定义的RecyclerView
适配器,继承自RecyclerView.Adapter
。
负责创建和绑定卡片视图。
包含一个MyStreamHolder
内部类,表示RecyclerView
中每个卡片的视图容器。
在onCreateViewHolder
中设置了点击事件,当卡片的图片被点击时,显示一个包含卡片标题的短时提示消息(Toast)。
实现了必要的方法,包括onBindViewHolder
和getItemCount
。
核心代码:
package com.example.work1;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class Myadapter_stream extends RecyclerView.Adapter<Myadapter_stream.MyStreamHolder> {
private List<Card> cards;
// 构造方法,接收卡片数据列表
public Myadapter_stream(List<Card> cards) {
this.cards = cards;
}
// 创建并返回视图容器
@NonNull
@Override
public MyStreamHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
// 通过布局填充器将item_stream.xml填充到视图容器中
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_stream, parent, false);
// 创建视图容器的持有者
Myadapter_stream.MyStreamHolder holder = new Myadapter_stream.MyStreamHolder(view);
// 为视图容器中的图片设置点击事件
holder.Image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 获取被点击的卡片位置
int position = holder.getAdapterPosition();
// 获取被点击的卡片数据
Card card = cards.get(position);
// 显示一个短时提示消息,内容为卡片标题
Toast.makeText(v.getContext(), "你已点击" + card.getTitle(), Toast.LENGTH_SHORT).show();
}
});
// 返回视图容器的持有者
return holder;
}
// 将卡片数据绑定到视图容器
@Override
public void onBindViewHolder(@NonNull MyStreamHolder holder, int position) {
// 获取当前位置的卡片数据
Card card = cards.get(position);
// 设置视图容器中图片的资源为卡片图片资源
holder.Image.setImageResource(card.getImg());
// 设置视图容器中文本的内容为卡片标题
holder.Name.setText(card.getTitle());
}
// 返回卡片数据列表的大小
@Override
public int getItemCount() {
return cards.size();
}
// 视图容器的持有者类
class MyStreamHolder extends RecyclerView.ViewHolder {
ImageView Image; // 图片视图
TextView Name; // 文本视图
// 构造方法,接收视图容器
public MyStreamHolder(@NonNull View itemView) {
super(itemView);
// 通过视图容器找到对应的图片和文本视图
Image = itemView.findViewById(R.id.card_img);
Name = itemView.findViewById(R.id.card_title);
}
}
}
③fragment_recycler_intent2.xml:
一个布局文件,定义了RecyclerIntentFragment2
碎片的布局。
包含一个FrameLayout
,内部包含一个RecyclerView
,用于显示卡片列表。
核心代码:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- TODO: Update blank fragment layout -->
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView_intent2"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
④item_stream.xml:
一个布局文件,定义了RecyclerView
中每个卡片的布局。
包含一个ImageView
用于显示卡片图片,和一个TextView
用于显示卡片标题。
核心代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/card"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:background="@color/white"
android:orientation="vertical">
<ImageView
android:id="@+id/card_img"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:layout_marginTop="0dp">
</ImageView>
<TextView
android:id="@+id/card_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center">
</TextView>
</LinearLayout>
⑤Card.java:
一个简单的Java类,表示卡片对象。
包含标题(title)和图片资源ID(img)两个属性。
提供了构造方法和相应的访问方法。
核心代码:
package com.example.work1;
public class Card {
private String title; // 卡片标题
private int img; // 卡片图片资源ID
// 获取卡片标题
public String getTitle() {
return title;
}
// 获取卡片图片资源ID
public int getImg() {
return img;
}
// 构造方法,用于创建 Card 对象,接收标题和图片资源ID作为参数
public Card(String title, int img) {
this.title = title;
this.img = img;
}
// 设置卡片标题
public void setTitle(String title) {
this.title = title;
}
// 设置卡片图片资源ID
public void setImg(int img) {
this.img = img;
}
}
四、界面二(recyclerView+跳转)
①RecyclerIntentFragment1(球星列表展示)
功能: 该 Fragment 展示了球星的列表,每个列表项显示了球星的头像、姓名、国籍和位置。
布局文件: fragment_recycler_intent1.xml
。
数据源: 运动员信息通过 Sportsman
类封装,列表使用 RecyclerView
实现。
核心代码:
private RecyclerView recyclerView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_recycler_intent1, container, false);
recyclerView = view.findViewById(R.id.recyclerView_intent1);
List<Sportsman> sportsmanlist=new ArrayList<>();
Sportsman s1=new Sportsman(R.drawable.shiyuqi,"石宇奇","中国","男单","365412","石宇奇,男,中国羽毛球男子单打项目运动员、世界冠军。1996年出生南通,2003年进入少体校练习羽毛球,11岁进入省队训练,之后又进入省体工队、国青队。虽然才十七岁,石宇奇已参加过多次全国乃至世界级大赛。2012年,他代表中国队参加亚洲羽毛球青年锦标赛,在U17组比赛中摘得桂冠。\n" +
"\n" +
"2014年亚洲青年羽毛球锦标赛,半决赛中,石宇奇2-0轻取中国香港选手李卓耀,决赛中,常山干太首局以21-19先拔头筹,不过石宇奇随后发起了凌厉的反击,以两个21-16连扳两局,逆转战胜对手,拿下了这枚宝贵的男单金牌。\n" +
"\n" +
"2015年1月5日拟授予国际级运动健将称号的运动员。 \n" +
"\n" +
"2018年3月18日,石宇奇在全英羽毛球公开赛男单决赛中,以2:1击败林丹,赢得这项大赛的冠军。");
Sportsman s2=new Sportsman(R.drawable.ansailong,"安塞龙","加拿大","男单","65412","安赛龙,本名维克托·阿萨尔森,1994年1月4日出生于欧登塞,丹麦羽毛球运动员,是羽毛球史上又一位集奥运会、世锦赛、汤姆斯杯、全英赛、世界羽联总决赛冠军于一身的大满贯男单运动员。\n" +
"\n" +
"安赛龙出身于欧登塞一个普通社区。他在父母离婚后与父亲同住,其后为了方便训练与比赛,17岁便开始独自住在哥本哈根,由父亲出任其经纪人。\n" +
"\n" +
"安赛龙在19岁时开始学习中文,家中更设有一房间专用于中文学习。由于很不习惯自己名字“Viktor”音译为“维克托”,他便请老师为自己起中文名“安赛龙”。“安”是取自他姓氏“Axelsen”的相近发音,而“赛龙”则含有“战胜王者”之意。\n" +
"\n" +
"2010年,安赛龙获得世界青年羽毛球锦标赛冠军。");
Sportsman s3=new Sportsman(R.drawable.shifu,"李诗沣","中国","男单","242456","李诗沣,2000年1月9日出生于江西省南昌市,中国羽毛球运动员。 \n" +
"\n" +
"2006年,李诗沣开始练习羽毛球。\n" +
"\n" +
"2009年,李诗沣进入江西省羽毛球队训练。\n" +
"\n" +
"2012年,李诗沣进入八一羽毛球队训练,成为专业羽毛球运动员。\n" +
"\n" +
"2014年,李诗沣入选中国国家羽毛球队青年队。");
Sportsman s4=new Sportsman(R.drawable.weng,"翁泓阳","中国","男单","3134","翁泓阳(英语:Weng Hongyang,1999年6月18日-),中华人民共和国羽毛球男运动员。\n" +
"\n" +
"2006年9月进入市体校,2009年10月进入省体校,2011年3月进入省体工队。\n" +
"\n" +
"2018年3月进入国家队,曾跟随福州市体校教练陈碧红训练。\n" +
"\n" +
"2019年3月,翁泓阳出战中国陵水羽毛球大师赛,在男子单打决赛击败队友刘海超,赢得冠军。\n");
Sportsman s5=new Sportsman(R.drawable.zhitian,"志田千阳","日本","女单","31341","志田千阳(日语:志田 千陽/しだ ちはる Shida Chiharu,1997年4月29日-),日本女子羽毛球运动员,亦为现役日本国家羽毛球队(A队)成员。\n" +
"\n" +
"2014年2月,志田千阳代表日本参加台湾台北市举办的亚洲青年羽毛球锦标赛,助队伍赢得混合团体季军。同年4月,她再次在马来西亚亚罗士打举办的世界青年羽毛球锦标赛,助队伍赢得混合团体季军。\n" +
"\n" +
"2016年6月,志田千阳与福岛由纪出战越南国际挑战赛,在女双决赛以2比0(28-26、21-15)力克赛会2号种子、队友的田中志穗/米元小春,夺得其首个国际赛冠军,这亦是她首个国际成人赛事锦标赛冠军。");
Sportsman s6=new Sportsman(R.drawable.rouding,"蔡侑玎","韩国","混双","31314","蔡侑玎(韩语:채유정,1995年5月9日-),韩国女子羽毛球运动员。其母亲为韩国羽毛球运动员金福仙。\n" +
"\n" +
"2013年10月,蔡侑玎出战在泰国曼谷举行的世界青年羽毛球锦标赛,在率先进行的混合团体赛中,韩国队取得金牌;在女双方面,她三度与金志垣搭配,终于打进决赛,击败了中国组合,加冕女双冠军。而混双方面,她与蔡侑玎在半决赛中不敌中国组合,但她也成为了本届世青赛上的“双冠王”得主。\n" +
"\n" +
"2013年12月,蔡侑玎与崔率圭携手出战越南羽毛球大奖赛。在混双决赛中,面对赛会3号种子、中国台北的廖敏竣/陈晓欢,激战三局以2比1(22-20、19-21、21-14)击败对手,同时也是俩人合作以来的第一个成年赛冠军。");
// 将运动员对象添加到列表
sportsmanlist.add(s1);
sportsmanlist.add(s2);
sportsmanlist.add(s3);
sportsmanlist.add(s4);
sportsmanlist.add(s5);
sportsmanlist.add(s6);
// 创建适配器实例
Myadapter_info myadapterInfo=new Myadapter_info(sportsmanlist);
// 设置RecyclerView的适配器
recyclerView.setAdapter(myadapterInfo);
// 创建线性布局管理器
LinearLayoutManager manager = new LinearLayoutManager(requireContext());
manager.setOrientation(RecyclerView.VERTICAL);
// 设置RecyclerView的布局管理器
recyclerView.setLayoutManager(manager);
//点击事件
myadapterInfo.setOnSportmanClickListener(new Myadapter_info.OnSportmanClickListener() {
@Override
public void onClickSportman(Sportsman sportsman) {
//跳转到详情页
Intent intent =new Intent(requireContext(),SportsmanDetailsActivity.class);
//传对象
intent.putExtra("sportsman",sportsman);
startActivity(intent);
}
});
return view;
}
}
②SportsmanDetailsActivity(运动员详细信息页面)
功能: 该 Activity 用于展示单个球星的详细信息,包括头像、姓名、国籍、位置、人气值和介绍。
布局文件: fragment_recycler_intent2.xml
。
数据源: 运动员信息通过 Sportsman
类封装,通过 Intent 传递。
核心代码:
package com.example.work1;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
public class SportsmanDetailsActivity extends AppCompatActivity {
private TextView name;
private ImageView img;
private TextView country;
private TextView position;
private TextView renqizhi;
private TextView jieshao;
private Sportsman sportsman;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sportsman_details);
// 获取传递的运动员对象
sportsman = (Sportsman) getIntent().getSerializableExtra("sportsman");
// 初始化视图元素
img = findViewById(R.id.sportsman_img);
name = findViewById(R.id.sportsman_name);
country = findViewById(R.id.sportsman_country);
position = findViewById(R.id.sportsman_position);
renqizhi = findViewById(R.id.renqizhi);
jieshao = findViewById(R.id.jieshao);
// 返回按钮点击事件
findViewById(R.id.back).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish(); // 关闭当前Activity,返回上一个Activity
}
});
// 设置显示数据
img.setImageResource(sportsman.getSportsman_img());
name.setText(sportsman.getSportsman_name());
country.setText(sportsman.getSportsman_country());
position.setText(sportsman.getSportsman_position());
renqizhi.setText(sportsman.getSportsman_renqizhi());
jieshao.setText(sportsman.getSportsman_jieshao());
}
}
③Myadapter_info(RecyclerView 适配器)
功能: 该适配器用于将球星信息绑定到 RecyclerView 上。
布局文件: item_info.xml
。
数据源: 运动员信息通过 Sportsman
类封装。
核心代码:
package com.example.work1;
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 Myadapter_info extends RecyclerView.Adapter<Myadapter_info.MySportsmanHolder> {
List<Sportsman> sportsmanlist;
public Myadapter_info(List<Sportsman> sportsmanlist) {
this.sportsmanlist = sportsmanlist;
}
@Override
public MySportsmanHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
// 创建ViewHolder并绑定item_info布局
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_info, parent, false);
Myadapter_info.MySportsmanHolder myHolder = new Myadapter_info.MySportsmanHolder(view);
return myHolder;
}
@Override
public void onBindViewHolder(@NonNull MySportsmanHolder holder, int position) {
// 绑定数据到ViewHolder
Sportsman sportsman = sportsmanlist.get(position);
holder.img.setImageResource(sportsman.getSportsman_img());
holder.name.setText(sportsman.getSportsman_name());
holder.country.setText(sportsman.getSportsman_country());
holder.position.setText(sportsman.getSportsman_position());
// 设置item点击事件
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(monSportmanClickListener != null){
monSportmanClickListener.onClickSportman(sportsman);
}
}
});
}
@Override
public int getItemCount() {
return sportsmanlist.size();
}
// ViewHolder类,用于保存item视图中的控件
class MySportsmanHolder extends RecyclerView.ViewHolder {
ImageView img;
TextView name;
TextView country;
TextView position;
public MySportsmanHolder(@NonNull View itemView) {
super(itemView);
img = itemView.findViewById(R.id.info_img);
name = itemView.findViewById(R.id.info_text_name);
country = itemView.findViewById(R.id.info_text_country);
position = itemView.findViewById(R.id.info_text_position);
}
}
private OnSportmanClickListener monSportmanClickListener;
// 接口定义点击事件回调
public interface OnSportmanClickListener {
void onClickSportman(Sportsman sportsman);
}
// 设置点击事件监听器
public void setOnSportmanClickListener(OnSportmanClickListener onSportmanClickListener){
monSportmanClickListener = onSportmanClickListener;
}
}
④item_info.xml(球星信息项布局)
功能: 该布局定义了球星信息项的显示格式,包括头像、姓名、国籍和位置。
用途: 作为 RecyclerView 的每个列表项的布局。
核心代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<!-- 你的原始布局 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/info_img"
android:layout_width="120dp"
android:layout_height="120dp"
android:padding="10dp"
android:src="@drawable/ic_launcher_background"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/info_text_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="14dp"
android:layout_marginTop="5dp"
android:text="石宇奇"
android:textSize="20dp" />
<TextView
android:id="@+id/info_text_country"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginTop="2dp"
android:text="中国"
android:textSize="15dp" />
<TextView
android:id="@+id/info_text_position"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginTop="2dp"
android:text="男单"
android:textSize="15dp" />
<!-- 分割线 -->
</LinearLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#4CAF50" />
<!-- 这里添加下一个项目的布局,以及相应的分割线 -->
</LinearLayout>
⑤activity_sportsman_details.xml
文件定义了球星详细信息页面的布局
核心代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".SportsmanDetailsActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#00BCD4">
<ImageView
android:id="@+id/back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="@drawable/baseline_arrow_back_24">
</ImageView>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="10dp"
android:gravity="center_vertical"
android:text="详情信息"
android:textColor="@color/white"
android:textSize="26dp">
</TextView>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="120dp"
android:orientation="horizontal">
<ImageView
android:id="@+id/sportsman_img"
android:layout_width="120dp"
android:layout_height="match_parent"
android:src="@drawable/shiyuqi">
</ImageView>
<LinearLayout
android:layout_width="120dp"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/sportsman_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="30dp"
android:layout_marginTop="15dp"
android:text="石宇奇"
android:textSize="20dp" />
<TextView
android:id="@+id/sportsman_country"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="40dp"
android:layout_marginTop="2dp"
android:text="中国"
android:textSize="15dp" />
<TextView
android:id="@+id/sportsman_position"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="40dp"
android:layout_marginTop="2dp"
android:text="男单"
android:textSize="15dp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/renqi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="25dp"
android:text="月人气指数"
android:textSize="20dp" />
<TextView
android:id="@+id/renqizhi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="365412"
android:textSize="20dp" />
</LinearLayout>
</LinearLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginTop="25dp"
android:text="球员介绍:"
android:textSize="20dp">
</TextView>
<TextView
android:id="@+id/jieshao"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="石宇奇,男,中国羽毛球男子单打项目运动员、世界冠军。1996年出生南通,2003年进入少体校练习羽毛球,11岁进入省队训练,之后又进入省体工队、国青队。虽然才十七岁,石宇奇已参加过多次全国乃至世界级大赛。2012年,他代表中国队参加亚洲羽毛球青年锦标赛,在U17组比赛中摘得桂冠。
2014年亚洲青年羽毛球锦标赛,半决赛中,石宇奇2-0轻取中国香港选手李卓耀,决赛中,常山干太首局以21-19先拔头筹,不过石宇奇随后发起了凌厉的反击,以两个21-16连扳两局,逆转战胜对手,拿下了这枚宝贵的男单金牌。
2015年1月5日拟授予国际级运动健将称号的运动员。
2018年3月18日,石宇奇在全英羽毛球公开赛男单决赛中,以2:1击败林丹,赢得这项大赛的冠军。
2018年5月27日,2018年汤姆斯杯在泰国曼谷落下帷幕,石宇奇和队友谌龙、刘成、张楠、李俊慧、刘雨辰以3比1逆转战胜日本队夺冠。"
android:textSize="15dp">
</TextView>
</LinearLayout>
⑥Sportsman类,定义球星的类,封装属性和方法
核心代码:
package com.example.work1;
import java.io.Serializable;
public class Sportsman implements Serializable {
private int sportsman_img;
private String sportsman_name;
private String sportsman_country;
private String sportsman_position;
private String sportsman_renqizhi;
private String sportsman_jieshao;
public void setSportsman_renqizhi(String sportsman_renqizhi) {
this.sportsman_renqizhi = sportsman_renqizhi;
}
public void setSportsman_jieshao(String sportsman_jieshao) {
this.sportsman_jieshao = sportsman_jieshao;
}
public String getSportsman_renqizhi() {
return sportsman_renqizhi;
}
public String getSportsman_jieshao() {
return sportsman_jieshao;
}
public Sportsman(int sportsman_img, String sportsman_name, String sportsman_country, String sportsman_position, String sportsman_renqizhi, String sportsman_jieshao) {
this.sportsman_img = sportsman_img;
this.sportsman_name = sportsman_name;
this.sportsman_country = sportsman_country;
this.sportsman_position = sportsman_position;
this.sportsman_renqizhi = sportsman_renqizhi;
this.sportsman_jieshao = sportsman_jieshao;
}
public void setSportsman_img(int sportsman_img) {
this.sportsman_img = sportsman_img;
}
public void setSportsman_name(String sportsman_name) {
this.sportsman_name = sportsman_name;
}
public void setSportsman_country(String sportsman_country) {
this.sportsman_country = sportsman_country;
}
public void setSportsman_position(String sportsman_position) {
this.sportsman_position = sportsman_position;
}
public int getSportsman_img() {
return sportsman_img;
}
public String getSportsman_name() {
return sportsman_name;
}
public String getSportsman_country() {
return sportsman_country;
}
public String getSportsman_position() {
return sportsman_position;
}
}
五、结果展示
视频展现效果
六、实验小结
在这个实验中,我开发了一个基于Android平台的应用程序,主要涉及展示运动员信息的功能。
-
界面设计:
- 创建了两个界面,分别使用了
fragment_recycler_intent1.xml
和fragment_recycler_intent2.xml
作为布局文件。 - 使用
RecyclerView
控件展示了运动员列表,并通过Card
类封装了每个运动员的信息,包括头像、姓名、国籍和位置。
- 创建了两个界面,分别使用了
-
适配器设计:
- 实现了
Myadapter_info
类,作为RecyclerView
的适配器,将运动员信息绑定到界面上。 - 通过
item_info.xml
定义了每个列表项的布局,包括头像、姓名、国籍和位置,并使用ViewHolder
保存视图元素。
- 实现了
-
Sportsman类设计:
- 创建了
Sportsman
类,用于表示运动员对象,封装了头像、姓名、国籍、位置、人气值和介绍等属性。 - 通过构造方法和访问方法提供了对运动员信息的操作接口。
- 创建了
-
界面交互:
- 利用
RecyclerView
实现了球星列表的展示,并在点击列表项时跳转到详细信息页面。 - 使用
Intent
传递了运动员对象到详细信息页面,展示了头像、姓名、国籍、位置、人气值和介绍等详细信息。
- 利用
-
详细信息页面设计:
- 创建了
SportsmanDetailsActivity
用于展示单个球星的详细信息。 - 通过
activity_sportsman_details.xml
定义了详细信息页面的布局,包括头像、姓名、国籍、位置、人气值和介绍等。
- 创建了
-
实验收获:
- 通过本次实验,我掌握了在Android应用中使用
RecyclerView
展示列表信息的方法,以及如何通过Intent
实现页面之间的数据传递。 - 学会了设计并使用适配器来动态显示运动员列表,提高了界面的灵活性和扩展性。
- 了解了在Android应用中创建多个界面和实现页面跳转的基本方法。
- 通过本次实验,我掌握了在Android应用中使用
七、gitee仓库
David/Android作业2 (gitee.com)https://gitee.com/david_csv/android-homework-2