Android app开发Activity之间跳转实现(作业2
实验目的: (1)对有recycleView的页面进行点击跳转设计。比如,某一tab页是新闻列表,则点击某一行能跳转到新闻详情页面; (2)本次作业考查的基础原理是对activity的生命周期的理解以及状态转变操作;
一、项目开发关键步骤
由于上一次作业已经利用adapter实现了将数据传输到recyclerview界面。所以这次主要是利用intent传递参数并实现activity之间的跳转。 1、设置一个监听,用于recyclerview中每一个item。 【这里可以在MyAdapter私有类中定义一个接口】
public interface OnItemClickListener{
public void onItemClick(View view,int position,List<Youth> youthList);
}
【然后在MyAdapter中的内部类viewholder中继承父接口OnItemClickListener,以下包括接口的声明,调用以及onClick函数的重载中调用父接口OnItemClickListener】
private OnItemClickListener myonItemClickListener;
public MyYouthAdapterViewHolder(@NonNull View itemView,OnItemClickListener onItemClickListener) {
super(itemView);
myImageView_pic=itemView.findViewById(R.id.imageView_pic);
myTextView=itemView.findViewById(R.id.textView_tag);
myImageView_favor=itemView.findViewById(R.id.imageView_favor);
myonItemClickListener=onItemClickListener;
itemView.setOnClickListener(this);
}
@Override
public void onClick(View view) {
myonItemClickListener.onItemClick(view,getLayoutPosition(),myYouthList);
}
【为了使这个接口能被外界访问,可以将它声明成MyAdapter类中的数据成员,然后用setOnItemClickListener()函数来访问它。】
private OnItemClickListener onItemClickListener;
public void setOnItemClickListener(OnItemClickListener onItemClickListener){
this.onItemClickListener=onItemClickListener;
}
2、设置好监听之后,需要新建一个activity用来加载详情界面。 【这个界面包括你想要显示的内容,比如图片,文字,状态等等。排版也可以任意设计。】 我这里加载了段文字和两个图片。 3、下面该考虑如何将recyclerview中item的内容加载到详情页面对应的activity中了。 【这里用到intent和bundle传值。】 (被调activity,即详情界面对应的activity。)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
textView=findViewById(R.id.textView_detailtag);
imageView=findViewById(R.id.imageView_detailpic);
imageView_favor=findViewById(R.id.imageView_detailfavor);
Intent intent=getIntent();
Bundle bundle=intent.getExtras();
imageView.setImageResource(bundle.getInt("item_image"));
textView.setText(bundle.getString("item_tag"));
imageView_favor.setImageResource(bundle.getInt("item_favor"));
imageView_favor.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
imageView_favor.setImageResource(R.drawable.yes);
Toast.makeText(MainActivity2.this,"收到你的喜欢啦,谢谢@~@",Toast.LENGTH_LONG).show();
}
});
(调用的fragment)
public void initYouthRecyclerview(){
StaggeredGridLayoutManager staggeredGridLayoutManager=new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
recyclerView.setLayoutManager(staggeredGridLayoutManager);
MyYouthAdapter myyouthAdapter=new MyYouthAdapter(youthList);
recyclerView.setAdapter(myyouthAdapter);
myyouthAdapter.setOnItemClickListener(new MyYouthAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position, List<Youth> youthList) {
// Toast.makeText(getActivity(),"收到你的喜欢啦,谢谢@~@",Toast.LENGTH_LONG).show();
Log.d("favor","i like it.");
Intent intent=new Intent(getActivity(),MainActivity2.class);
Bundle bundle=new Bundle();
bundle.putInt("item_image",youthList.get(position).getPicture());
bundle.putString("item_tag",youthList.get(position).getTag());
bundle.putInt("item_favor",youthList.get(position).getFavor());
intent.putExtras(bundle);
startActivity(intent);
}
});
}
二、核心技术
1)intent和bundle:
- intent用于从一个activity跳转到另一个activity。在调和被调的activity中的intent书写形式不一样。
- bundle可以看作一个键值对列表。这个列表非常人性化的地方在于,它的value值可以是整型,char,String各种类型都可。并且每一个value值你可以给它一个名字,方便访问。它和intent配合使用的时候就可以让intent不只是只能带一个值而是可以带多个并且是不同种类的值。简直不要太好!
- 学了intent之后我也想了以下为什么之前传值的时候要自己写一个私有类MyAdapter而不是直接用intent。intent和adapter都是传值,这两者之间到底有什么区别??后来我仔细想了想,adpter传值可以看作静态的,即将一系列静态的数据传到我们写的界面中,我们不需要两个activity之间调用就可以将数据传入;而intent是在我们操作activity的过程中传值的工具,它传值的条件建立在一个activity调用另一个activity的过程中。所以这两者区别还是挺大的。
2)接口:这里我写的接口主要起到的作用是能在我写的详情activity中重写onItemClickListener()函数。由于接口的多继承特性,造成它可以被ViewHolder继承,被mainactivity继承。
3)Imgeview圆角设计: 在imageview外面包一个cardview。
<androidx.cardview.widget.CardView
app:cardCornerRadius="20dp"
app:cardElevation="0dp"
为了让imageview适应桌面大小,可以给imageview设置相应属性。
android:scaleType="fitXY"
android:adjustViewBounds="true"
三、结果展示
点击进入详情。 圆角imageview。
四、gitee仓库
作业2:branch_main
|