首页 > 其他分享 >Android RecyclerView的使用(以实现一个简单的动态聊天界面为例)

Android RecyclerView的使用(以实现一个简单的动态聊天界面为例)

时间:2024-03-12 17:35:53浏览次数:22  
标签:为例 Chatlist mDatas rc import Android RecyclerView public view

RecycleView可以实现动态列表的功能,毕竟在实际开发中大多数情况下不可能提前知道一个列表要塞进去多少东西。

比如说QQ微信的聊天栏界面,可以抽象成一个RecycleView(或者一个ListView),没人说话时列表为空,你发一句话我发一句话,这列表就长起来了。

再或者像是一些管理系统里,每一个物品号旁边还有一个删除按钮,点击后删除这个物品这一栏(连按钮也一块删除),可控件一般是静态的,这个时候就需要用到RecycleView了。

这里先不弄什么带按钮的,就搞一个单纯展示的聊天信息列表吧.

Layout文件里这样设计,加上一个ScrollView可以实现滚动效果。

<ScrollView android:layout_width="match_parent" android:layout_height="match_parent"
                app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintTop_toTopOf="parent" app:layout_constraintHorizontal_bias="0.0">
        <androidx.recyclerview.widget.RecyclerView
                android:layout_width="match_parent"
                android:layout_height="match_parent" app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintBottom_toBottomOf="parent"
                android:orientation="vertical"
                android:id="@+id/rc_chatlist"/>
</ScrollView>

新建java class,命名为Chatlist

package com.example.wearespeakers;

public class Chatlist {
    private String SpeakerName;//说话者的名字
    private String SpeakContent;//聊天的内容
    private String SpeakTime;//聊天时间,这个先放着不用
    public Chatlist(String SpeakerName,String SpeakContent){
        this.SpeakerName=SpeakerName;
        this.SpeakContent=SpeakContent;
    }
    public String getSpeakerName(){
        return this.SpeakerName;
    }
    public String getSpeakContent(){
        return this.SpeakContent;
    }
    public String getSpeakTime(){
        return this.SpeakTime;
    }
}

新建一个XML Layout文件,命名为rc_chatlist_layout.xml,这就是列表每一个子项的布局。

<?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="50dp">
    <TextView
            android:id="@+id/rc_tv_speakername"
            android:text="[SpeakerNAME]"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    <TextView
            android:id="@+id/rc_tv_speakcontent"
            android:text="[SpeakCONTENT]"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
</LinearLayout>

新建一个java class命名为ChatlistAdapter.java,Adapter是最麻烦的一部分,但是通过Adapter也可以实现功能的定制化,实现加入一些子控件的更复杂的功能,这一点比ListView要强。

package com.example.wearespeakers;

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 ChatlistAdapter extends RecyclerView.Adapter
        <ChatlistAdapter.MyViewHolder> {
    private List<Chatlist> mDatas;
    private Context mContext;
    private LayoutInflater inflater;

    public ChatlistAdapter(Context context, List<Chatlist> datas){
        this. mContext=context;
        this. mDatas=datas;
        inflater=LayoutInflater. from(mContext);
    }

    class MyViewHolder extends RecyclerView.ViewHolder {
        TextView speakername;
        TextView speakcontent;
        View v;
        public MyViewHolder(View view) {
            super(view);
            speakername=(TextView) view.findViewById(R.id.rc_tv_speakername);
            speakcontent=(TextView) view.findViewById(R.id.rc_tv_speakcontent);
            v=view;
        }

    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, final int position) {
        Chatlist da=mDatas.get(position);
        holder.speakername.setText(da.getSpeakerName());
        holder.speakcontent.setText(da.getSpeakContent());
    }

    @Override
    public int getItemCount() {
        return mDatas.size();
    }

    //这里边还可以对RecycleView里的独立Item进行操作(简单起见这次没有这样弄)
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = inflater.inflate(R.layout.rc_chatlist_layout,parent,false);
        MyViewHolder holder= new MyViewHolder(view);


        return holder;
    }


}

 然后在Activity里实现这玩意

package com.example.wearespeakers;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

//此activity主要用来实现聊天界面
public class ChatActivity extends AppCompatActivity {

