Android ListView自定义Adapter实现仿QQ界面

下面是详细讲解“Android ListView自定义Adapter实现仿QQ界面”的完整攻略。

简介

在Android开发中,ListView是常见的视图控件之一,用来展示一系列的元素。而自定义Adapter可以让我们更加灵活地设置ListView中的每一个Item的布局和内容。本文将介绍如何使用自定义Adapter,实现具有聊天界面中消息气泡特效的QQ界面。

步骤

步骤一:准备布局文件

我们先来创建聊天气泡的布局文件,包括左右两种对话框样式,并用drawable文件分别设置对话框的背景。其中,左对话框样式设置在left_chat_layout.xml中,右对话框样式设置在right_chat_layout.xml中,示例如下:

<!--left_chat_layout.xml-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:background="@drawable/left_chat_bg"
    android:orientation="horizontal"
    android:padding="10dp" >
    <TextView
        android:id="@+id/left_msg_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@android:color/white" />
</LinearLayout>

<!--right_chat_layout.xml-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:background="@drawable/right_chat_bg"
    android:layout_gravity="end"
    android:orientation="horizontal"
    android:padding="10dp" >
    <TextView
        android:id="@+id/right_msg_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@android:color/white" />
</LinearLayout>

步骤二:创建自定义Adapter

接下来我们需要将上面这两个布局作为ListView的Item使用。我们可以通过继承BaseAdapter或ArrayAdapter来实现自定义Adapter,这里我们选择继承BaseAdapter。

public class ChatListAdapter extends BaseAdapter {
    private List<ChatMessage> chatMsgList;
    private LayoutInflater inflater;

    public ChatListAdapter(Context context, List<ChatMessage> msgList) {
        this.chatMsgList = msgList;
        this.inflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return chatMsgList.size();
    }

    @Override
    public Object getItem(int position) {
        return chatMsgList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ChatMessage chatMsg = chatMsgList.get(position);
        ViewHolder viewHolder = null;
        if(convertView == null) { // 没有缓存的view
            viewHolder = new ViewHolder();
            if(chatMsg.isComMeg()) { // 根据是否是对方消息来显示不同的item布局
                convertView = inflater.inflate(R.layout.left_chat_layout, null);
                viewHolder.msgTv = convertView.findViewById(R.id.left_msg_tv);
            } else {
                convertView = inflater.inflate(R.layout.right_chat_layout, null);
                viewHolder.msgTv = convertView.findViewById(R.id.right_msg_tv);
            }
            convertView.setTag(viewHolder); // 缓存viewHolder对象
        } else { // 有缓存的view,直接取出缓存的viewHolder对象
            viewHolder = (ViewHolder)convertView.getTag();
        }

        viewHolder.msgTv.setText(chatMsg.getMsg()); // 设置消息内容

        return convertView;
    }

    class ViewHolder {
        public TextView msgTv;
    }
}

步骤三:设置ListView的Adapter

最后一步是将Adapter与ListView关联起来:

ListView chatListView = findViewById(R.id.lv_chat);
List<ChatMessage> msgList = initChatMsgList(); // 从服务器读取聊天消息列表
ChatListAdapter adapter = new ChatListAdapter(this, msgList);
chatListView.setAdapter(adapter);

这样,我们就完成了一个仿QQ聊天界面的ListView自定义Adapter实现。

示例说明

示例一:在Activity中使用ListView

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView chatListView = findViewById(R.id.lv_chat);
        List<ChatMessage> msgList = initChatMsgList(); // 从服务器读取聊天消息列表
        ChatListAdapter adapter = new ChatListAdapter(this, msgList);
        chatListView.setAdapter(adapter);
    }

    // 初始化消息列表
    private List<ChatMessage> initChatMsgList() {
        List<ChatMessage> msgList = new ArrayList<>();
        msgList.add(new ChatMessage(true, "你好,很高兴见到你!"));
        msgList.add(new ChatMessage(false, "同样很高兴见到你!"));
        return msgList;
    }
}

示例二:在Fragment中使用ListView

