对RecycleView的多种item布局的封装

本文是借鉴bingoogolapple写得BGAAdapter-Android而产生的,对此表示感谢。

效果

1.Adapter的使用

1.继承BaseAdapter

这里是我的adapter

public class RecyclerChatAdapter extends BaseAdapter<ChatModel> {
    public Context context;
    protected ADUholder holder;

    public RecyclerChatAdapter(Context context) {
        super();
        this.context = context;
    }

    @Override
    public int getItemViewType(int position) {
        return mDatas.get(position).type;
    }

    @Override
    protected BaseViewHolder addViewHolder(ViewGroup parent, int viewType) {
        View view = null;
        switch (viewType) {
            case Type.chat:
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_chat, parent, false);
                return new ChatHolder(view);
            case Type.other:
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list, parent, false);
                return new ADUholder(view);
            default://防止空指针
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_chat, parent, false);
                return new ChatHolder(view);
        }
    }

    @Override
    protected void fillData(RecyclerView.ViewHolder holder, int position, ChatModel model) {
        if (holder instanceof ChatHolder) {
            ChatHolder chatHolder = (ChatHolder) holder;
            chatHolder.fillData(context, mDatas, position);
        } else if (holder instanceof ADUholder) {
            ADUholder adUholder = (ADUholder) holder;
            adUholder.fillData(context, mDatas, position);
        }
    }
}

注意这里要实现多item布局就要重写getItemViewType()方法,我们可以在item中的属性中增加一个类型,如我这里是在ChatModel中增加了一个int type;在getItemViewType()获取它。

2.重写addViewHolder()

根据参数viewType来加载不同的item布局,我这里仅仅写了两种,你可以继续增加。

@Override
    protected BaseViewHolder addViewHolder(ViewGroup parent, int viewType) {
        View view = null;
        switch (viewType) {
            case Type.chat:
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_chat, parent, false);
                return new ChatHolder(view);
            case Type.other:
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list, parent, false);
                return new ADUholder(view);
        }
        return null;
    }

3.重写getItemViewType()

代码如下:

@Override
    public int getItemViewType(int position) {
        return mDatas.get(position).type;
    }

这里根据你每个item中的type来返回,对应addViewHolder()方法中的参数viewType。

4.重写fillData()

这里就是填充数据了

@Override
    protected void fillData(RecyclerView.ViewHolder holder, int position, ChatModel model) {
        if (holder instanceof ChatHolder) {
            ChatHolder chatHolder = (ChatHolder) holder;
            chatHolder.fillData(context, mDatas, position);
        } else if (holder instanceof ADUholder) {
            ADUholder adUholder = (ADUholder) holder;
            adUholder.fillData(context, mDatas, position);
        }
    }

adapter这里我们就做完了,剩下了就是ViewHolder。

2.ViewHolder的使用

1.继承BaseViewHolder

我的代码如下:

public class ChatHolder extends BaseViewHolder<ChatModel> {
    protected RelativeLayout rl_item_chat_to;
    protected RelativeLayout rl_item_chat_from;
    protected TextView tv_item_chat_from_msg;
    protected TextView tv_item_chat_to_msg;

    public ChatHolder(View view) {
        super(view);
        rl_item_chat_to = findViewById(R.id.rl_item_chat_to);
        rl_item_chat_from = findViewById(R.id.rl_item_chat_from);
        tv_item_chat_from_msg = findViewById(R.id.tv_item_chat_from_msg);
        tv_item_chat_to_msg = findViewById(R.id.tv_item_chat_to_msg);
    }

    @Override
    public void fillData(Context context, List<ChatModel> datas, int position) {
        ChatModel model = datas.get(position);
        if (model.mUserType == ChatModel.UserType.From) {
            rl_item_chat_to.setVisibility(View.GONE);
            rl_item_chat_from.setVisibility(View.VISIBLE);
            String msg = String.format(mContent.getString(R.string.color_msg_from), model.mMsg);
            Spanned htmlMsg = Html.fromHtml(msg);
            tv_item_chat_from_msg.setText(htmlMsg,TextView.BufferType.SPANNABLE);
        } else {
            rl_item_chat_to.setVisibility(View.VISIBLE);
            rl_item_chat_from.setVisibility(View.GONE);
            String msg = String.format(mContent.getString(R.string.color_msg_from), model.mMsg);
            Spanned htmlMsg = Html.fromHtml(msg);
            tv_item_chat_to_msg.setText(htmlMsg,TextView.BufferType.SPANNABLE);
        }
    }
}

2.构造方法

你要实现一个带有View参数的构造方法,我们可以在此做控件绑定。

3.重写fillData()

这里是你真正控件填充数据的地方,对每个item项。

4.另一个ViewHolder

public class ADUholder extends BaseViewHolder<ChatModel> {
    public ImageView imageView;
    public TextView title;
    public TextView name;

