一、作业目标
依托前一个项目AS移动开发--类微信界面的实现,优化界面并将将recyclerView的每个item增加点击功能,点击后跳转到一个新的view展示信息。
二、开发技术
开发工具:Android studio
版本:API 32 Android 12
三、开发思路
首先,先设计fragement2.java中的recycleview要跳转到的页面talk.xml,然后创建新的MainActivity2.java用于控制跳转页面后的信息,然后在Myadapter中添加点击事件,并部署相关信息,最后对MainActivity中做出相应的修改使得能够运行。
四、设计过程
1、修改fragement2.java
在原有的fragement2文件中进行修改,在onCreateView中添加recycleview、跳转代码等。
1.1、首先定义一个string数组,用来存储将要显示的列表。
1.2、添加一个arraylist,采用list.add来填充recycleview中每个列
1.3、创建一个自定义的适配器 Myadapter 的实例,并传入上下文对象和数据列表作为参数。接着在 Myadapter 中设置一个点击事件监听器(OnItemClickListener),当列表项被点击时,执行其中的 onItemClick 方法。在 onItemClick 方法中,通过 list.get(position) 获取点击项的数据,创建一个意图(Intent),并将数据作为额外信息放入意图中。使用 startActivity(intent) 启动了 MainActivity2,并传递了数据data。
这段代码是在列表项被点击时,使用intent方法,跳转到 MainActivity2 并传递相应的数据。
1.4、将适配器与 RecyclerView 相关联,并设置 RecyclerView 的布局管理器。
总的来说,fragement2创建一个包含 RecyclerView 的 Fragment,在该 Fragment 中显示names列表数据,当点击列表项时可以跳转到另一个 MainActivity2 并传递相应的数据。
fragement2源码:
package com.example.myapplication;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;
public class Fragment2 extends Fragment{ //继承自Fragment类的Fragment3类。在该类中,重写了onCreateView方法用于创建视图
private RecyclerView recyclerView;
private List<String> list= new ArrayList<>();
private Context context;
private Myadapter myadapter;
@SuppressLint("MissingInflatedId")
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){
String[] names={"爸爸","妈妈","姐姐","弟弟","二哥","张三","李四","王五","赵六","老刘","小周"};
View view=inflater.inflate(R.layout.tab2,container,false);
context=view.getContext();
recyclerView=view.findViewById(R.id.recycleview);
list=new ArrayList();
for(int i=0;i< names.length;i++)
list.add(names[i]);
myadapter = new Myadapter(context,list);
myadapter.setOnItemClickListener(new Myadapter.OnItemClickListener() {
@Override
public void onItemClick(int position) {
// 处理点击事件
String text = list.get(position);
Intent intent = new Intent(getContext(), MainActivity2.class);
intent.putExtra("data", text);
startActivity(intent);
}
});
recyclerView.setAdapter(myadapter);
LinearLayoutManager manager=new LinearLayoutManager(context);
manager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(manager);
return view;
}
}
2、创建Myadapter.java适配器
用于将数据绑定到 RecyclerView 上
使用OnItemClickListener监听器,通过 list1 获取对应位置的数据,将数据设置到 ViewHolder 中的 textView 中。 textView 设置了一个点击事件监听器,在点击时触发 mListener 的 onItemClick 方法,并将点击的位置 position 作为参数传递进去。
源码:
package com.example.myapplication;
import android.annotation.SuppressLint;
import android.content.Context;
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;
public class Myadapter extends RecyclerView.Adapter<Myadapter.Myholder> {
Context context1;
List<String> list1;
OnItemClickListener listener;
public interface OnItemClickListener{
void onItemClick(int position);
}
private OnItemClickListener mListener;
public void setOnItemClickListener(OnItemClickListener listener) {
mListener = listener;
}
public Myadapter(Context context,List list) {
context1=context;
list1=list;
mListener = listener;
}
@NonNull
@Override
public Myholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context1).inflate(R.layout.item,parent,false);
Myholder holder = new Myholder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull Myholder holder, @SuppressLint("RecyclerView") int position) {
holder.textView.setText(list1.get(position));
holder.textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mListener!=null) {
mListener.onItemClick(position);}
}
});
}
@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.textView6);
}
}
}
3、创建MainActivity2.java
创建一个新界面,用来显示对应联系人的消息框talk.xml,并设置了一个返回键imageview,在点击imageview时返回结果数据。
返回键的效果采用的是finsh()与setResult()来返回上一个活动并且传递数据。
源码:
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
public class MainActivity2 extends AppCompatActivity {
TextView textView;
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.talk);
String data= getIntent().getStringExtra("data");
Log.d("xr", data);
textView=findViewById(R.id.textView7);
textView.setText(data);
ImageView imageView=findViewById(R.id.imageView5);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent();
intent.putExtra("result","888");
setResult(666,intent);
finish();
}
});
}
}
4、talk.xml
MainActivity2的启动页面,用来展示消息框。
源码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal">
<ImageView
android:id="@+id/imageView5"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:src="@android:drawable/ic_menu_revert"
tools:srcCompat="@android:drawable/ic_menu_revert"
android:background="#009688"/>
<TextView
android:id="@+id/textView7"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="9"
android:background="#009688"
android:gravity="center"
android:text="信息"
android:textColor="@color/white"
android:textSize="30sp"
/>
</LinearLayout>
<TextView
android:id="@+id/textView9"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="8"
android:text="暂无消息"
android:textSize="20sp"
android:gravity="center"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal">
<TextView
android:id="@+id/textView8"
android:layout_width="0dp"
android:layout_weight="7"
android:layout_height="match_parent"
android:background="@color/white"
android:gravity="center"
android:paddingLeft="15dp"
android:paddingTop="15dp"
android:paddingRight="15dp"
android:paddingBottom="15dp"
android:text="请输入内容"
android:textSize="20dp"
tools:ignore="TextSizeCheck" />
<Button
android:id="@+id/button5"
android:layout_width="0dp"
android:layout_weight="3"
android:layout_height="match_parent"
android:background="#009688"
android:text="发送"
android:textColor="@color/white"
android:textSize="24sp"
app:backgroundTint="#4CAF50" />
</LinearLayout>
</LinearLayout>
5、textview_outer_border.xml
用来优化联系人界面边框。
源码:
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#2196F3" /> <!-- 设置填充颜色 -->
<stroke
android:width="1dp"
android:color="#009688" />
<corners android:radius="4dp" />
<padding
android:left="20dp"
android:top="20dp"
android:right="2dp"
android:bottom="5dp" />
<size android:height="100dp" />
<solid android:color="@color/white" />
</shape>
1.<solid> 标签:用于设置填充颜色,这里的 android:color 属性设置为 #2196F3,表示填充颜色为浅蓝色。
2.<stroke> 标签:用于设置描边。android:width 属性设置为 1dp,表示描边宽度为 1dp;android:color 属性设置为 #009688,表示描边颜色为深绿色。
3.<corners> 标签:用于设置圆角。android:radius 属性设置为 4dp,表示四个角的圆角半径为 4dp。
4.<padding> 标签:用于设置内边距。分别设置左边距为 20dp、上边距为 20dp、右边距为 2dp、下边距为 5dp。
5.<size> 标签:用于设置形状的大小,设置了高度为 100dp。
该文件定义一个带有描边、圆角和内边距的矩形形状,填充颜色为浅蓝色,描边颜色为深绿色,并且指定了固定的高度为 100dp。
五、效果展示
recyclerView点击
六、总结
本次仅仅是完成了简单的recycleview点击跳转,还没有完善联系人页面的设计,比如图片、时间戳等,后续还需要继续完善。
同时在实现这个功能的过程中也存在一些问题:比如跳转页面的返回,一开始使用的是intent直接返回到fragement2.java,但是应该使用FragmentManager来进行Fragment的切换,而不是直接启动一个新的Activity。最后用来最简便的方法,finsh()返回上一个界面。这个方面还需要自己深入学习,继续加强。