一.最终成型图

二.主界面xml布局

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/activity_main"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical"

    >

    <ListView

        android:layout_width="match_parent"

        android:layout_height="0dp"

        android:id="@+id/msgList"

        android:layout_weight="1"

        android:divider="#0000"

        />

    <LinearLayout

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:orientation="horizontal">

        <EditText

            android:id="@+id/send_msg"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_weight="1"

            android:maxLines="2"

            android:hint="请输入内容"/>

        <Button

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="发送"

            android:id="@+id/send"

            android:onClick="btnClick"

            />

    </LinearLayout>

</LinearLayout>

  

三.Msg类:

public class Msg {

    public static final int TYPE_RECEIVED = 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;

    }

}

  

四.ListView 子项的布局,msg_item.xml:

<?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:padding="15dp">

    <LinearLayout

        android:id="@+id/left_layout"

        android:layout_height="wrap_content"

        android:layout_width="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_height="wrap_content"

        android:layout_width="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"

            android:textColor="#000000"/>

    </LinearLayout>

</LinearLayout>

  

五.ListView 的适配器类,让它继承自ArrayAdapter,并将泛型指定为Msg 类。新建类MsgAdapter,代码如下:

public class MsgAdapter extends ArrayAdapter<Msg> {

    private int resourceId;

    public MsgAdapter(Context context, int resource, List<Msg> objects) {

        super(context, resource, objects);

        resourceId = resource;

    }

    @NonNull

    @Override

    public View getView(int position, View convertView, ViewGroup parent) {

        View view;

        Msg msg = getItem(position);

        ViewHolder viewHolder;

        if( convertView == null ){

            view = LayoutInflater.from(getContext()).inflate(resourceId,null);

            viewHolder = new ViewHolder();

            viewHolder.left_layout = (LinearLayout)view.findViewById(R.id.left_layout);

            viewHolder.right_layout = (LinearLayout)view.findViewById(R.id.right_layout);

            viewHolder.left_msg = (TextView)view.findViewById(R.id.left_msg);

            viewHolder.right_msg = (TextView)view.findViewById(R.id.right_msg);

            view.setTag(viewHolder);

        }else{

            view = convertView;

            viewHolder = (ViewHolder)view.getTag();

        }

        if( msg.getType() == Msg.TYPE_RECEIVED ){

            viewHolder.left_layout.setVisibility(View.VISIBLE);

            viewHolder.right_layout.setVisibility(View.GONE);

            viewHolder.left_msg.setText(msg.getContent());

        }else{

            viewHolder.left_layout.setVisibility(View.GONE);

            viewHolder.right_layout.setVisibility(View.VISIBLE);

            viewHolder.right_msg.setText(msg.getContent());

        }

        return view;

    }

    class ViewHolder{

        LinearLayout left_layout;

        LinearLayout right_layout;

        TextView left_msg;

        TextView right_msg;

    };

}

  

六.修改MainActivity 中的代码,来为ListView 初始化一些数据,并给发送按钮加入事件响应

public class MainActivity extends Activity {

    private List<Msg> msgList = new ArrayList<Msg>();

    private MsgAdapter msgAdapter;

    private ListView listView;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        initList();

        listView = (ListView)findViewById(R.id.msgList);

        msgAdapter = new MsgAdapter(MainActivity.this,

                R.layout.msg_item,

                msgList);

        listView.setAdapter(msgAdapter);

    }

    protected void btnClick(View view){

        if( view.getId() == R.id.send ){

            EditText send_msg = (EditText)findViewById(R.id.send_msg);

            String message = send_msg.getText().toString().trim();

            if( message.length() >0 ){

                Msg msg = new Msg(message, Msg.TYPE_SEND);

                msgList.add(msg);

                msgAdapter.notifyDataSetChanged();

                listView.setSelection(msgList.size());

                send_msg.setText("");

            }

        }

    }

    private  void initList(){

        Msg msg;

        msg = new Msg("你好啊,朋友", 0);

        msgList.add(msg);

        msg = new Msg("我很好", 1);

        msgList.add(msg);

        msg = new Msg("what are you doing?", 0);

        msgList.add(msg);

    }

}

  

