使用RecyclerView来完成聊天对话框
2017-01-23 11:05
190 查看
聊天记录信息类,该类中2个成员变量聊天内容content和信息来源type
定义一个适配器用于RecyclerView数据适配,根据信息来源不同,选择性显示聊天记录信息
recyclerView项目内容的布局文件,包含一个左边的聊天记录和右边的聊天记录
项目的布局文件,布局文件中有一个recyclerView、EditText和一个Button用于信息发送触发事件
MainActivity活动内的代码代码如下
数据集更改后,通知适配器有更改,并且将RecyclerView的滚动条滑到最后一个元素
public class Msg { public static final int TYPE_RECEIVE = 0; public static final int TYPE_SEND = 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数据适配,根据信息来源不同,选择性显示聊天记录信息
/** * Created by Xiongxl on 2016/12/20. */ public class MsgAdapter extends RecyclerView.Adapter<MsgAdapter.ViewHolder> { List<Msg> msgList; @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.msg_item, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(ViewHolder holder, int position) { Msg msg = msgList.get(position); if (msg.getType() == Msg.TYPE_RECEIVE) { holder.leftLayout.setVisibility(View.VISIBLE); holder.rightLayout.setVisibility(View.GONE); holder.leftMsg.setText(msg.getContent()); } else if (msg.getType() == Msg.TYPE_SEND) { holder.rightLayout.setVisibility(View.VISIBLE); f079 holder.leftLayout.setVisibility(View.GONE); holder.rightMsg.setText(msg.getContent()); } } public MsgAdapter(List<Msg> msgs) { this.msgList = msgs; } @Override public int getItemCount() { return msgList.size(); } static class ViewHolder extends RecyclerView.ViewHolder { LinearLayout leftLayout; LinearLayout rightLayout; TextView leftMsg; TextView rightMsg; ViewHolder(View view) { super(view); leftLayout = (LinearLayout) view.findViewById(R.id.left_layout); rightLayout = (LinearLayout) view.findViewById(R.id.right_layout); leftMsg = (TextView) view.findViewById(R.id.left_msg); rightMsg = (TextView) view.findViewById(R.id.right_msg); } } }
recyclerView项目内容的布局文件,包含一个左边的聊天记录和右边的聊天记录
<?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="wrap_content" android:orientation="vertical"> <LinearLayout android:id="@+id/left_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="left" android:background="@drawable/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"/> </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:layout_margin="10dp"/> </LinearLayout> </LinearLayout>
项目的布局文件,布局文件中有一个recyclerView、EditText和一个Button用于信息发送触发事件
<?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="match_parent" android:orientation="vertical" android:background="#d8e0e8"> <android.support.v7.widget.RecyclerView android:id="@+id/msg_recyclerView" 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/input_text" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:hint="Type something here" android:maxLines="2"/> <Button android:id="@+id/btnSend" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Send"/> </LinearLayout> </LinearLayout>
MainActivity活动内的代码代码如下
public class MainActivity extends AppCompatActivity { List<Msg> msgList = new ArrayList<>(); EditText inputText; Button btnSend; RecyclerView recyclerView; private MsgAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initMsg(); btnSend = (Button) this.findViewById(R.id.btnSend); inputText = (EditText) this.findViewById(R.id.input_text); recyclerView = (RecyclerView) this.findViewById(R.id.msg_recyclerView); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(linearLayoutManager); adapter = new MsgAdapter(msgList); recyclerView.setAdapter(adapter); btnSend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String content = inputText.getText().toString().trim(); if (!content.equals("")) { msgList.add(new Msg(content, Msg.TYPE_SEND)); adapter.notifyItemInserted(msgList.size() - 1); recyclerView.scrollToPosition(msgList.size() - 1); inputText.setText(""); } } }); } private void initMsg() { Msg msg1 = new Msg("hello sealong", Msg.TYPE_RECEIVE); msgList.add(msg1); Msg msg2 = new Msg("hello peipei", Msg.TYPE_SEND); msgList.add(msg2); Msg msg = new Msg("What are you doing", Msg.TYPE_RECEIVE); msgList.add(msg); } }
数据集更改后,通知适配器有更改,并且将RecyclerView的滚动条滑到最后一个元素
adapter.notifyItemInserted(msgList.size() - 1); recyclerView.scrollToPosition(msgList.size() - 1);
相关文章推荐
- 使用RecyclerView完成聊天界面以及消息的更新
- 聊天记录,踩的坑:设置EditText焦点;EditText软键盘和recyclerview的交互;SpannableStringBuilder的使用;ClickableSpan失效;软键盘挡住edi
- Android创建自定义视图列表对话框(数据库中的数据作为数据源,使用RecyclerView作为列表)
- 使用RecyclerView编写聊天界面及demo
- 使用sticky-headers-recyclerview 完成 recyclerview粘性头部
- 基于RecyclerView实现的仿微信聊天界面,item长按根据触摸位置弹出对话框
- 使用RecyclerView实现聊天界面
- 使用RecyclerView实现简单的聊天页面
- 聊天界面 使用listview和recyclerview
- MC view 在对话框的使用方法
- Android使用自定义对话框报错:The specified child already has a parent. You must call removeView() on the...
- 对话框项目集成完成,定时器 OnTimer使用顺利
- 用TableView实现聊天对话框
- MFC学习笔记--将对话框收获的输入在View中使用
- MFC对话框当中使用View视图
- Android使用自定义对话框报错:The specified child already has a parent. You must call removeView() on the...
- 自动完成可编辑文本AutoCompleteTextView的使用
- 最近在使用MyEclipse的SVN插件时总是弹出一个大大的对话框,报一个Failed to load JavaHL Library.错误 [java] view plaincopy Failed
- 使用SurfaceView完成地图无缝拼接
- 使用ViewStub和自定义ListView完成的小功能