    public ADUholder(View itemView) {
        super(itemView);
        imageView = findViewById(R.id.imageView);
        title = findViewById(R.id.tv_title);
        name = findViewById(R.id.tv_name);
    }

    @Override
    public void fillData(Context context, List<ChatModel> datas, int position) {
        ChatModel model = datas.get(position);
        title.setText(model.name + position);
        name.setText(model.mMsg);
    }

}

是不是感觉简单了很多,当然这是我自己的看法。

好了,在此附上github源码,喜欢的请start、fork。 https://github.com/DyncKathline/TestRecyclerView

转载请注明出处,谢谢!

时间: 2024-07-30 10:09:27

对RecycleView的多种item布局的封装的相关文章

2.Android 自定义通用的Item布局

转载:http://www.jianshu.com/p/e7ba4884dcdd BaseItemLayout 简介 在工作中经常会遇到下面的一些布局,如图标红处: 05.png 07.png 08.png 因此自定义了一个通用的Item布局,只需几行代码就可以根据需要添加任意个item. 使用 添加Gradle依赖 在 build.gradle 的 dependencies 添加 dependencies { ... compile 'com.maiml:baseitemlayoutlibra

【转】Android ListView加载不同的item布局

原创教程,转载请保留出处:http://www.eoeandroid.com/thread-72369-1-1.html 最近有需求需要在listView中载入不同的listItem布局,开始没有使用convertView,加载了多个item后导致了内存泄露,所以回来研究convertView在多个listItem布局时的缓存及应用,并且和大家分享 构造Adapter时,没有使用缓存的 convertView,导致内存泄露 示例代码:public View getView(int positio

Android BaseAdapter加载多个不同的Item布局时出现UncaughtException in Thread main java.lang.ArrayIndexOutOfBoundsException: length=15; index=15

java.lang.ArrayIndexOutOfBoundsException: length=15; index=15 异常出现的场景:在做聊天界面时,需要插入表情,图片,文字,名片,还有几种较为复杂的布局.这时就需要用到BaseAdapter中的getViewTypeCount()和getItemViewType(int position) 方法了,在发送复杂界面时出现了这个异常. 令人抓狂的是这个异常居然是UncaughtException,根本无法判断哪一行出错了,刚开始的时候觉得一定

android listview的item布局中含有button,不会响应listview的onitemclick监听 以及 onitemlongclick监听问题解决

效果图: activity的布局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&qu

Android教程2020 - RecyclerView显示多种item

Android教程2020 - 系列总览 本文链接 前面我们已经用RecyclerView显示一些数据.也知道如何获取滑动的距离. 前面我们的列表中显示的都是同类数据.如果要在一个列表中显示不同类别的数据,该怎么做呢? RecyclerView已经有应对这类场景的能力,本文描述如何用RecyclerView显示多种内容(item). 综述 这个例子中涉及到的类和文件比较多. 放在同一个包里的文件 BaseMultiData.java BaseVH.java ItemTypeDef.java Mu

Android Studio第二十七期 - RecycleView不同item布局

其实就是适配器的写法~ (附:copy loader的~剪刀手~) DemoDifferentRecycleViewAdapter: package com.haiersmart.sfnation.demo.adapter; import android.content.Context; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.support.v7

CSS3与页面布局学习总结——多种页面布局

一.负边距与浮动布局 1.1.负边距 所谓负边距就是margin取负值的情况,如margin:-40px:margin-left:-100%.当一个元素与另一个元素margin取负值时将拉近距离.常见用法如下: 1.1.1.向上移动 当多个元素同时从标准流中脱离开来时,如果前一个元素的宽度为100%宽度,后面的元素通过负边距可以实现上移.当负的边距超过自身的宽度将上移,只要没有超过自身宽度就不会上移,示例如下: 示例代码: <!DOCTYPE html> <html> <he

Android开发游记:RecycleView 实现复杂首页布局三种方式

做过电商类应用的朋友可能都会遇到一个比较头疼的问题:复杂的首页布局如何实现.参考百度糯米,美团,bilibili等应用,都会发现其首页的布局相对复杂,例如下图bilibili的首页(第二张是demo实现的效果图),可以看到在同一个页面中先是有列表布局出现,然后出现了2列的网格布局,接着3列的网格布局,最后还出现了瀑布流式布局: 这样的效果该怎么做呢?是使用LinearLayoutManager.GridLayoutManager还是StaggeredGridLayoutManager?还是根本不

Android Activity切换动画多种实现方式与封装

关于Activity动画那些事 关于activity的动画,相信大家再熟悉不过了,我们开发中经常用到,网上资料也很多,但是也有一些小细节需要我们注意,今天这篇文章我总结了几种常用的动画实现方式,通过这篇文章,你可以了解到: 几种常见的activity动画实现方式 activity动画中需要注意的细节 这几种方式的优缺点比较,我们如何取舍 对这几种方式进行简易封装,提高我们的开发效率 几种常见的实现方式: 1. activity.overridePendingTransition() 这种方式相信