Android 开发之recyclerView页面点击跳转

一、技术概述

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)。

实现了必要的方法,包括onBindViewHoldergetItemCount

核心代码:

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平台的应用程序,主要涉及展示运动员信息的功能。

  1. 界面设计:

    • 创建了两个界面,分别使用了fragment_recycler_intent1.xmlfragment_recycler_intent2.xml作为布局文件。
    • 使用RecyclerView控件展示了运动员列表,并通过Card类封装了每个运动员的信息,包括头像、姓名、国籍和位置。
  2. 适配器设计:

    • 实现了Myadapter_info类,作为RecyclerView的适配器,将运动员信息绑定到界面上。
    • 通过item_info.xml定义了每个列表项的布局,包括头像、姓名、国籍和位置,并使用ViewHolder保存视图元素。
  3. Sportsman类设计:

    • 创建了Sportsman类,用于表示运动员对象,封装了头像、姓名、国籍、位置、人气值和介绍等属性。
    • 通过构造方法和访问方法提供了对运动员信息的操作接口。
  4. 界面交互:

    • 利用RecyclerView实现了球星列表的展示,并在点击列表项时跳转到详细信息页面。
    • 使用Intent传递了运动员对象到详细信息页面,展示了头像、姓名、国籍、位置、人气值和介绍等详细信息。
  5. 详细信息页面设计:

    • 创建了SportsmanDetailsActivity用于展示单个球星的详细信息。
    • 通过activity_sportsman_details.xml定义了详细信息页面的布局,包括头像、姓名、国籍、位置、人气值和介绍等。
  6. 实验收获:

    • 通过本次实验,我掌握了在Android应用中使用RecyclerView展示列表信息的方法,以及如何通过Intent实现页面之间的数据传递。
    • 学会了设计并使用适配器来动态显示运动员列表,提高了界面的灵活性和扩展性。
    • 了解了在Android应用中创建多个界面和实现页面跳转的基本方法。

七、gitee仓库

David/Android作业2 (gitee.com)icon-default.png?t=N7T8https://gitee.com/david_csv/android-homework-2

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无所谓_我会出丑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值