MultiTypeAdapter 复杂的列表视图解决方案

1.集成

implementation 'me.drakeet.multitype:multitype:3.3.0'

2.简单布局示例

使用MultiTypeAdapter 是没有适配器的,我们直接继承 ItemViewBinder这个类,在其中处理布局和数据的填充工作。

public class TitleViewBinder extends ItemViewBinder<Title,TitleViewBinder.TitleHolder> {

    @NonNull
    @Override
    protected TitleHolder onCreateViewHolder(@NonNull LayoutInflater inflater, @NonNull ViewGroup parent) {
        View view = inflater.inflate(R.layout.adapter_title, parent, false);
        return new TitleHolder(view);
    }

    @Override
    protected void onBindViewHolder(@NonNull TitleHolder titleHolder, @NonNull Title title) {
        titleHolder.textView.setText(title.title);
    }

    public class TitleHolder extends RecyclerView.ViewHolder {
        private final TextView textView;

        public TitleHolder(@NonNull View itemView) {
            super(itemView);
            textView = (TextView)itemView.findViewById(R.id.textView);
        }
    }
}

在使用的activity中编写代码:

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

        mRecyclerView = (RecyclerView)this.findViewById(R.id.recyclerView);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        mAdapter = new MultiTypeAdapter();
        mAdapter.register(Title.class, new TitleViewBinder()); //注册数据
        mRecyclerView.setAdapter(mAdapter);
        ArrayList<Title> list = new ArrayList<>();
        for (int i = 0 ; i < 10; i++){
            Title title =  new Title();
            title.title = "xxxx="+i;
            list.add(title);
        }
        mAdapter.setItems(list);
        mAdapter.notifyDataSetChanged();
    }

完成简单的使用!!!

3. 复杂的布局

public class ImageViewBinder extends ItemViewBinder<Imaeg,ImageViewBinder.ViewHolder> {

    @NonNull
    @Override
    protected ViewHolder onCreateViewHolder(@NonNull LayoutInflater inflater, @NonNull ViewGroup parent) {
        View view = inflater.inflate(R.layout.adapter_image, parent, false);
        return new ViewHolder(view);
    }

    @Override
    protected void onBindViewHolder(@NonNull ViewHolder viewHolder, @NonNull Imaeg image) {
        Glide.with(MyApplication.getInstance()).load(image.url).into(viewHolder.imageView);
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        private final ImageView imageView;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            imageView = (ImageView)itemView.findViewById(R.id.imageView);
        }
    }
}
public class AdViewBinder extends ItemViewBinder<Ad,AdViewBinder.ViewHolder> {

    @NonNull
    @Override
    protected AdViewBinder.ViewHolder onCreateViewHolder(@NonNull LayoutInflater inflater, @NonNull ViewGroup parent) {
        View view = inflater.inflate(R.layout.adapter_ad, parent, false);
        return new ViewHolder(view);
    }

    @Override
    protected void onBindViewHolder(@NonNull ViewHolder viewHolder, @NonNull Ad ad) {
        Glide.with(MyApplication.getInstance()).load(ad.url).into(viewHolder.imageView);
    }
    
    public class ViewHolder extends RecyclerView.ViewHolder {
        private final ImageView imageView;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            imageView = (ImageView)itemView.findViewById(R.id.imageView);
        }
    }
}

这样我们就有了三种布局:

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

        final ArrayList<Object> list = new ArrayList<>();
        for (int i = 0 ; i < 5; i++){
            Title title =  new Title();
            title.title = "xxxx="+i;
            list.add(title);
        }
        for (int i = 0 ; i < 2; i++){
            Ad title =  new Ad();
            title.url = "https://www.google.com.hk/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png";
            list.add(title);
        }
        for (int i = 0 ; i < 6; i++){
            Imaeg title =  new Imaeg();
            title.url = "https://www.google.com.hk/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png";
            list.add(title);
        }
        mRecyclerView = (RecyclerView)this.findViewById(R.id.recyclerView);
        GridLayoutManager layoutManager = new GridLayoutManager(this, 10);//10=1*5*2
        mRecyclerView.setLayoutManager(layoutManager);
        layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                if (list.get(position) instanceof Title) {
                    return 10/1;//一行占1个
                }
                if (list.get(position) instanceof Ad) {
                    return 10/2;//一行占2个
                }
                if (list.get(position) instanceof Imaeg) {
                    return 10/5;//一行占5个
                }
                return 10;//默认一行占1个
            }
        });
        mAdapter = new MultiTypeAdapter();
        mAdapter.register(Title.class, new TitleViewBinder()); //注册数据
        mAdapter.register(Ad.class, new AdViewBinder()); //注册数据
        mAdapter.register(Imaeg.class, new ImageViewBinder()); //注册数据
        mRecyclerView.setAdapter(mAdapter);
        mAdapter.setItems(list);
        mAdapter.notifyDataSetChanged();
    }

 

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值