ListView实现聊天列表之处理不同数据项

作者:Homilier 时间:2022-07-01 01:06:58 

    通常我们用惯的ListView每一项的布局都是相同的,只是控件所绑定的数据不同。但单单只是如此并不能满足我们某些特殊需求,比如我们常见的QQ、微信的聊天列表,除了有左右之分外,内容更是有很大区别,有文字、语音、图片、视频等等,他们真的是ListView可以实现的吗?答案是肯定的,只要我们做一下类型区别即可。

实现效果如下所示:

ListView实现聊天列表之处理不同数据项

    大家不要在意布局,这里为了方便就随意了。大家可以看到,这里有两种布局,一种头像在左,一种头像在右,虽然这是一种简单的情况,但我们只需要了解其中的原理,再复杂的情况都可以迎刃而解。
我们只要将每一种布局划为一种类型进行区分,根据我们所区分的类型在我们自定义的Adapter中加载不同布局即可,代码如下所示:


if (bean.getType() == 1) {
     convertView = mInflater.inflate(R.layout.item_chat_left, null);
     holder.mIvAvatar = (ImageView) convertView.findViewById(R.id.iv_chatLeftItem_avatar);
     holder.mTvContent = (TextView) convertView.findViewById(R.id.tv_chatLeftItem_content);
 } else if (bean.getType() == 2) {
     convertView = mInflater.inflate(R.layout.item_chat_right, null);
     holder.mIvAvatar = (ImageView) convertView.findViewById(R.id.iv_chatRightItem_avatar);
     holder.mTvContent = (TextView) convertView.findViewById(R.id.tv_chatRightItem_content);
 }

是不是发现很简单,最后,我再将所有代码一同贴出来。

item_chat_left.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="6dp" >

<ImageView
   android:id="@+id/iv_chatLeftItem_avatar"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:background="#dd00f0"
   android:src="@drawable/ic_launcher" />

<TextView
   android:id="@+id/tv_chatLeftItem_content"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:textSize="16sp"
   android:padding="16dp"
   android:layout_toRightOf="@id/iv_chatLeftItem_avatar"
   android:background="@drawable/qfav_list_bubble_nor"
   android:layout_marginRight="64dp"
   android:gravity="center_vertical" />

</RelativeLayout>

item_chat_right.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="6dp" >

<ImageView
   android:id="@+id/iv_chatRightItem_avatar"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_alignParentRight="true"
   android:background="#ddf000"
   android:src="@drawable/ic_launcher" />

<TextView
   android:id="@+id/tv_chatRightItem_content"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:textSize="16sp"
   android:padding="16dp"
   android:layout_toLeftOf="@id/iv_chatRightItem_avatar"
   android:background="@drawable/skin_aio_user_bubble_pressed"
   android:layout_marginLeft="64dp"
   android:gravity="center_vertical" />

</RelativeLayout>

activity_chat.xml


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context="${relativePackage}.${activityClass}" >

<ListView
   android:id="@+id/lv_content"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:scrollbars="none"
   android:divider="@null"
   android:listSelector="@android:color/transparent" >
 </ListView>

</RelativeLayout>

ChatItemBean.java


import android.graphics.Bitmap;

public class ChatItemBean {
 private int type;
 private String content;
 private Bitmap avatar;
 public int getType() {
   return type;
 }
 public void setType(int type) {
   this.type = type;
 }
 public String getContent() {
   return content;
 }
 public void setContent(String content) {
   this.content = content;
 }
 public Bitmap getAvatar() {
   return avatar;
 }
 public void setAvatar(Bitmap avatar) {
   this.avatar = avatar;
 }
}

ChatLVAdapter.java


import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class ChatLVAdapter extends BaseAdapter {

private List<ChatItemBean> mDatas;
 private LayoutInflater mInflater;

public ChatLVAdapter(Context context, List<ChatItemBean> datas) {
   this.mInflater = LayoutInflater.from(context);
   this.mDatas = datas;
 }

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

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

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

@Override
 public View getView(int position, View convertView, ViewGroup parent) {
   ViewHolder holder = null;
   ChatItemBean bean = mDatas.get(position);
   if (convertView == null) {
     holder = new ViewHolder();
     if (bean.getType() == 1) {
       convertView = mInflater.inflate(R.layout.item_chat_left, null);
       holder.mIvAvatar = (ImageView) convertView.findViewById(R.id.iv_chatLeftItem_avatar);
       holder.mTvContent = (TextView) convertView.findViewById(R.id.tv_chatLeftItem_content);
     } else if (bean.getType() == 2) {
       convertView = mInflater.inflate(R.layout.item_chat_right, null);
       holder.mIvAvatar = (ImageView) convertView.findViewById(R.id.iv_chatRightItem_avatar);
       holder.mTvContent = (TextView) convertView.findViewById(R.id.tv_chatRightItem_content);
     }
     convertView.setTag(holder);
   } else { // 通过tag找到缓存的布局
     holder = (ViewHolder) convertView.getTag();
   }
   holder.mIvAvatar.setImageBitmap(bean.getAvatar());
   holder.mTvContent.setText(bean.getContent());

return convertView;
 }

public final class ViewHolder {
   public ImageView mIvAvatar;
   public TextView mTvContent;
 }

ChatActivity.java


import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ListView;

public class ChatActivity extends Activity {
 private ListView mLv;
 private List<ChatItemBean> mDatas ;
 private ChatLVAdapter mAdapter;

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

mLv = (ListView) findViewById(R.id.lv_content);

initData();
   mAdapter = new ChatLVAdapter(this, mDatas);
   mLv.setAdapter(mAdapter);
 }

private void initData() {
   mDatas = new ArrayList<ChatItemBean>();
   ChatItemBean chat1 = new ChatItemBean();
   chat1.setType(1);
   chat1.setContent("早啊!");
   chat1.setAvatar(BitmapFactory.decodeResource(getResources(), R.drawable.ic_item1));
   mDatas.add(chat1);
   ChatItemBean chat2 = new ChatItemBean();
   chat2.setType(2);
   chat2.setContent("早!一大早找我有啥事?");
   chat2.setAvatar(BitmapFactory.decodeResource(getResources(), R.drawable.ic_item2));
   mDatas.add(chat2);
   ChatItemBean chat3 = new ChatItemBean();
   chat3.setType(1);
   chat3.setContent("没事就不能找你谈情说爱吗?也没什么事,看你有没有在撸代码。");
   chat3.setAvatar(BitmapFactory.decodeResource(getResources(), R.drawable.ic_item1));
   mDatas.add(chat3);
   ChatItemBean chat4 = new ChatItemBean();
   chat4.setType(2);
   chat4.setContent("算了吧,别找我!我害怕。");
   chat4.setAvatar(BitmapFactory.decodeResource(getResources(), R.drawable.ic_item2));
   mDatas.add(chat4);
   ChatItemBean chat5 = new ChatItemBean();
   chat5.setType(2);
   chat5.setContent("都被代码撸惨了,我哪敢一早起来找虐。");
   chat5.setAvatar(BitmapFactory.decodeResource(getResources(), R.drawable.ic_item2));
   mDatas.add(chat5);
 }
}

来源:http://blog.csdn.net/Honiler/article/details/78292117

标签:ListView,聊天列表
0
投稿

猜你喜欢

  • Android开发gradle拉取依赖的加速配置

    2023-05-31 03:16:08
  • Android使用Service实现简单音乐播放实例

    2023-11-30 20:03:23
  • java中如何获取相关参数

    2023-11-17 20:12:39
  • redisson分布式限流RRateLimiter源码解析

    2021-05-29 13:10:15
  • c#继承与多态使用示例

    2021-11-24 16:48:33
  • 为什么wait和notify必须放在synchronized中使用

    2022-07-20 07:32:39
  • C#学习教程之Socket的简单使用

    2022-09-07 18:15:04
  • Java Swing实现坦克大战游戏

    2021-12-16 21:04:03
  • Spring注解驱动之BeanDefinitionRegistryPostProcessor原理解析

    2023-11-24 23:24:21
  • shiro整合springboot前后端分离

    2022-02-22 10:40:31
  • Android Studio3.0新特性及安装图文教程

    2021-06-21 02:11:48
  • java数据类型与二进制详细介绍

    2021-07-28 19:04:38
  • Android音乐播放器制作 加入控制台(三)

    2022-04-15 05:09:30
  • IDEA中配置文件模板的添加方法

    2023-10-28 17:52:31
  • C#实现简单屏幕监控的方法

    2023-07-31 10:29:25
  • java开发就业信息管理系统

    2022-06-19 02:09:30
  • java的内部类和外部类用法讲解

    2022-10-18 21:14:41
  • springboot集成opencv实现人脸识别功能的详细步骤

    2023-10-07 00:38:22
  • WPF实现控件拖动的示例代码

    2023-04-01 09:36:15
  • 浅谈Java中各种修饰符与访问修饰符的说明

    2022-10-07 00:49:52
  • asp之家 软件编程 m.aspxhome.com