目录
2.4 定义ContactDetailsActivity.java
一、设计目标
1.1 设计要求
依托作业一,将recyclerView的每个item增加点击功能,点击后跳转到一个新的view展示信息。
1.2 设计功能介绍
点击干员通讯录列表的任一项,会跳转到该干员的名字,性别等详细信息页面。
二、设计详解
2.1 定义contactMS类
在contactMS中创建
1.创建contactMS类,用于存储联系人的信息,包括头像、名字和性别等数据类型。
public class contactMS {
private String 分类;
private String 地区;
private String 性别;
private String 名字;
private int 图片;
}
2.创建构造函数,用于传值。
public contactMS(int 图片, String 名字, String 地区, String 性别 , String 分类 ) {
this.图片 = 图片;
this.名字 = 名字;
this.地区=地区;
this.性别 = 性别;
this.分类 = 分类;
}
3.定义方法,用于获取图片以及文本的值。
public String getMessageText() {
return 名字;
}
public int getImageResourceId() {
return 图片;
}
public String getgender() {
return 性别;
}
public String getregion() {
return 地区;
}
public String gettype() {
return 分类;
}
4.写入Parcelable接口
由于后续需要用Parcelable接口,使跳转时在 Intent中传递contactMS对象,所以这里定义contactMS类时继承Parcelable接口,并定义对应的方法。
其中
contactMS(Parcel in) 从 Parcel 中读取数据并初始化对象
createFromParcel(Parcel in)通过读取 Parcel 对象来创建对象
writeToParcel将对象数据写入 Parcel 中
public class contactMS implements Parcelable {
private String 分类;
private String 地区;
private String 性别;
private String 名字;
private int 图片;
public contactMS(Parcel in) {
图片 = in.readInt();
名字 = in.readString();
地区 = in.readString();
性别 = in.readString();
分类 = in.readString();
}
相应的方法:
public static final Creator<contactMS> CREATOR = new Creator<contactMS>() {
@Override
public contactMS createFromParcel(Parcel in) {
return new contactMS(in);
}
@Override
public contactMS[] newArray(int size) {
return new contactMS[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeInt(图片);
parcel.writeString(名字);
parcel.writeString(地区);
parcel.writeString(性别);
parcel.writeString(分类);
}
2.2 定义布局文件
为联系人列表项创建两种不同的布局文件,分别表示跳转前和跳转后的页面。这些布局应包括头像、消息文本等元素。
其中,item.xml是列表每一项的布局,contact.xml是对应的项跳转后的详情界面的布局。
(这里的item.xml其实是上一次的修改后的,只不过多加了一个图片)
(一)item.xml 里包含一张图片用来显示干员头像,一个文本显示干员名称。故应包含1个ImageView和1个TextView。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center">
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/amiya2" />
<TextView
android:id="@+id/messageText"
android:layout_width="278dp"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_weight="1"
android:gravity="center"
android:text="TextView"
android:textColor="@android:color/holo_red_dark"
android:textSize="34sp" />
</LinearLayout>
布局如图:
注意,这里必须要插入一张图片作为默认图片,不可以是tools控件,因为tools控件的路径与图片路径不一样,导致无法启动。同样后面的contact.xml也是如此。
error: '@tools:sample/avatars' is incompatible with attribute src (attr) reference|color.
这个报错就是显示有一个使用@tools:sample/avatars的属性与src 属性不兼容。
(二)contact.xml包含干员头像,以及名字地区性别分类属性,故需要1个ImageView和8个TextView。
为了让两个文本框在同一行,这里使用了FrameLayout。为了让四个FrameLayout垂直排布,要将整个LinearLayout的orientation设为vertical。
(其实这里用ConstraintLayout写更简洁,不过我写的时候没想到所以还是贴源码了)
<?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="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/imageView5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/amiya2" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="7">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent">
<TextView
android:id="@+id/textViewa"
android:layout_width="144dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="名字"
android:textSize="34sp" />
<TextView
android:id="@+id/textViewa2"
android:layout_width="274dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="TextView"
android:textSize="34sp" />
</LinearLayout>
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="7">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent">
<TextView
android:id="@+id/textViewb"
android:layout_width="152dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="地区"
android:textSize="34sp" />
<TextView
android:id="@+id/textViewb2"
android:layout_width="274dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="TextView"
android:textSize="34sp" />
</LinearLayout>
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="7">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent">
<TextView
android:id="@+id/textViewc"
android:layout_width="160dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="性别"
android:textSize="34sp" />
<TextView
android:id="@+id/textViewc2"
android:layout_width="274dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="TextView"
android:textSize="34sp" />
</LinearLayout>
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="7">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent">
<TextView
android:id="@+id/textViewd"
android:layout_width="169dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="分类"
android:textSize="34sp" />
<TextView
android:id="@+id/textViewd2"
android:layout_width="274dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="TextView"
android:textSize="34sp" />
</LinearLayout>
</FrameLayout>
</LinearLayout>
布局如图:
2.3 修改Myadapter适配器
1. 改写构造方法
接收contactMS对象
public Myadapter( List <contactMS> msList) {
this.msList=msList;
}
2.改写onBindViewHolder方法
设置跳转前的页面的文本和图片值
public void onBindViewHolder(@NonNull myholder holder, int position) {
contactMS msList1= msList.get(position);
holder.messageText.setText(msList1.getMessageText());
holder.ImageView.setImageResource(msList1.getImageResourceId());
}
3.改写myholder类
增加itemview的监听器并设置点击事件
onClick方法中使用intent传值跳转到ContactDetailsActivity.class
public class myholder extends RecyclerView.ViewHolder{//类的嵌套,会调用子类对象
TextView messageText;
ImageView ImageView;
public myholder(@NonNull View itemView) {
super(itemView);
messageText = itemView.findViewById(R.id.messageText);
ImageView = itemView.findViewById(R.id.imageView);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
contactMS clickedContact = msList.get(position);
Intent intent = new Intent(itemView.getContext(), ContactDetailsActivity.class);
intent.putExtra("contact", (Parcelable) clickedContact);
itemView.getContext().startActivity(intent);
}
}
});
}
}
2.4 定义ContactDetailsActivity.java
在ContactDetailsActivity里接收content,取出各属性的值添入各个控件
public class ContactDetailsActivity extends AppCompatActivity {
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contact);
ImageView imageView;
TextView textView1,textView2,textView3,textView4;
// 获取从上一个界面传递过来的联系人信息
contactMS contact = getIntent().getParcelableExtra("contact");
int rid=contact.getImageResourceId();
String name = contact.getMessageText();
String region = contact.getregion();
String gender = contact.getgender();
String type = contact.gettype();
textView1=findViewById(R.id.textViewa2);
textView2=findViewById(R.id.textViewb2);
textView3=findViewById(R.id.textViewc2);
textView4=findViewById(R.id.textViewd2);
imageView=findViewById(R.id.imageView5);
imageView.setImageResource(rid);
textView1.setText(name);
textView2.setText(region);
textView3.setText(gender);
textView4.setText(type);
}
}
三、运行界面展示
3.1 初始界面
3.2 点击item
(这里太多了不一一展示)
四、源码仓库地址
gitee:gitee
github:github