实现思维顺序:

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. npm是什么

    npm简介 维基百科中npm定义 npm完全用JavaScript写成,最初由艾萨克·施吕特(Isaac Z. Schlueter)开发. 艾萨克表示自己意识到"模块管理很糟糕"的 ...

  2. MobaXterm的一些介绍(Top 5 SSH Clients for Windows (Alternatives of PuTTY))

    Top 5 SSH Clients for Windows (Alternatives of PuTTY) http://tecadmin.net/top-5-ssh-clients-for-wind ...

  3. debian的python蓝牙库

    sudo apt--dev pip install bluepy

  4. sql中的STRFTIME

    STRFTIME返回的是一个字符串 STRFTIME('%w',myTime) in ('1','2','4','5') 可以正确执行,而 STRFTIME('%w',myTime) in (1,2, ...

  5. Selenium2+python自动化43-判断title(title_is)

    From: https://www.cnblogs.com/yoyoketang/p/6539117.html 前言 获取页面title的方法可以直接用driver.title获取到,然后也可以把获取 ...

  6. lucene 4.0 - Facet demo

    package com.fox.facet; import java.io.File; import java.io.IOException; import java.util.ArrayList; ...

  7. MFC程序显示控制台输出

    有的时候,我们用c写的一些东西,可能需要MFC作为UI输入参数进行测试,但是程序里有大量的printf操作,这就需要MFC程序启动的时候同时打开 一个控制台,用于标准输出 查询网络,大致方法有以下两种 ...

  8. P1015回文数

    传送 回文数的判断有个神奇的公式: g[i]==g[leng+-i] 其中leng为字符串长度,看每个g[i]是否都满足它,若满足,就是回文数 ps:洛谷的impossible有毒,必须得复制题干中的 ...

  9. P【1012】拼数

    十分蒟蒻...(还是看别人的博才过的...) 题解 #include<cstdio>#include<cstring>#include<algorithm>#inc ...

  10. sudo 命令报错的解决方法

    尝试着用终端打开Mac的安全权限(sudo spctl --master-disable),却显示以下提示,望高手解答. sudo: /etc/sudoers is world writablesud ...