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

 更新时间:2017年11月05日 14:44:38   作者:Homilier  
这篇文章主要为大家详细介绍了ListView实现聊天列表之处理不同数据项,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    通常我们用惯的ListView每一项的布局都是相同的,只是控件所绑定的数据不同。但单单只是如此并不能满足我们某些特殊需求,比如我们常见的QQ、微信的聊天列表,除了有左右之分外,内容更是有很大区别,有文字、语音、图片、视频等等,他们真的是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); 
  } 
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Android编程实现闹钟的方法详解

    Android编程实现闹钟的方法详解

    这篇文章主要介绍了Android编程实现闹钟的方法,结合实例形式较为详细的分析了Android闹钟的原理、布局、权限控制及相关实现技巧,需要的朋友可以参考下
    2017-02-02
  • Android升级支持库版本遇到的两个问题详解

    Android升级支持库版本遇到的两个问题详解

    安卓平台其中一个很牛逼的地方在于它支持各种不同的设备。从你的平板电脑,到你的手机,电视等,安卓无处不在。这篇文章主要给大家介绍了关于Android升级支持库版本遇到的两个问题,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-10-10
  • Android捕获点击事件范围的方法

    Android捕获点击事件范围的方法

    这篇文章主要为大家详细介绍了Android捕获点击事件范围的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • Fragment里添加ListView不要用ListFragment

    Fragment里添加ListView不要用ListFragment

    这篇文章主要介绍了Fragment里添加ListView不要用ListFragment,需要的朋友可以参考下
    2015-07-07
  • Kotlin设计模式之委托模式使用方法详解

    Kotlin设计模式之委托模式使用方法详解

    Kotlin提供了两个本机功能来实现委托模式,第一个是接口委托(例如策略模式),另一种是属性委托,它专注于类成员/属性(例如延迟加载、observable等),它们共同提供了一组丰富而简洁的功能,通过本博客,您将了解在什么情况下使用此模式
    2023-09-09
  • Android使用kotlin实现多行文本上下滚动播放

    Android使用kotlin实现多行文本上下滚动播放

    这篇文章主要为大家详细介绍了Android使用kotlin实现多行文本的上下滚动播放,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Android之复选框对话框用法实例分析

    Android之复选框对话框用法实例分析

    这篇文章主要介绍了Android之复选框对话框用法,涉及Android页面布局、对话框类等相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • Android对话框AlertDialog详解

    Android对话框AlertDialog详解

    本文详细讲解了Android对话框AlertDialog的实现方式,文中通过示例代码介绍的非常详细。对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • Android实现触摸移动的悬浮窗口功能

    Android实现触摸移动的悬浮窗口功能

    这篇文章主要介绍了Android实现触摸移动的悬浮窗口功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • 安装android开发环境原始版(windows版)

    安装android开发环境原始版(windows版)

    安装android开发环境原始版(windows版)的详细步骤
    2013-03-03

最新评论