RecyclerView的使用(多类型条目的使用)

一:数据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>

十:效果图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Qxnedy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值