目标:
1.根据第一次作业的源码基础,在列表页上点击跳转到另一详情页
2.在实现列表效果的fragment页中实现点击列表跳转到另一详情页
3.博客末尾写明项目源码线上仓库地址
实现的具体效果如下动图所示:
点击列表元素后会跳转到详情页,并可通过返回按钮来返回主界面
实验过程及主要代码解释:
技术说明:
这次实验相较上次实验,主要需要新增1个点击跳转后的页面XML和一个设置新增界面返回键点击监听和显示详情页内容的java文件,Myadapter中的点击监听,和Main_Activity的OnActivityResult()。
资源文件(底部图标图片):
实验中要设置XML文件一览(activity_main是创建项目自动生成的不用管)
实验中要编写的java文件一览(main_activity是自动生成的可忽略):
上次已经提到的布局设计和java代码编写就不说了,只说加和改的东西,完整代码可以去最底部git地址看。
布局设计
main_activity2.xml
这个界面是点击会跳转到的页面,在这个页面我们设置了一个TextView和Button分别用来显示详情页面信息和做按钮的点击返回监听。
<TextView
android:id="@+id/text"
android:gravity="center"
android:textSize="20sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:text="返回"/>
这个没啥好说的,就是把布局效果弄出来,大多都是上次用到过的设置
控件:
界面效果:
其他XML布局文件和上次保持一致即可
JAVA代码编写:
(具体的关键代码解析都放在注释里了,这里同样只说需要变动的)
Mainactivity1.java
主要在于多加了一个onActivityResult()方法,关键代码行解析见注释
/* 在进行界面间的跳转和传递数据的时候,我们有的时候要获得跳转之后界面传递回来的状态,数据等信息。
这个时候,我们不一定需要使用Intent进行跳转回原先设置的界面,而是使用onActivityResult方法就可以解决这个问题。*/
/* requestCode: 请求码,对应你在startActivityForResult(Intent intent, int requestCode)中传入
,该参数的作用是让你在有多个activity返回结果时,能判断是哪一个activity返回。
resultCode:返回码,通过该参数判断子activity返回的状态,有OK,CANCELED,RESULT_FIRST_USER等,
本质上是子Activity的一个实例变量 int mResultCode,该变量在定义时就被赋值为RESULT.CANCELED,因此默认返回RESULT.CANCELED 可通过setResult(int resultCode)修改
data:用来传递数据,对应子Activity的一个实例变量Intent mResultData,初始化为null,可通过setResult(int resultCode, Intent data)修改。*/
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//在调用系统activity时返回时,如果请求码为1,RESULT_OK代表成功。
if(requestCode==1 && resultCode== Activity.RESULT_OK){
Toast.makeText(this, data.getStringExtra("text"), Toast.LENGTH_SHORT).show();
/* Toast 是一个 View 视图,快速的为用户显示少量的信息。
Toast 在应用程序上浮动显示信息给用户,它永远不会获得焦点,不影响用户的输入等操作,主要用于 一些帮助 / 提示。
Toast 最常见的创建方式是使用静态方法 Toast.makeText*/
/* Toast.LENGTH_SHORT表示显示时间较短*/
}
}
}
Mainactivity2.java
(这个主要用于控制显示详情页并设置返回按钮的点击监听)
package com.example.myhomework02;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
//直接使用Activity作为事件监听器,实现监听器的接口.
public class MainActivity2 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity2);
String text = getIntent().getStringExtra("text");
TextView tv = findViewById(R.id.text);
tv.setText(text);
/*
设置main_activity2中的返回botton点击监听*/
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("text",text);
//设置切换后的详情页的信息为text
setResult(Activity.RESULT_OK,intent);
//在MAIN_activity2中回传数据时采用setResult方法,并且之后要调用finish方法。
finish(); //点击返回后详情页生命周期就销毁
}
});
}
}
Myadpter.java(主要在这个类设置跳转到详情页的点击监听)
package com.example.myhomework02;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
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 java.util.List;
import java.util.zip.Inflater;
public class Myadapter extends RecyclerView.Adapter<Myadapter.Myholder> {
Activity context1;
List<String> list1;
/* private Myadapter.OnItemClickListener mClickListener;//自定义的接口*/
//构造函数
public Myadapter(Activity context,List list){
context1=context;
list1=list;
}
@NonNull
@Override
//在RecyclerView控件中,当需要新的View来展示列表项时,
// RecyclerView首先会调用Adapter中的onCreateViewHolder方法,
// 来创建一个ViewHolder并绑定相应的View。ViewHolder对象会缓存在RecyclerView中,以便重复利用
public Myholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//LayoutInflater是用来找layout下xml布局文件,并且实例化,对于想要动态加载的界面,需要使用LayoutInflater.inflate()来载入。
View view=LayoutInflater.from(context1).inflate(R.layout.item,parent,false);
//需要加载资源的id为R.layout.item
Myholder myholder=new Myholder(view);
return myholder;
/* return new RecyclerView.ViewHolder(view, mClickListener);*/
}
@Override
//onBindViewHolder方法会在RecyclerView进入屏幕时调用
public void onBindViewHolder(@NonNull Myholder holder, int position) {
holder.textView.setText(list1.get(position)); //将textView和相应位置的list绑定在一起
holder.textView.setOnClickListener(new View.OnClickListener() {
//设置点击监听
@Override
public void onClick(View v) {
Intent intent = new Intent(context1, MainActivity2.class);
intent.putExtra("text",list1.get(position));
context1.startActivityForResult(intent,1);
//如果想在Activity中得到新打开Activity 关闭后返回的数据,
// 需要使用系统提供的startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,
// 新的Activity关闭后会向前面的Activity传回数据,为了得到传回的数据,
// 必须在前面的Activity中重写onActivityResult(int requestCode, int resultCode, Intent data)方法。
}
});
}
@Override//返回条目的个数
public int getItemCount() {
return list1.size();
}
public class Myholder extends RecyclerView.ViewHolder{
TextView textView;
public Myholder(@NonNull View itemView) {
super(itemView);
textView=itemView.findViewById(R.id.textView10);
//根据item.xml里id为textView10的textView作为textView的值
}
}
}
实验小结
这次实验中,我通过在列表页的Fragment中实现了点击列表项跳转到详情页的功能。当用户点击列表中的某一项时,我们可以通过设置RecycleView的ISetOnClickListener来监听点击事件,并获取点击项的信息。其中,我们可以使用Intent来传递数据,并通过startActivity方法启动详情页的Activity,从而实现跳转。为了实现高效的列表展示,我们选择了使用RecycleView来展示数据。RecycleView是Android中常用的列表控件,它能够高效地管理和展示大量数据,并提供了灵活的ViewHolder等功能。我们可以通过定义Adapter来处理列表中的数据,并将Adapter与RecycleView进行绑定。
通过本次实验,我们成功设计了一个App的门户框架,并实现了Tab切换、列表展示以及点击跳转到详情页并返回的功能。这些功能的实现不仅借助了Activity、XML和Fragment等技术,还充分利用了RecycleView作为高效的列表展示控件。
最后,在博客的末尾是提供了项目源码的线上仓库地址。
项目源码线上仓库地址: