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

ListView实现聊天列表之处理不同数据项,第1张

概述   通常我们用惯的ListView每一项的布局都是相同的,只是控件所绑定的数据不同。但单单只是如此并不能满足我们某些特殊需求,比如我们常见的QQ、微信的聊天列表,除了有左右之分外,内容更是有很大区

    通常我们用惯的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);   } } 

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

总结

以上是内存溢出为你收集整理的ListView实现聊天列表之处理不同数据项全部内容,希望文章能够帮你解决ListView实现聊天列表之处理不同数据项所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1143876.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存