Android RecyclerView的使用(以实现一个简单的动态聊天界面为例)
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);
}
}
实现效果如下,丑是丑了点,先把基本功能搞起来再美化。