zoukankan      html  css  js  c++  java
  • 【转载】万能adapter

    adapter总是自己写,其实使用现成的框架会节省不少代码

     原文地址:https://github.com/hongyangAndroid/baseAdapter

    base-adapter

    Android 万能的Adapter for ListView,RecyclerView,GridView等,支持多种Item类型的情况。

    引入

    ForRecyclerView

    compile 'com.zhy:base-rvadapter:3.0.3'

    ForListView

    compile 'com.zhy:base-adapter:3.0.3'

    使用

    ##(1)简单的数据绑定(ListView与其使用方式一致)

    首先看我们最常用的单种Item的书写方式:

    mRecyclerView.setAdapter(new CommonAdapter<String>(this, R.layout.item_list, mDatas)
    {
        @Override
        public void convert(ViewHolder holder, String s)
        {
            holder.setText(R.id.id_item_list_title, s);
        }
    });

    是不是相当方便,在convert方法中完成数据、事件绑定即可。

    只需要简单的将Adapter继承CommonAdapter,复写convert方法即可。省去了自己编写ViewHolder等大量的重复的代码。

    • 可以通过holder.getView(id)拿到任何控件。
    • ViewHolder中封装了大量的常用的方法,比如holder.setText(id,text),holder.setOnClickListener(id,listener)等,可以支持使用。

    效果图:

    ##(2)多种ItemViewType(ListView与其使用方式一致)

    对于多中itemviewtype的处理参考:https://github.com/sockeqwe/AdapterDelegates ,具有极高的扩展性。

    MultiItemTypeAdapter adapter = new MultiItemTypeAdapter(this,mDatas);
    adapter.addItemViewDelegate(new MsgSendItemDelagate());
    adapter.addItemViewDelegate(new MsgComingItemDelagate());

    每种Item类型对应一个ItemViewDelegete,例如:

    public class MsgComingItemDelagate implements ItemViewDelegate<ChatMessage>
    {
    
        @Override
        public int getItemViewLayoutId()
        {
            return R.layout.main_chat_from_msg;
        }
    
        @Override
        public boolean isForViewType(ChatMessage item, int position)
        {
            return item.isComMeg();
        }
    
        @Override
        public void convert(ViewHolder holder, ChatMessage chatMessage, int position)
        {
            holder.setText(R.id.chat_from_content, chatMessage.getContent());
            holder.setText(R.id.chat_from_name, chatMessage.getName());
            holder.setImageResource(R.id.chat_from_icon, chatMessage.getIcon());
        }
    }

    贴个效果图:

    ##(3) 添加HeaderView、FooterView

    mHeaderAndFooterWrapper = new HeaderAndFooterWrapper(mAdapter);
    
    TextView t1 = new TextView(this);
    t1.setText("Header 1");
    TextView t2 = new TextView(this);
    t2.setText("Header 2");
    mHeaderAndFooterWrapper.addHeaderView(t1);
    mHeaderAndFooterWrapper.addHeaderView(t2);
    
    mRecyclerView.setAdapter(mHeaderAndFooterWrapper);
    mHeaderAndFooterWrapper.notifyDataSetChanged();

    类似装饰者模式,直接将原本的adapter传入,初始化一个HeaderAndFooterWrapper对象,然后调用相关API添加。

    ##(4) 添加LoadMore

    mLoadMoreWrapper = new LoadMoreWrapper(mOriginAdapter);
    mLoadMoreWrapper.setLoadMoreView(R.layout.default_loading);
    mLoadMoreWrapper.setOnLoadMoreListener(new LoadMoreWrapper.OnLoadMoreListener()
    {
        @Override
        public void onLoadMoreRequested()
        {
        }
    });
    
    mRecyclerView.setAdapter(mLoadMoreWrapper);

    直接将原本的adapter传入,初始化一个LoadMoreWrapper对象,然后调用相关API即可。

    ##(5)添加EmptyView

    mEmptyWrapper = new EmptyWrapper(mAdapter);
    mEmptyWrapper.setEmptyView(R.layout.empty_view);
    
    mRecyclerView.setAdapter(mEmptyWrapper );

    直接将原本的adapter传入,初始化一个EmptyWrapper对象,然后调用相关API即可。

    支持链式添加多种功能,示例代码:

    mAdapter = new EmptyViewWrapper(
        new LoadMoreWrapper(
        new HeaderAndFooterWrapper(mOriginAdapter)));

    一些回调

    onViewHolderCreated

    mListView.setAdapter(new CommonAdapter<String>(this, R.layout.item_list, mDatas)
    {
        @Override
        public void convert(ViewHolder holder, String o, int pos)
        {
            holder.setText(R.id.id_item_list_title, o);
        }
    
        @Override
        public void onViewHolderCreated(ViewHolder holder, View itemView)
        {
            super.onViewHolderCreated(holder, itemView);
           //AutoUtil.autoSize(itemView)
        }
    });

     

  • 相关阅读:
    HTML5触摸屏touch事件使用介绍1
    hdu 1408 acdearm &quot;Money, Money, Money&quot;
    基于QTP的自己主动化測试框架介绍
    ExpandListView onChildClickListener 失效
    hdu1227 Fast Food
    Linux C高级编程——文件操作之系统调用
    nodejs之路-[0]安装及简易配置
    动态加入改动删除html表格内容
    socket网络编程基础小记
    LeetCode OJ Minimum Depth of Binary Tree 递归求解
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/6739229.html
Copyright © 2011-2022 走看看