一:数据bean类
package com.example.test.entity;
import java.io.Serializable;
public class RecyclerBean implements Serializable {
private String name;
private String message;
private String time;
private int image;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public int getImage() {
return image;
}
public void setImage(int image) {
this.image = image;
}
}
二:RecyclerAdapter自定义适配器
package com.example.test.tools;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.RecyclerView.ViewHolder;
import com.example.test.ChatActivity;
import com.example.test.PlayActivity;
import com.example.test.R;
import com.example.test.entity.RecyclerBean;
import java.util.ArrayList;
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.Holder> {
// 第一条数据使用头部布局
private final int TYPE_ONE = 0;
private ArrayList<RecyclerBean> list;
private Context context;
public RecyclerAdapter(Context context) {
this.context = context;
}
/**
* 设置列表数据源
* @param list 数据列表
*/
public void setList(ArrayList<RecyclerBean> list) {
this.list = list;
// 通知adapter列表刷新
notifyDataSetChanged();
}
/**
* 获取列表需要渲染加载的数据的数量
*/
@Override
public int getItemCount() {
if (list.size() > 0) {
return list.size() + 1;
} else {
return 0;
}
}
/**
* 创建ItemView,将ItemView和Holder绑定
* @param parent RecyclerView对象本身
* @param viewType 如果有多种布局,根据这个viewType的值不同,要加载不同的布局
* @return 在onBindViewHolder方法中使用的Holder对象
*/
@NonNull
@Override
public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = null;
if (viewType == TYPE_ONE) {
view = LayoutInflater.from(context).inflate(R.layout.recycler_list1, parent, false);
} else {
view = LayoutInflater.from(context).inflate(R.layout.recycler_list2, parent, false);
}
return new Holder(view);
}
/**
* 处理数据,将position对应的JavaBean对象中的数据设置到控件中
* @param holder 或新建,或复用的Holder对象
* @param position item对应的索引
*/
@Override
public void onBindViewHolder(@NonNull Holder holder, int position) {
int viewType = getItemViewType(position);
if (viewType == TYPE_ONE) {
OneBindList(holder);
} else {
TwoBindList(holder, position -1);
}
}
/**
* 返回当前位置的数据是哪种数据类型(使用不同的布局)
* RecyclerView在使用的过程中,容易出现每个item显示错乱的问题。最简单的解决方法就是在适配器中添加此方法
* @param position
* @return
*/
@Override
public int getItemViewType(int position) {
// 给每个ItemView指定不同的类型,这样在RecyclerView看来,这些ItemView全是不同的,不能复用
if (position == 0) {
return TYPE_ONE;
} else {
return position;
}
}
/**
* 界面一的布局数据绑定及对应事件的处理
* @param holder 或新建,或复用的Holder对象
*/
private void OneBindList(ViewHolder holder) {
RelativeLayout layout = holder.itemView.findViewById(R.id.relative_layout2);
layout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
context.startActivity(new Intent(context, PlayActivity.class));
}
});
}
/**
* 界面二的布局数据绑定及对应事件的处理
* @param holder 或新建,或复用的Holder对象
* @param position item对应的索引
*/
private void TwoBindList(ViewHolder holder, int position) {
RecyclerBean bean = list.get(position);
RelativeLayout layout = holder.itemView.findViewById(R.id.relative_layout1);
ImageView imageView = holder.itemView.findViewById(R.id.image);
TextView name = holder.itemView.findViewById(R.id.name);
TextView message = holder.itemView.findViewById(R.id.message);
TextView time = holder.itemView.findViewById(R.id.time);
name.setText(bean.getName());
time.setText(bean.getTime());
message.setText(bean.getMessage());
imageView.setImageResource(bean.getImage());
// 为每一项添加点击事件
layout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(context, ChatActivity.class);
intent.putExtra("data", bean);
context.startActivity(intent);
}
});
}
class Holder extends RecyclerView.ViewHolder {
public Holder(@NonNull View itemView) {
super(itemView);
}
}
}
三:自定义item布局界面一recycler_list1.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/relative_layout2"
android:padding="10dp">
<ImageView
android:id="@+id/image"
android:layout_width="60dp"
android:layout_height="60dp"
android:scaleType="fitXY"
android:src="@mipmap/play" />
<TextView
android:id="@+id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="游戏中心"
android:layout_marginLeft="20dp"
android:layout_centerVertical="true"
android:layout_toRightOf="@+id/image"/>
<ImageButton
android:id="@+id/go"
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@mipmap/go"
android:background="#0000"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"/>
</RelativeLayout>
自定义item布局界面二recycler_list2.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/relative_layout"
android:padding="10dp">
<ImageView
android:id="@+id/image"
android:layout_width="60dp"
android:layout_height="60dp"
android:scaleType="fitXY"
android:src="@mipmap/img04" />
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="杰克"
android:layout_marginLeft="20dp"
android:layout_marginTop="5dp"
android:layout_toRightOf="@+id/image"/>
<TextView
android:id="@+id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="今天有空吗?一起出去玩吧!"
android:layout_toRightOf="@+id/image"
android:layout_below="@+id/name"
android:layout_marginLeft="20sp"
android:layout_marginTop="15dp"/>
<TextView
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="上午 9:36"
android:layout_alignParentRight="true"
android:layout_marginTop="10dp"
android:layout_marginRight="15dp"/>
</RelativeLayout>
四:主界面布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Activity12"
android:padding="20dp">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="23sp"
android:text="RecyclerView"
android:layout_centerHorizontal="true"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler"
android:layout_below="@+id/text"
android:layout_above="@+id/btn"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="返回"
android:layout_alignParentBottom="true"/>
</RelativeLayout>
五:初始化使用RecyclerView
package com.example.test;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import com.example.test.entity.RecyclerBean;
import com.example.test.tools.RecyclerAdapter;
import java.util.ArrayList;
public class Activity13 extends AppCompatActivity {
private RecyclerView recycler;
private ArrayList<RecyclerBean> list = new ArrayList<>();
private String[] messages = new String[]{"我发现你最近变了很多。", "风景非常美丽,你和你的朋友一起旅行了吗?", "看你照片好呆萌吖。", "我发现你有一个特别的点。", "我觉得我蛮帅的,所以要来认识一下你。", "刚刚开完周一会议,到现在还没吃饭。", "你头像的照片好可爱。", "真巧,又碰见你了。", "你有权选择要不要和我聊?虽然我知道这可能是你爱情生涯的转折点。"};
private String[] names = new String[]{"临风", "君志", "庆贤", "慕华", "云烁", "浩轩", "昊伟", "皓阳", "天宇"};
private String[] times = new String[]{"下午 19:28", "下午 18:18", "上午 9:36", "上午 6:00", "昨天 21:05", "前天 18:57", "2022-09-01 14:23", "2022-06-15 17:30", "2022-02-08 13:47"};
private int[] images = new int[]{R.mipmap.img01, R.mipmap.img02, R.mipmap.img03, R.mipmap.img04, R.mipmap.img05, R.mipmap.img06, R.mipmap.img07, R.mipmap.img08, R.mipmap.img09};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_13);
initView();
}
private void initView() {
for (int i = 0; i < 9; i++) {
RecyclerBean bean = new RecyclerBean();
bean.setImage(images[i]);
bean.setMessage(messages[i]);
bean.setName(names[i]);
bean.setTime(times[i]);
list.add(bean);
}
recycler = findViewById(R.id.recycler);
// 设置布局
recycler.setLayoutManager(new LinearLayoutManager(this));
// 设置adapter
RecyclerAdapter adapter = new RecyclerAdapter(this);
// 设置数据
adapter.setList(list);
recycler.setAdapter(adapter);
// 设置分割线
recycler.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
}
}
六:点击会话item后跳转聊天界面接收数据
package com.example.test;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.test.entity.RecyclerBean;
public class ChatActivity extends AppCompatActivity {
private ImageButton back;
private TextView name;
private TextView time;
private TextView message;
private ImageView image;
private RecyclerBean bean;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
initView();
}
private void initView() {
back = findViewById(R.id.back);
name = findViewById(R.id.name);
time = findViewById(R.id.time);
message = findViewById(R.id.message);
image = findViewById(R.id.image);
// 接收传递的数据
bean = (RecyclerBean) getIntent().getSerializableExtra("data");
name.setText(bean.getName());
time.setText(bean.getTime());
message.setText(bean.getMessage());
image.setImageResource(bean.getImage());
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
}
七:聊天界面布局activity_chat.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ChatActivity">
<RelativeLayout
android:id="@+id/tab"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#61B5DC">
<ImageButton
android:id="@+id/back"
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@mipmap/back"
android:background="#0000"
android:layout_centerVertical="true"/>
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="杰克"
android:layout_centerInParent="true"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/tab"
android:layout_above="@+id/bottom"
android:padding="10dp">
<TextView
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="09:50"
android:layout_centerHorizontal="true"/>
<ImageView
android:id="@+id/image"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_below="@+id/time"
android:scaleType="fitXY"
android:src="@mipmap/img04" />
<TextView
android:id="@+id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="今天天气不错"
android:layout_toRightOf="@+id/image"
android:layout_below="@+id/time"
android:layout_marginTop="20dp"
android:layout_marginLeft="20dp"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/bottom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true">
<EditText
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/send"
android:imeOptions="actionSend"/>
<Button
android:id="@+id/send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送"
android:textColor="#fff"
android:background="#61B5DC"
android:layout_alignParentRight="true"/>
</RelativeLayout>
</RelativeLayout>
八:点击头部item后跳转游戏中心界面
package com.example.test;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
public class PlayActivity extends AppCompatActivity {
private ImageButton back;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_play);
initView();
}
private void initView() {
back = findViewById(R.id.back);
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
}
九:游戏中心界面布局activity_play.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".PlayActivity">
<RelativeLayout
android:id="@+id/tab"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#61B5DC">
<ImageButton
android:id="@+id/back"
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@mipmap/back"
android:background="#0000"
android:layout_centerVertical="true"/>
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="游戏中心" />
</RelativeLayout>
<TextView
android:id="@+id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="这里是游戏中心"
android:layout_centerInParent="true"/>
</RelativeLayout>
十:效果图