android 开发 写一个RecyclerView布局的聊天室,并且添加RecyclerView的点击事件
实现思维顺序:
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的点击事件的更多相关文章
- android 开发 实现一个自定义布局的AlertDialog对话框
对话框有很多实现方法,最常见的是在一个点击事件中代码直接写出对话框.如下: package com.example.lenovo.mydemo2; import android.content.Dia ...
- android开发 写一个自定义形状的按键
步骤: 1.在drawable 文件夹中创建一个xml布局文件. 2.修改布局文件 3.在需要使用背景的按键中导入布局. 创建布局文件: 修改布局文件: <?xml version=" ...
- [NodeJS]使用Node.js写一个简单的在线聊天室
声明:教程来自<Node即学即用>.源代码案例均出自此书.博文仅为个人学习笔记. 第一步:创建一个聊天server. 首先,我们先来写一个Server: var net = require ...
- android 开发 实现一个app的引导页面,使用ViewPager组件(此引导的最后一页的Button会直接写在最后一页布局里,跟随布局滑进滑出)
基本ViewPager组件使用方式与我之前写的https://blog.csdn.net/qq_37217804/article/details/80332634 这篇博客一致. 下面我们将重点详细解 ...
- android 开发 实现一个带图片Image的ListView
注意:这种实现方法不是实现ListView的最优方法,只是希望通过练习了解ListView的实现原理 思维路线: 1.创建drawable文件夹将要使用的图片导入进去 2.写一个类,用于存放图片ID数 ...
- 使用Servlet和JSP实现一个简单的Web聊天室系统
1 问题描述 利用Java EE相关技术实现一个简单的Web聊天室系统,具体要求如下. (1)编写一个登录 ...
- workerman-chat(PHP开发的基于Websocket协议的聊天室框架)(thinkphp也是支持socket聊天的)
workerman-chat(PHP开发的基于Websocket协议的聊天室框架)(thinkphp也是支持socket聊天的) 一.总结 1.下面链接里面还有一个来聊的php聊天室源码可以学习 2. ...
- ASP.NET Core 2.2 基础知识(十七) SignalR 一个极其简陋的聊天室
这是一个极其简陋的聊天室! 这个例子只是在官方的例子上加了 Group 的用法而已,主要是官方给的 Group 的例子就两行代码,看不出效果. 第一步:修改 chat.js "use str ...
- android 开发 实现一个ListView套嵌GirdView的滚动布局
效果图 实现思维: 首先要处理管理好需要导入的数据,我们这里创建class来处理这些数据并且便于管理它们. 创建一个主activity的布局,里面需要一个ListView控件. 创建一个class继承 ...
随机推荐
- CSS 仿 iOS 系统通知数字样式
/** 仿 iOS 系统通知数字样式 **/ .num_span{ background-color: #f00; background-image: -webkit-linear-gradient( ...
- java中三种for循环之间的对比
普通for循环语法: for (int i = 0; i < integers.length; i++) { System.out.println(intergers[i]); } foreac ...
- Windows Phone Splash Screen
Why to use splash screen? Typically, you should use a splash screen in your app only if your app is ...
- 《JavaScript设计模式与开发》笔记 3.call和apply
1.改变this指向 2.Function.prototype.bind 3.借用其他对象方法 1.借用实现继承 2.实现恶心的 Array.prototype.push.call Array.pro ...
- <亲测>CentOS7yum安装PHP7.2
如果之前已经安装我们先卸载一下 yum -y remove php* 由于linux的yum源不存在php7.x,所以我们要更改yum源 rpm -Uvh https://dl.fedoraproje ...
- Java第03次实验提纲(面向对象1-基本概念)
0. 将码云的项目clone到本机 请参考使用Eclipse Egit与码云管理你的代码中的3 从码云将项目clone到你的电脑 之后就可以在Eclipse中提交本地项目新增或修改的文件.如果在Ecl ...
- PHP 获取url里文件的扩展名
PHP 获取url地址中文件的扩展名 $url = 'http://www.abc.com/ab/cd/e.php?id=1&data=2#laowen';echo pathinfo( par ...
- 使用googletest进行C++单元测试(Netbeans为例)
googletest设置步骤(Netbeans为例) 下载googletest [https://github.com/google/googletest],解压到<gtest_dir> ...
- 【Mybatis】mybatis使用示例
BusinessAnalysisMapper.java import com.chinamobile.epic.dao.model.PerformanceMetricAnalysis; import ...
- 【推荐】asp.net 页面的生命周期
当一个页面请求发送到WEB服务器时,不论该事件是由页面提交还是由页面重定向而激发的,页面在其被创建到释放的过程中都会运行一系列的事件.一个ASP.NET页面从被创建到释放的过程包含10个事件. (1) ...