实现思维顺序:

1.首先我们需要准备2张.9的png图片(一张图片为左边聊天泡泡,一个图片为右边的聊天泡泡),可以使用draw9patch.bat工具制作,任何图片导入到drawable中。

2.需要写一个聊天室布局xml,布局由android.support.v7.widget.RecyclerView布局构成聊天信息列表布局,一个文本输入框作为信息输入,一个发送Button作为发送键。

3.需要写一个消息的子布局,用于显示RecyclerView布局中里的消息。

4.写一个保存数据的数据类,用于后续添加到List中

5.写一个形成布局需要使用的适配器类

6.在聊天室布局的activity的class中写入数据

1.首先我们需要准备2张.9的png图片

2.一个聊天室布局xml

<?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="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/chatroomRecyclerView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/enter"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="@string/contentHints"
android:layout_weight="1"
android:maxLines="2"
/>
<Button
android:id="@+id/send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/send"
/>
</LinearLayout> </LinearLayout>

3.一个消息的子布局

<?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">
<LinearLayout
android:id="@+id/left_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:background="@drawable/leftoo"
>
<TextView
android:id="@+id/left_msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:textColor="@color/colcrWhite"
android:layout_margin="10dp"/>
</LinearLayout>
<LinearLayout
android:id="@+id/right_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:background="@drawable/right"
>
<TextView
android:id="@+id/right_msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:textColor="@color/colcrWhite"
android:layout_margin="10dp"/> </LinearLayout> </LinearLayout>
 

4.一个保存数据的类

package com.example.lenovo.mychatroom.data_processing;

import java.util.Date;

/**
* Created by lenovo on 2018/5/4.
*/
/*
我们需要单例保存的数据为:
1.消息的内容;
2.消息的类型:发送还是接收;
3.消息创建时间
*/
public class Msg {
private String content;
private int type;
private String time;
public final static int TYPE_RECEIVED=0;
public final static int TYPE_SENT=1;
public Msg(String content,int type){
this.content =content;
this.type = type;
this.time = timeData();
} public String getContent() {
return content;
}
public int getType() {
return type;
} public String getTime() {
return time;
}
/*
写一个获取时间的方法
*/
public String timeData(){
Date date = new Date();
String timeData = String.format("%tH",date)
+String.format("%tM",date)
+String.format("%tS",date);
return timeData; }
}
 

5.一个形成布局需要使用的适配器类

package com.example.lenovo.mychatroom.data_processing;

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast; import com.example.lenovo.mychatroom.R; import java.util.List; /**
* Created by lenovo on 2018/5/4.
*/ /*
适配器类,注意适配器类中的泛型不是List集合而是Viewholder缓存内部类
*/
public class MsgAdapter extends RecyclerView.Adapter<MsgAdapter.ViewHolder> {
// 写一个从外部得到的List的全局变量。
private List<Msg> msgList;
/*
缓存子布局的内部类
*/
static class ViewHolder extends RecyclerView.ViewHolder{
View myView;
LinearLayout left_layout;
LinearLayout right_layout;
TextView left_msg;
TextView right_msg; public ViewHolder(View itemView) {
super(itemView);
myView = itemView;
left_layout = (LinearLayout)itemView.findViewById(R.id.left_layout);
right_layout = (LinearLayout)itemView.findViewById(R.id.right_layout);
left_msg = (TextView)itemView.findViewById(R.id.left_msg);
right_msg = (TextView)itemView.findViewById(R.id.right_msg);
}
}
/*
传入外部list的构造方法
*/
public MsgAdapter(List<Msg> msgList){
this.msgList = msgList;
}
/*
必须要重写的方法
将子布局填充到父类布局里,在将父类布局添加到缓存布局的内部类中,并且返回缓存布局内部类。
此处写RecyclerView布局的点击事件
*/
@Override
public MsgAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.msg_item,parent,false);
final ViewHolder holder = new ViewHolder(view);
holder.myView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = holder.getAdapterPosition();//得到当前点击的位置
Msg msg = msgList.get(position);//从点击位置里得到List中的单例
//从单例中得到时间
Toast.makeText(v.getContext(), "消息时间:"+msg.getTime(), Toast.LENGTH_SHORT).show();
}
});
return holder;
} /*
将布局数据导入到布局中的一个必须重写的方法
*/
@Override
public void onBindViewHolder(MsgAdapter.ViewHolder holder, int position) {
Msg msg = msgList.get(position);
//判断是信息是接收还是发送的,并且分别判断需要隐藏的布局和显示的布局
if (msg.getType() == Msg.TYPE_RECEIVED){
//判断到信息是接收的,将左边的布局显示,右边的布局隐藏
holder.left_layout.setVisibility(View.VISIBLE);
holder.right_layout.setVisibility(View.GONE);
holder.left_msg.setText(msg.getContent());
}
if (msg.getType() == Msg.TYPE_SENT){
holder.right_layout.setVisibility(View.VISIBLE);
holder.left_layout.setVisibility(View.GONE);
holder.right_msg.setText(msg.getContent());
}
}
// 必须要重写的方法,返回list的长度
@Override
public int getItemCount() {
return msgList.size();
}
}
 

