这篇文章主要为大家详细介绍了 android Listview 模拟聊天界面的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Android 是一种基于 Linux 的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由 Google 公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用 "安卓" 或 "安致"。
效果图:
实现代码:
- package com.itheima74.chatui;
- import android.os.Bundle;
- import android.support.v7.app.AppCompatActivity;
- 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 java.util.ArrayList;
- /**
- * 聊天界面,使用recyclerview实现
- * 效果不好,发送的消息不能靠右对齐,
- * 不知何故,怎么弄都弄不好,请教!
- * 问题的解决:用Relativelayout代替linearlayout可以解决上述问题
- */
- public class MainActivity extends AppCompatActivity {
- private RecyclerView recyclerview;
- private EditText et_input;
- private ArrayList<Msg> mMsgList;
- private MsgAdapter mMsgAdapter;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- initView();
- initData();
- initAdapter();
- }
- private void initAdapter() {
- mMsgAdapter = new MsgAdapter(mMsgList);
- recyclerview.setAdapter(mMsgAdapter);
- }
- /**
- * 初始化数据源
- */
- private void initData() {
- mMsgList = new ArrayList<>();
- mMsgList.add(new Msg("Hello!", Msg.TYPE_RECEIVE));
- mMsgList.add(new Msg("Hello! Who is that?", Msg.TYPE_SEND));
- mMsgList.add(new Msg("This is Jack,Nice to meet you!", Msg.TYPE_RECEIVE));
- }
- /**
- * 初始化控件
- */
- private void initView() {
- recyclerview = (RecyclerView) findViewById(R.id.recyclerview);
- et_input = (EditText) findViewById(R.id.et_input);
- Button bt_send = (Button) findViewById(R.id.bt_send);
- LinearLayoutManager layoutManager = new LinearLayoutManager(this);
- layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
- recyclerview.setLayoutManager(layoutManager);
- bt_send.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- String content = et_input.getText().toString().trim();
- // 如果用户没有输入,则是一个空串""
- if (!content.isEmpty()) {
- mMsgList.add(new Msg(content, Msg.TYPE_SEND));
- // 通知数据适配器刷新界面
- mMsgAdapter.notifyDataSetChanged();
- // 定位到最后一行
- recyclerview.scrollToPosition(mMsgList.size() - 1);
- // 输入框置空
- et_input.setText("");
- }
- }
- });
- }
- }
- <?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:background="#d8e0e8"
- android:orientation="vertical">
- <android.support.v7.widget.RecyclerView
- android:id="@+id/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"
- android:orientation="horizontal">
- <EditText
- android:id="@+id/et_input"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:hint="请输入要发送的内容" />
- <Button
- android:id="@+id/bt_send"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="发送" />
- </LinearLayout>
- </LinearLayout>
- package com.itheima74.chatui;
- /**
- * Created by My on 2017/3/3.
- */
- class Msg {
- static final int TYPE_RECEIVE = 1;
- static final int TYPE_SEND = 2;
- String content;
- int type;
- Msg(String content, int type) {
- this.content = content;
- this.type = type;
- }
- }
- package com.itheima74.chatui;
- import android.support.v7.widget.RecyclerView;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.TextView;
- import java.util.ArrayList;
- /**
- * Created by My on 2017/3/3.
- */
- class MsgAdapter extends RecyclerView.Adapter<MsgAdapter.ViewHolder> {
- private ArrayList<Msg> mMsgList;
- MsgAdapter(ArrayList<Msg> mMsgList) {
- this.mMsgList = mMsgList;
- }
- @Override
- public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- View view = View.inflate(parent.getContext(), R.layout.recyclerview_item, null);
- return new ViewHolder(view);
- }
- @Override
- public void onBindViewHolder(ViewHolder holder, int position) {
- Msg msg = mMsgList.get(position);
- if (msg.type == Msg.TYPE_RECEIVE) {
- holder.tv_receive.setVisibility(View.VISIBLE);
- holder.tv_send.setVisibility(View.GONE);
- holder.tv_receive.setText(msg.content);
- } else {
- holder.tv_send.setVisibility(View.VISIBLE);
- holder.tv_receive.setVisibility(View.GONE);
- holder.tv_send.setText(msg.content);
- }
- }
- @Override
- public int getItemCount() {
- return mMsgList.size();
- }
- static class ViewHolder extends RecyclerView.ViewHolder {
- private TextView tv_receive;
- private TextView tv_send;
- ViewHolder(View itemView) {
- super(itemView);
- tv_receive = (TextView) itemView.findViewById(R.id.tv_receive);
- tv_send = (TextView) itemView.findViewById(R.id.tv_send);
- }
- }
- }
xml:
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:padding="10dp">
- <TextView
- android:id="@+id/tv_receive"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:background="@drawable/message_left"
- android:gravity="center"
- android:text="who?"
- android:textSize="20sp" />
- <TextView
- android:id="@+id/tv_send"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_below="@id/tv_receive"
- android:background="@drawable/message_right"
- android:gravity="center"
- android:text="i am your father"
- android:textSize="20sp" />
- </RelativeLayout>
来源: http://www.phperz.com/article/17/0320/326162.html