    private ChatlistAdapter chatAdapter;
    private List<Chatlist> mDatas;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat);


        //聊天信息(示例)
        mDatas = new ArrayList<Chatlist>();
        Chatlist C1;
        C1=new Chatlist("ABC:","Hello,world!");
        mDatas.add(C1);
        Chatlist C2;
        C2=new Chatlist("DEF:","This is a new app.");
        mDatas.add(C2);
        //可以通过数据库插入数据

        chatAdapter=new ChatlistAdapter(this,mDatas);
        RecyclerView rc_chatlist=(RecyclerView) findViewById(R.id.rc_chatlist);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this );
        rc_chatlist.setLayoutManager(layoutManager);
        //如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
        rc_chatlist.setHasFixedSize(true);
        //创建并设置Adapter
        rc_chatlist.setAdapter(chatAdapter);
    }
}

实现效果如下,丑是丑了点,先把基本功能搞起来再美化。 

 

标签:为例,Chatlist,mDatas,rc,import,Android,RecyclerView,public,view
From: https://www.cnblogs.com/soaring27221/p/18068824

相关文章

  • django初识(以django4.2.11为例)
    django的url路径,不是通过注解去实现的,而是在urls.py中去配置的格式为urlname/,是默认,的路径http://127.0.0.1:8000/对应path("",views.home)而不是path("/",views.home),如下图其中对应的函数为,views.py的函数比如path("/login",views.login)对应views.py中的login函数,如......
  • Android 发布aar远程依赖出现扩展方法无法找到问题
    原文:Android发布aar远程依赖出现扩展方法无法找到问题-Stars-One的杂货小窝起因最近在整合自己的工具类库,偶然发现之前写的扩展方法使用远程依赖却是提示找不到但我有个aar库却是正常的,于是看了下这两者的区别,发现是build.gradle多了下面这个导致的问题packagingOptio......
  • Android获取散列秘钥(KeyHash)
    1.下载openssl,地址:https://code.google.com/archive/p/openssl-for-windows/downloads2.解压openssl3.将.keystore放到openssl的bin目录下4.执行keytool-exportcert-alias签名的alias名称-keystore签名.keystore|opensslsha1-binary|opensslbase64备注:如果出现......
  • 初始配置:IntelliJ Android无法运行项目并报错Error: Module not specified
    最近重拾android,想趁复试前搞一个东西出来,顺便给毕设做好准备。写代码前得让IDEA把初始的空项目在虚拟机上运行一下,看看开发环境是不是有什么问题,果然每次过一段时间重开,哪怕我上一次关闭时啥也没碰,总得出点配置上的小问题。Error:Modulenotspecified未指定模块错误,但点......
  • Intel Macbook安装android模拟器方案
    对照了几个方案,不想安装游戏平台的模拟器,也不想安装androidstudio,于是想采用虚拟机的方式:方案一:android-x86安装在vmware上。参考:InstallAndroidx86inVMwareFusion-Vimalin (主要参考这个,stepbystep很详细)https://forum.xda-developers.com/t/android-x86-wifi-issue.......
  • Android 《Notification》
    代码packagecom.xian.app.broadcast;importandroidx.appcompat.app.AppCompatActivity;importandroidx.core.app.NotificationCompat;importandroid.app.Notification;importandroid.app.NotificationChannel;importandroid.app.NotificationManager;publiccla......
  • Android 《回到桌面与切换到任务列表》
    App不但能监测手机屏幕的方向变更,还能获知回到桌面的事件,连打开任务列表的事件也能实时得知。回到桌面与打开任务列表都由按键触发,例如按下主页键会回到桌面,按下任务键会打开任务列表。虽然这两个操作看起来属于按键事件,但系统并未提供相应的按键处理方法,而是通过广播发出事件信......
  • Android 《屏幕切换》
    默认处理机制除了系统广播之外,App所处的环境也会影响运行,比如手机有竖屏与横屏两种模式,竖屏时水平方向较短而垂直方向较长,横屏时水平方向较长而垂直方向较短。两种屏幕方向不但造成App界面的展示差异,而且竖屏和横屏切换之际,甚至会打乱App的生命周期。无需重启Activity横竖屏......
  • Android 获取设备的CPU型号和设备型号
    原文:Android获取设备的CPU型号和设备型号-Stars-One的杂货小窝之前整的项目的总结信息,可能不太全,凑合着用吧,代码在最下面一节CPU型号数据华为:ro.mediatek.platformvivo:ro.vivo.product.platformoppo:ro.board.platform或ro.product.board三星:ro.board.pla......
  • Android 获取设备的亮度百分比
    一般的屏幕亮度都是0-255,而小米手机的高版本不一样为了使亮度调节更加细腻,MIUI对原生亮度级别进行了扩展,由原有的255级调整根据不同屏幕分别支持255/1023/2047/4095级。开发者在进行亮度调整时需要先去确认机型亮度的最大值和最小值,然后进行比例调整。计算屏幕亮度fung......