Android开发-类微信界面设计(二)
一实现效果图
二、功能说明:
在上次实验的基础之上把recycleviewb列表完善并且增加点击效果,点击之后可以跳转到另外一个activity上,并且添加返回按钮,可以放回原列表页面,列表中的每一行都对应的不同的数据
故需要实现的功能
1:activity之间的跳转
2:数据的绑定
三、功能实现
1:列表创建
涉及到如下xml文件:
需要用到recycleview控件创建列表
recycleview
RecyclerView是Android中用于展示大量数据列表的高级视图组件。它是对ListView的改进和扩展,提供了更灵活、高效的方式来展示和管理大型数据集。
recycleview是一个列表,接下来创建行item
设计item.xml
头像+姓名 故添加2个控件
功能为点击行之后跳转出个人的详情页面
details_people.xml设计
四个控件显示
1:姓名
2:电话
3:地址
4:朋友圈
加一个button返回值列表
显示xml文件设计全部完成,接下来需要连接数据即后端
2:连接数据
存储数据
往列表里面传入数据,先要创建数据源,在fragment1.java里创建list列表进行数据存储
List<Map<String,Object>> items=new ArrayList<Map<String,Object>>();
创建一个列表,列表的内容为键值对 键的内容为string ,值的内容为任意类型
每一个map对象都是一个联系人,里面存储着ta的信息
通过for循环存入数据
for(int i=0;i<names.length;i++){
Map<String,Object> item=new HashMap<String, Object>();
item.put("i_name",names[i]);
item.put("i_image",images[i]);
item.put("i_phone",phones[i]);
item.put("i_region",regions[i]);
item.put("i_tag",tags[i]);
items.add(item);
}
数据传入之后进行连接,把数据导入进列表
需要用到adapter
绑定数据
Adapter
是数据源和视图之间的桥梁,把数据绑定到item里
里面有一个叫Holder的类,和一个onBindViewHolder的方法
Holder
在Adapter中,holder用于绑定视图
public class Myholder extends RecyclerView.ViewHolder{
public ImageView imageView;
TextView textView;
public Myholder(@NonNull View itemView) {
super(itemView);
textView=itemView.findViewById(R.id.name);//引用item.xml里id为textView1的textView作为Myholder这个类中
imageView = (ImageView) itemView.findViewById(R.id.image);
//textView对象的初始值
}
}
如上:这个holder类绑定了item.xml的控件image和textview(他们的id分别是image和name)
onBindViewHolder
这个方法是把数据集中的数据绑定到控件中
- 1:数据绑定
name通过list位置position的不同自动获取不同的数据(position会自动变化)
- 2:设置跳转事件
当点击textview控件也就是我们的name时,这个onclick函数就会响应
这里有一个intent类
Intent
Intent用于组件之间的通信和交互可以启动其他的activity,service,broadcastRecever等组件
可以
- 启动组件:通过创建一个Intent对象并指定要启动的组件的类名或动作,可以启动其他应用程序中的Activity、Service或BroadcastReceiver组件。例如,你可以使用Intent启动一个新的Activity来显示一个新的界面。
- 传递数据:Intent可以携带数据,以便在组件之间进行传递。你可以使用
putExtra()
方法将额外的数据附加到Intent中,然后在目标组件中使用getXXXExtra()
方法获取这些数据。数据可以是基本类型(如字符串、整数等),也可以是复杂的对象。 - 发送广播:通过创建一个Intent并指定广播的动作,你可以发送广播消息,使得其他应用程序中的BroadcastReceiver组件可以接收并处理该广播。广播可以用于应用程序内部的通信,也可以用于应用程序间的通信。
- 打开系统功能:Intent可以用于打开系统功能,如拨打电话、发送短信、打开浏览器等。系统会根据Intent的内容选择合适的应用程序来处理请求。
holder.textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//点击后跳转到联系人详情页
Intent intent=new Intent(context1,Activitypeople.class);
//向intent传值
intent.putExtra("details",name);
intent.putExtra("image",image);
intent.putExtra("phone",phone);
intent.putExtra("region",region);
intent.putExtra("tag",tag);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//开始跳转
context1.startActivity(intent);
}
});
这段代码就用了intent的2个功能
1:启动组件,当点击name时,从本组件跳到了activitypeople这个组件
Intent intent=new Intent(context1,Activitypeople.class);
2:数据传送,把detail,image,phone等数据放到了intent这个对象里面
intent.putExtra("details",name);
intent.putExtra("image",image);
intent.putExtra("phone",phone);
intent.putExtra("region",region);
intent.putExtra("tag",tag);
最后从Madapter.java跳转至ActivityPeople.java
这是一个activity 连接着details_people.xml
也就是一个item对应的一个people的详情页面
details_people.xml的效果图如下:
故ActivityPeople.java中要对这个效果进行数据的绑定展示,相当数据库后端
- 与xml文件绑定
super.onCreate(savedInstanceState);
setContentView(R.layout.details_people);
- 创建xml效果有的控件:
TextView dName,textView1,textView2;
ImageView dImage,aImage,cImage,pImage;
Button button_r;
View view;
- 绑定控件
dName=findViewById(R.id.dname);
dImage=findViewById(R.id.imagename);
aImage=findViewById(R.id.imageadd);
cImage=findViewById(R.id.imagecircle);
pImage=findViewById(R.id.imagephone);
textView1=findViewById(R.id.dphone);
textView2=findViewById(R.id.dadd);
- 获取从上一个activity传递过来的带有数据的intent类
//获取上一个Actvity传过来的intent
Intent intent=getIntent();
- 设置控件获取数据
dImage.setImageResource(intent.getIntExtra("image",R.drawable.baba));
dName.setText(intent.getStringExtra("details"));
aImage.setImageResource(R.drawable.weizhi);
cImage.setImageResource(R.drawable.circle);
pImage.setImageResource(R.drawable.dianhua);
textView1.setText(intent.getStringExtra("phone"));
textView2.setText(intent.getStringExtra("region"));
- button实现返回到原来的activity效果
跳转到原来的Fragment1页面
button_r.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent1=new Intent(Activitypeople.this, MainActivity.class);
startActivity(intent1);
}
});
startActivity
通过调用startActivity()
方法,你可以向系统发出请求,以启动另一个Activity并在屏幕上显示相应的界面。
这种启动是没有返回值的
如果要有放回值的启动需要用到launch的启动
summary
问题:
q1:详情页面效果时,地址、朋友圈等图像无法显示
因为这些image都是固定的,而不是根据position变化而变化的,上网查找发现在onBindViewHolder()
方法中,为ImageView设置固定图像资源时,不使用position
参数获取列表项的位置对应的图像资源,而是直接定义获取图像资源如下:
cImage=findViewById(R.id.imagecircle);
cImage.setImageResource(R.drawable.circle);
而根据position变化而变的图像、文字连接:
dName=findViewById(R.id.dname);
dName.setText(intent.getStringExtra("details"));
q2:效果显示时地址无法显示
查看代码后发现 绑定数据时region单词拼写错误,导致地址数据无法绑定完成
q3:网上无法找到大小一致的图片
前期使用的是网上随便找的图片,导致设计xml文件时,格式无法控制,效果显示不佳
后面询问同学得知可以在iconfont-阿里巴巴矢量图标库内进行图标选取,这个库里面的图大小基本一致并且数量种类丰富,可以免费使用
android开发对于我来说是一种全新的体验,遇到的困难很多,同时带来的锻炼也是巨大的,收益匪浅,通过一个个解决困难的过程,感觉到了自己在一步步成长
源码地址