public class ChatFragment extends Fragment {
    private ListView chatListView;
    private ChatListAdapter adapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_chat, container, false);
        chatListView = view.findViewById(R.id.lv_chat);
        return view;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        List<ChatMessage> msgList = initChatMsgList(); // 从服务器读取聊天消息列表
        adapter = new ChatListAdapter(getActivity(), msgList);
        chatListView.setAdapter(adapter);
    }

    // 初始化消息列表
    private List<ChatMessage> initChatMsgList() { ... }
}

以上就是“Android ListView自定义Adapter实现仿QQ界面”的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android ListView自定义Adapter实现仿QQ界面 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • Spring Security登陆流程讲解

    关于“Spring Security登陆流程讲解”的完整攻略,我会从以下几个方面进行详细讲解。 1. 流程概述 Spring Security是一个基于Spring框架的安全框架,它提供了诸如身份认证、授权、攻击防护等基础的安全功能,并且可对这些功能进行灵活的配置和定制。下面是Spring Security的登陆流程概述: 用户在前端输入用户名和密码并提交表…

    Java 2023年5月20日
    00
  • 【SSM】一、了解Sping 框架

    〇、Maven 0.1 什么是Maven? Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project’s build…

    Java 2023年4月25日
    00
  • 一文带你弄懂Java中线程池的原理

    一文带你弄懂Java中线程池的原理 线程池的概念 线程池是指一组预先创建好的线程,可以被程序反复使用,用于执行多个任务。线程池的好处在于可以管理线程数量、重用线程以及减少线程创建和销毁的开销。 在Java中,线程池相关的类都位于java.util.concurrent包中。 线程池的组成 线程池主要由以下几个组成部分: 线程池管理器(ThreadPoolEx…

    Java 2023年5月19日
    00
  • Java时间处理第三方包Joda Time使用详解

    Java时间处理第三方包Joda Time使用详解 Joda Time简介 Joda Time是一个Java日期和时间处理的第三方包,它能够提供更加简便易用且功能更加强大的日期和时间处理功能,相较于Java内置的Date和Calendar类而言,Joda Time最大的优势在于它的API设计非常简洁易懂,同时还提供了大量的日期和时间处理功能。 Joda Ti…

    Java 2023年5月20日
    00
  • Mybatis拦截器实现自定义需求

    下面我将详细讲解Mybatis拦截器实现自定义需求的攻略: 什么是Mybatis拦截器? Mybatis拦截器是一个在Mybatis执行核心代码,解析SQL语句和执行SQL语句的过程中可以自定义添加一些拦截和处理的类。它可以实现在执行一条SQL语句前后增加一些处理逻辑,比如动态改变SQL语句、增加数据缓存和日志记录等功能。 如何实现Mybatis拦截器? 在…

    Java 2023年6月15日
    00
  • Springboot 整合maven插口调用maven release plugin实现一键打包功能

    下面是详细的Spring Boot整合Maven插件调用Maven Release Plugin实现一键打包功能的攻略: 1. 确定依赖和插件 首先确保在pom.xml文件中引入了Maven Release Plugin和Maven Deploy Plugin: <project> <build> <plugins> &l…

    Java 2023年6月2日
    00
  • 小程序实现授权登陆的解决方案

    小程序实现授权登录的解决方案是比较复杂的,需要涉及到小程序端和服务端两个方面。在授权登录的过程中,小程序端需要获取用户的授权信息,并将授权信息发送给服务端进行校验,服务端校验成功之后再将返回的用户信息返回给小程序端。以下是实现授权登录的完整攻略: 步骤一:获取用户授权 在小程序中调用 wx.login() 方法获取 code,这个 code 会在后续用来获取…

    Java 2023年5月23日
    00
  • 基于Java 谈回调函数

    下面为您详细讲解基于Java的回调函数。 什么是回调函数? 回调函数是一种常用的编程模式,在代码执行某些操作时,它可以将函数指针作为参数传入另一个函数中,并在操作完成后调用该函数指针,以防止程序阻塞等问题。 Java如何实现回调函数? 在Java中,回调函数可以使用接口来实现。一个接口类似于一个约定,它规定了方法的名称和类型,但是不提供方法的实现。一个实现接…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部