6.在聊天室布局的activity的class中写入数据

package com.example.lenovo.mychatroom;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Button;
import android.widget.EditText; import com.example.lenovo.mychatroom.data_processing.Msg;
import com.example.lenovo.mychatroom.data_processing.MsgAdapter; import java.util.ArrayList;
import java.util.List; public class MyChatroomDemo extends AppCompatActivity {
private List<Msg> msgList = new ArrayList<>();
private EditText editText;
private Button sendButton;
private RecyclerView recyclerView;
private MsgAdapter msgAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_chatroom_demo);
initMsgs();
editText = (EditText)findViewById(R.id.enter);
sendButton = (Button)findViewById(R.id.send);
recyclerView =(RecyclerView)findViewById(R.id.chatroomRecyclerView);
//布局排列方式
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
msgAdapter = new MsgAdapter(msgList);
recyclerView.setAdapter(msgAdapter);
sendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//得到输入框中的内容
String content = editText.getText().toString();
//判断内容不是空的
if(!"".equals(content)){
//将内容添加到单例中
Msg msg = new Msg(content,Msg.TYPE_SENT);
msgList.add(msg);
//要求适配器重新刷新
msgAdapter.notifyItemInserted(msgList.size()-1);
//要求recyclerView布局将消息刷新
recyclerView.scrollToPosition(msgList.size()-1);
editText.setText("");
}
}
});
}
public void initMsgs(){
Msg msg1 = new Msg("你好!",Msg.TYPE_RECEIVED);
msgList.add(msg1);
Msg msg2 = new Msg("谢谢!你好。",Msg.TYPE_SENT);
msgList.add(msg2);
Msg msg3 = new Msg("加班么?",Msg.TYPE_RECEIVED);
msgList.add(msg3); } }
 

实现的效果图:

android 开发 写一个RecyclerView布局的聊天室,并且添加RecyclerView的点击事件的更多相关文章

  1. android 开发 实现一个自定义布局的AlertDialog对话框

    对话框有很多实现方法,最常见的是在一个点击事件中代码直接写出对话框.如下: package com.example.lenovo.mydemo2; import android.content.Dia ...

  2. android开发 写一个自定义形状的按键

    步骤: 1.在drawable 文件夹中创建一个xml布局文件. 2.修改布局文件 3.在需要使用背景的按键中导入布局. 创建布局文件: 修改布局文件: <?xml version=" ...

  3. [NodeJS]使用Node.js写一个简单的在线聊天室

    声明:教程来自<Node即学即用>.源代码案例均出自此书.博文仅为个人学习笔记. 第一步:创建一个聊天server. 首先,我们先来写一个Server: var net = require ...

  4. android 开发 实现一个app的引导页面,使用ViewPager组件(此引导的最后一页的Button会直接写在最后一页布局里,跟随布局滑进滑出)

    基本ViewPager组件使用方式与我之前写的https://blog.csdn.net/qq_37217804/article/details/80332634 这篇博客一致. 下面我们将重点详细解 ...

  5. android 开发 实现一个带图片Image的ListView

    注意:这种实现方法不是实现ListView的最优方法,只是希望通过练习了解ListView的实现原理 思维路线: 1.创建drawable文件夹将要使用的图片导入进去 2.写一个类,用于存放图片ID数 ...

  6. 使用Servlet和JSP实现一个简单的Web聊天室系统

    1 问题描述                                                利用Java EE相关技术实现一个简单的Web聊天室系统,具体要求如下. (1)编写一个登录 ...

  7. workerman-chat(PHP开发的基于Websocket协议的聊天室框架)(thinkphp也是支持socket聊天的)

    workerman-chat(PHP开发的基于Websocket协议的聊天室框架)(thinkphp也是支持socket聊天的) 一.总结 1.下面链接里面还有一个来聊的php聊天室源码可以学习 2. ...

  8. ASP.NET Core 2.2 基础知识(十七) SignalR 一个极其简陋的聊天室

    这是一个极其简陋的聊天室! 这个例子只是在官方的例子上加了 Group 的用法而已,主要是官方给的 Group 的例子就两行代码,看不出效果. 第一步:修改 chat.js "use str ...

  9. android 开发 实现一个ListView套嵌GirdView的滚动布局

    效果图 实现思维: 首先要处理管理好需要导入的数据,我们这里创建class来处理这些数据并且便于管理它们. 创建一个主activity的布局,里面需要一个ListView控件. 创建一个class继承 ...

