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日

相关文章

  • Scala方法与函数使用和定义详解

    Scala方法与函数使用和定义详解 简介 在Scala编程语言中,方法和函数都是非常重要的概念,也是广泛使用的编程语言要素。尽管两者看似非常相似,但是它们在写法和用法上还是存在一定的差异。本篇文章将详细讲解Scala中方法与函数的定义和使用。 方法 在Scala中,方法是指带有名称和参数的代码块,方法可以通过类或对象进行调用。Scala中的方法可以有返回值,…

    Java 2023年5月26日
    00
  • IE7浏览器窗口大小改变事件执行多次bug及IE6/IE7/IE8下resize问题

    为了解决IE7浏览器窗口大小改变事件执行多次的问题以及处理IE6/IE7/IE8下的resize问题,以下是完整的攻略手册: 问题描述 在IE7浏览器下,当浏览器窗口大小改变时,会出现改变事件被执行多次的情况,而且在IE6/IE7/IE8下使用resize事件时也会出现一些问题。 解决方案 针对上述问题,可以通过以下方法解决: debounce和thrott…

    Java 2023年6月15日
    00
  • JpaRepository如何实现增删改查并进行单元测试

    JpaRepository是Spring Data JPA中的一个接口,该接口为开发人员提供了一种简单的方式来实现增删改查等常见操作。下面是JpaRepository如何实现增删改查并进行单元测试的完整攻略。 1. 增加数据 JpaRepository提供了一个save()方法来保存一个实体对象。该方法可以用于添加数据。以下是示例代码: @Service p…

    Java 2023年5月20日
    00
  • Java语言的11大特点(Java初学者必知)

    Java语言的11大特点(Java初学者必知) Java作为一门流行度非常高的编程语言,在软件开发领域拥有着广泛的应用。它具有一些独特的特点,使它成为了开发人员的最爱。下面我们将介绍Java语言的11大特点。 1. 简单 Java语言的语法十分简单,易于学习和理解。它摒弃了其它编程语言中的复杂特性,比如指针和操作符重载,提供了更加简单明了的语法规则。 2. …

    Java 2023年5月23日
    00
  • asp.net开发微信公众平台之获取用户消息并处理

    我非常愿意为您讲解“asp.net开发微信公众平台之获取用户消息并处理”的完整攻略。 前置条件 在进行下面的步骤之前,您需要准备好以下前置条件: 一个搭建好的asp.net项目。 一个微信公众号。 在微信公众平台上获取到公众号的AppID和AppSecret。 安装WeChat SDK。 步骤1:获取微信服务器发送的消息 通过ASP.NET处理微信公众平台的…

    Java 2023年5月19日
    00
  • 如何在Android studio导入jdk9及以上版本中依赖包,如’rt.jar’,’ dt.jar’等

    1、如何获取jdk9及以上版本中依赖包,如’rt.jar’,’ dt.jar’等 ​ 在jdk9及后续版本中,jdk开始使用模块化规则,实现更好的封装和定义良好的接口,近一步加强了java的自由度,开发者可以定制化SDK ​ 包括rt.jar在内的依赖均已移除,以模块化形式更高效的存诸在 JAVA_HOME/jmods目录下 ​ 如果需要可以用命令进行抽取,…

    Java 2023年4月25日
    00
  • Java 内存溢出的原因和解决方法

    Java 内存溢出的原因和解决方法 Java 内存溢出是 Java 开发中常见的问题之一,当程序运行需要的内存超过了 JVM 分配给程序的内存时,就会发生内存溢出的问题。本文将详细介绍 Java 内存溢出的原因和解决方法,以及两个示例说明。 常见内存溢出的原因 1. 对象无法被合理的回收 在 Java 中,内存的回收是通过垃圾回收机制(GC)实现的。当对象引…

    Java 2023年5月26日
    00
  • 深入了解Java SpringBoot自动装配原理

    Java Spring Boot是一个非常流行的开发框架,它可以帮助开发者快速构建Web应用程序。其中一个重要的特性是自动装配,它可以帮助开发者自动配置应用程序的依赖项,从而简化应用程序的开发和部署。以下是深入了解Java Spring Boot自动装配原理的完整攻略: 自动装配原理 Java Spring Boot的自动装配原理基于Spring框架的依赖注…

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