ListView:聊天界面的更多相关文章

  1. 自定义一个ListView实现聊天界面

    摘要 ListView可以称得上Android中最常用也最难用的控件了,几乎所有的应用程序都会用到它.由于手机屏幕空间都比较有限,能够一次性在屏幕上显示的内容并不多,当我们的程序中有大量的数据需要展示 ...

  2. Android—简单的仿QQ聊天界面

    最近仿照QQ聊天做了一个类似界面,先看下界面组成(画面不太美凑合凑合呗,,,,):

  3. Android学习笔记(十二)——实战:制作一个聊天界面

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 运用简单的布局知识,我们可以来尝试制作一个聊天界面. 一.制作 Nine-Patch 图片 : Nine-Pa ...

  4. 自定义android精美聊天界面

    编写精美聊天界面,那就肯定要有收到的消息和发送的消息. 首先还是编写主界面,修改activity_chat.xml中的代码,如下所示: <?xml version="1.0" ...

  5. 高仿qq聊天界面

    高仿qq聊天界面,给有需要的人,界面效果如下: 真心觉得做界面非常痛苦,给有需要的朋友. chat.xml <?xml version="1.0" encoding=&quo ...

  6. Android开发学习之路--UI之简单聊天界面

    学了很多的ui的知识,这里就来实现个聊天的界面,首先来实现个layout的xml,代码如下: <?xml version="1.0" encoding="utf-8 ...

  7. RecyclerView 作为聊天界面,被键盘遮挡的解决办法

    最近项目在重构,使用 RecyclerView 替换了 ListView 作为 IM 的聊天界面.然后遇到了一个问题就是当键盘弹出来的时候,键盘会遮挡住 RecyclerView 的一部分,造成聊天内 ...

  8. RV 多样式 MultiType 聊天界面 消息类型 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  9. android 仿微信聊天界面,以及语音录制功能

    extends:http://104zz.iteye.com/blog/1709840 本例为模仿微信聊天界面UI设计,文字发送以及语言录制UI. 1先看效果图:     第一:chat.xml设计 ...

随机推荐

  1. 一种机制,与js类似

    我们知道,当两个条件进行逻辑与操作的时候,其中任何一个条件为假,则表达式的结果为假.所以,遇到(A 且 B)这种表达式,如果A为假的话,B是不是真假都无所谓了,当遇到一个假条件的时候,程序也就没有必要 ...

  2. 走近Docker

    一个容器实际上就是运行在宿主机上的一个进程,这个进程以及子进程会认为自己运行在一个独立的世界里. Docker相对于其他虚拟化技术的优势在于:创建.删除容器速度快,容器运行占用开销非常小.而相对于其他 ...

  3. bananahill(NOIP模拟赛Round 8)

    题目描述 香蕉川由座香蕉山组成,第i座山有它的高度.小Z准备从左到右爬这里的恰好座香蕉山,但他不希望山的高度起伏太大,太过颠簸,会让本就体育不好的他过于劳累.所以他定义了爬山的劳累度是所有爬的相邻的两 ...

  4. 在vc6里头文件sys/timeb.h里struct timeb各变量的具体含义?

    timeb的定义:struct _timeb{         time_t time;          unsigned short millitm;          short timezon ...

  5. Android视频压缩并且上传

    一,做视频上传首先第一步要从相册里选取视频,这一步.我的上篇博客中已经讲过了. protected void onActivityResult(int requestCode, int resultC ...

  6. 16aspx源码要求安装.csproj类型怎么安装

    更改打开方式(不要双击打开),右键项目-打开方式选VS打开(应该会出现一个转换界面,转换下就好了).如果没有出那个界面我也没办法了

  7. Go的50坑:新Golang开发者要注意的陷阱、技巧和常见错误[2]

    初级篇 开大括号不能放在单独的一行 未使用的变量 未使用的Imports 简式的变量声明仅可以在函数内部使用 使用简式声明重复声明变量 偶然的变量隐藏Accidental Variable Shado ...

  8. eleasticsearch重要配置

    elasticsearch重要配置=====================================日志和数据目录-----------------path:    logs: /var/lo ...

  9. Codeforces Round #325 (Div. 2) Phillip and Trains dp

    原题连接:http://codeforces.com/contest/586/problem/D 题意: 就大家都玩过地铁奔跑这个游戏(我没玩过),然后给你个当前的地铁的状况,让你判断人是否能够出去. ...

  10. iOS Undefined symbols for architecture arm64解决办法

    Undefined symbols for architecture arm64:  "_OBJC_CLASS_$_YYCache", referenced from:      ...