随机推荐

  1. ML平台_微博深度学习平台架构和实践

    ( 转载至: http://www.36dsj.com/archives/98977)  随着人工神经网络算法的成熟.GPU计算能力的提升,深度学习在众多领域都取得了重大突破.本文介绍了微博引入深度学 ...

  2. Windows Azure Web Site (19) Azure Web App链接到VSTS

    <Windows Azure Platform 系列文章目录> 之前遇到一个问题,客户在海外使用 我参考了一下国内Azure China的文档:https://school.azure.c ...

  3. [原抄] Potplayer 1.7.2710 快捷键

    对着软件一个一个抄下来的. 打开文件:Ctrl+O[F3] / 简索文件:F12 / 最后文件 Ctrl+Y / 关闭:F4 打开摄像头:Ctrl+J / 打开DVD设备 Ctrl+D 播放.暂停:空 ...

  4. MySQL 单条记录长度最大65535

    今天设计表结构,加了几个字段,结果报错了 Ligne trop grande. Le taille maximale d'une ligne, sauf les BLOBs, est 65535... ...

  5. 黄聪:如何高效率存储微信中的 access_token

    众所周知,在微信开发中,获取access_token 的接口每天的调用次数是有限制的,2000次应该是. 不过其实这些完全够用了,除非你不小心写了个循环,在1秒中内用完了. 每个access_toke ...

  6. Oracle关于自连接、左外连接、右外连接、全连接

    关于自连接.左外连接.右外连接.全连接:   简单来讲,随便来个例子: A表 B表 id name id name  1 a 1 b  2 b 3 c 4 c   内连接就是左表和右表相同的数据: s ...

  7. Linux下自制回收站

    Linux下自制回收站 相信熟悉linux系统的人都知道rm的厉害,也大都听说过有rm造成的生产事故,本文将详细介绍如何在linux环境下制作回收站以避免数据误删除,如何恢复回收站中的数据,如何查看回 ...

  8. Schiff Move Free维骨力这个牌子的保健效果怎么样,是要给中老年人群服用的

    Schiff Move Free维骨力这个牌子的保健效果怎么样,是要给中老年人群服用的.? https://www.zhihu.com/question/46399868 服move free还要补钙 ...

  9. Jmeter(二十九)Jmeter-Question之“Ant集成报告模板优化”

    也是在和朋友探讨的时候,发现一个问题,Jmeter在与Ant集成的时候,通常选用的模板是jmeter自带的两个样式表 该自带的样式,节省了大家搭建框架的时间,不需要自己重新写样式,当然也相对简洁: 做 ...

  10. c#day04从控制台获取一个字符

    class EnumStruct { //定义QQ的状态枚举 Qme QnLine OffLine Leave Busy //提示用户现在一个状态 然后接收 ,并将用户输入转换成枚举类 enum Qs ...