ListView实现聊天框

本文将详细介绍如何在Android中使用ListView组件来实现一个聊天界面。通过自定义适配器、设置不同布局来展示发送和接收的消息,以及优化滚动性能等技巧,让你轻松创建出功能完善的聊天应用。
摘要由CSDN通过智能技术生成


/*
模仿IM聊天布局

 */
public class ChatActivity extends AppCompatActivity {

    private ListView mListView;
    //自定义聊天信息类
    List<ChatMessage> mChatMessages = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mListView = (ListView) findViewById(R.id.list_view_demo);
        //聊天信息
        ChatMessage chatMessage = new ChatMessage(1, 2, "刘小明", "8:20", "你好吗", "", "", true);
        ChatMessage chatMessage2 = new ChatMessage(2, 1, "小军", "8:21", "我很好", "", "", false);
        ChatMessage chatMessage3 = new ChatMessage(1, 2, "刘小明", "8:22", "今天天气怎么样", "", "", true);
        ChatMessage chatMessage4 = new ChatMessage(2, 1, "小军", "8:23", "热成狗了", "", "", false);

        mChatMessages.add(chatMessage);
        mChatMessages.add(chatMessage2);
        mChatMessages.add(chatMessage3);
        mChatMessages.add(chatMessage4);

        //匹配适配器
        mListView.setAdapter(new ChatMessageAdapter(this, mChatMessages));
    }

    //聊天信息适配器
    public static class ChatMessageAdapter extends BaseAdapter {

        //区分信息类型来区分是对方还是自己发的消息
        public interface IMessageViewType {
            int COM_MESSAGE = 0;
            int TO_MESSAGE = 1;
        }

        private List<ChatMessage> mChatMessages;
        private LayoutInflater mInflater;

        //适配器构造函数
        public ChatMessageAdapter(Context context, List<ChatMessage> coll) {
            this.mChatMessages = coll;
            mInflater = LayoutInflater.from(context);//加载布局资源
        }

        //返回ListView中要显示的子View数量,也就是下载任务数,只要返回构造方法中的list的条目就可以了
        public int getCount() {
            return mChatMessages.size();
        }

        //返回一个子View,即ListView中的一个子条目,当然你也可以自定义返回你想要的信息
        public Object getItem(int position) {
            return mChatMessages.get(position);
        }

        //根据ListView中的位置返回id
        public long getItemId(int position) {
            return position;
        }

        //获取项目视图类型(左or右气泡)
        public int getItemViewType(int position) {
            ChatMessage entity = mChatMessages.get(position);//实体
            //取类型
            if (entity.getMsgType()) {
                return IMessageViewType.COM_MESSAGE;//返回接口中定义的常量 0
            } else {
                return IMessageViewType.TO_MESSAGE;//  1
            }

        }

        //获取视图类型的数量
        public int getViewTypeCount() {
            return 2;
        }

        //返回这个条目的整个信息,它是一个单独的布局文件
        public View getView(int position, View convertView, ViewGroup parent) {

            final ChatMessage entity = mChatMessages.get(position);
            boolean isComMsg = entity.getMsgType();//用于判断

            ViewHolder viewHolder;
            if (convertView == null) {
                //先判断再解析对应布局文件资源到convertView
                if (isComMsg) {
                    //如果is come message 是true,则是对方发送的消息,显示是左气泡
                    convertVi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值