RecyclerView编写聊天页面
一、编写主界面
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview_2"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/chat_editText_1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="Type somethong here"
android:maxLines="2" />
<Button
android:id="@+id/chat_button_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Send"/>
</LinearLayout>
</LinearLayout>
关于:android:layout_height=“0dp”
按比例显示LinearLayout内各个子控件,需设置android:layout_width=“0dp”,如果为竖直方向的设置android:layout_height=“0dp”。在这种情况下某子个控件占用LinearLayout的比例为:本控件weight值 / LinearLayout内所有控件的weight值的和。
二、自定义实体类
package com.example.activitytest.Chat_interface;
//自定义实体类msg,content表示消息内容,type表示消息类型。
// 其中消息类型有两个值可以选:
// TYPEE_RECEIVED表示这是一条收到的消息,
// TYPE_SENT表示这是一条发出的消息
public class Msg {
public static final int TYPEE_RECEIVED=0;
public static final int TYPE_SENT=1;
private String content;
private int type;
public Msg(String content, int type)
{
this.content=content;
this.type=type;
}
public String getContent()
{
return content;
}
public int getType()
{
return type;
}
}
三、编写RecyclerView子项布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp" >
<LinearLayout
android:id="@+id/left_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:background="@drawable/message_left" >
<TextView
android:id="@+id/left_msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="10dp"
android:textColor="#fff" />
</LinearLayout>
<LinearLayout
android:id="@+id/right_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:background="@drawable/message_right" >
<TextView
android:id="@+id/right_msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="10dp" />
</LinearLayout>
</LinearLayout>
四、创建RecyclerView的适配器类
public class MsgAdapter extends RecyclerView.Adapter<MsgAdapter.MyViewHolder> {
public List<Msg> msgList;
public static class MyViewHolder extends RecyclerView.ViewHolder{
LinearLayout leftLayout;
LinearLayout rightLayout;
TextView leftMsg,rightMsg;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
leftLayout=(LinearLayout)itemView.findViewById(R.id.left_layout);
rightLayout=(LinearLayout)itemView.findViewById(R.id.right_layout);
leftMsg=(TextView)itemView.findViewById(R.id.left_msg);
rightMsg=(TextView)itemView.findViewById(R.id.right_msg);
}
}
public MsgAdapter(List<Msg> data){ //构造函数
msgList=data;
}
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.msg_item,parent,false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { //替换视图内容
Msg msg=msgList.get(position);
if (msg.getType()==Msg.TYPEE_RECEIVED)
{
//如果收到的消息,则显示左边的消息布局,将右边的消息布局隐藏
holder.leftLayout.setVisibility(View.VISIBLE);
holder.rightLayout.setVisibility(View.GONE);
holder.leftMsg.setText(msg.getContent());
}
else if(msg.getType()==Msg.TYPE_SENT)
{
//如果是发出的消息,则显示右边的消息布局,将左边的消息布局隐藏
holder.rightLayout.setVisibility(View.VISIBLE);
holder.leftLayout.setVisibility(View.GONE);
holder.rightMsg.setText(msg.getContent());
}
}
@Override
public int getItemCount() {
return msgList.size();
}
}
五、编写活动代码
public class MsgRecyclerViewActivity extends AppCompatActivity {
private List<Msg> msgList=new ArrayList<>();
private EditText inputText;
private Button send;
private RecyclerView msgRecyclerView;
private MsgAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.chat_interface_item);
initMsgs();
inputText=(EditText)findViewById(R.id.chat_editText_1);
send=(Button)findViewById(R.id.chat_button_1);
msgRecyclerView=(RecyclerView)findViewById(R.id.recyclerview_2);
LinearLayoutManager layoutManager=new LinearLayoutManager(this);
msgRecyclerView.setLayoutManager(layoutManager);
adapter=new MsgAdapter(msgList);
msgRecyclerView.setAdapter(adapter);
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String content=inputText.getText().toString();
if(!"".contentEquals(content)) //判断内容是否为空
{
Msg msg=new Msg(content,Msg.TYPE_SENT);
msgList.add(msg);
adapter.notifyItemInserted(msgList.size()-1);//当有新消息时,刷新RecyclerView中的显示
msgRecyclerView.scrollToPosition(msgList.size()-1); //将RecyclerView定位到最后一行
inputText.setText("");//清空输入框中的内容
}
}
});
}
public void initMsgs()
{
Msg msg1=new Msg("Hello guy.",Msg.TYPEE_RECEIVED);
msgList.add(msg1);
Msg msg2=new Msg("Hello,who is what?.",Msg.TYPE_SENT);
msgList.add(msg2);
Msg msg3=new Msg("This is you father!.",Msg.TYPEE_RECEIVED);
msgList.add(msg3);
}
}