Giter Site home page Giter Site logo

quickrv's Introduction

#QuickRv #compile 'com.march.quickrvlibs:quickrvlibs:1.0.6' #简化RecyclerView使用 ##ListView GridView适配简化

##更新日志 ###1.0.1 快速适配器,简化ViewHoler使用,一键绑定文字,监听... (2016.2.10 )

###1.0.2 添加分割线,自定义网络加载框架加载图片(2016.2.15 )

###1.0.3 可以添加header和footer ( 2016.3.24 )

###1.0.4 添加分辨adapter类型的方法 ( 2016.4.6 )

###1.0.5 兼容使用数组创建Adapter,兼容Java内置对象类型创建Adapter( 2016.4.10 )

###1.0.6 瀑布流添加Header和Footer的方法优化( 2016.4.11 )

###2.0.1 代码重构,基于装饰者模式,实现快速适配,添加Header和Footer,上拉加载等功能( 2016.4.12 )


##2.0.1重构介绍 ##Git地址,详细文档参见Git ##QuickAdapter这篇文章是针对RecyclerViewAdapter的封装,原理是一致的。

#RecyclerView的快速适配 ##单类型

//单类型适配使用带有layout资源的构造方法,不要再重复调用addType()方法,实体类需要实现RvQuickInterface接口
RvQuickAdapter<Demo> adapter = new RvQuickAdapter<Demo>(TestApplication.getInst(), data, R.layout.item_quickadapter) {

            @Override
            public void bindData4View(RvViewHolder holder, Demo data, int pos, int type) {
               //绑定数据
                holder.setText(R.id.item_quickadapter_title, data.getmDemoTitle());
            }

            @Override
            public void bindListener4View(RvViewHolder holder, int type) {
                //不使用可不实现
            }
};

#多类型

//多类型适配使用不带有layout资源的构造方法,调用addType()方法配置每种类型的layout资源,实体类需要实现RvQuickInterface接口
RvQuickAdapter<Demo> typeAdapter = new RvQuickAdapter<Demo>(TestApplication.getInst(), data) {

            @Override
            public void bindData4View(RvViewHolder holder, Demo data, int pos, int type) {
                //根据类型绑定数据
                switch (type) {
                    case Demo.CODE_DETAIL:
                        holder.setText(R.id.item_quickadapter_type_title, data.getmDemoTitle()).setText(R.id.item_quickadapter_desc, data.getmDescStr());
                        break;
                    case Demo.JUST_TEST:
                        holder.setText(R.id.item_quickadapter_title, data.getmDemoTitle());
                        break;
                }
            }
            @Override
            public void bindListener4View(RvViewHolder holder, int type) {
                 //不使用可不实现
            }
        };
typeAdapter.addType(Demo.CODE_DETAIL, R.layout.item_quickadapter_type)
                .addType(Demo.JUST_TEST, R.layout.item_quickadapter);

#兼容使用数组创建Adapter,兼容Java内置对象(String,Integer)类型创建Adapter

//RvQuickModel是我内置的封装类,用来封装基本数据类型和java基本对象
String[] strs = new String[]{"a","a","a","a","a","a","a","a","a","a"};
RvQuickAdapter<RvQuickModel> adapter =
                new RvQuickAdapter<RvQuickModel>(this, RvConvertor.convert(strs)) {
      @Override
      public void bindData4View(RvViewHolder holder, RvQuickModel data, int pos, int type) {
                String s = data.<String>get();
      }
};

Demo[] demoarr = new Demo[]{};
RvQuickAdapter<Demo> adapter1 = new RvQuickAdapter<Demo>(this,demoarr) {
      @Override
      public void bindData4View(RvViewHolder holder, Demo data, int pos, int type) {

      }
};

#BaseRvAdapter

public interface BaseRvAdapter {

    void onAttachedToRecyclerView(RecyclerView recyclerView);

    int getItemCount();

    int getItemViewType(int position);

    RvViewHolder onCreateViewHolder(ViewGroup parent, int viewType);

    void onBindViewHolder(RvViewHolder holder, int pos);

    <T extends BaseRvAdapter> T getInAdapter();//获取包装在内部的Adapter
}

#如何实现上拉加载

//使用RvLoadMoreAdapter包装,可以包装RvHFQuickAdapter(添加Header,Footer)也可以包装RvQuickAdapter,因为他们都是BaseRvAdapter的实现类
//数据加载完毕之后调用rvLoadMoreAdapter.finishLoad();通知数据结束刷新,内部已经添加了防止数据重复获取的机制
//简单使用
RvLoadMoreAdapter rvLoadMoreAdapter = new RvLoadMoreAdapter(rvHFQuickAdapter);
RvLoadMoreAdapter rvLoadMoreAdapter = new RvLoadMoreAdapter(rvHFQuickAdapter, new RvLoadMoreAdapter.OnLoadMoreListener() {
            @Override
            public void onLoadMore() {
                for (int i = 0; i < 50; i++) {
                    demos.add(new Demo(i, i + " <- new"));
                }
                rvLoadMoreAdapter.notifyDataSetChanged();
                rvLoadMoreAdapter.finishLoad();
            }
});

//设置提前多少个item实现预加载
setPreLoadNum(int preLoadNum)

#如何添加header和footer

//使用RvHFAdapter包装RvQuickAdapter,使之具有添加Header和Footer的功能
RvHFAdapter rvHFQuickAdapter = new RvHFAdapter(rvQuickAdapter);

//使用View添加
rvHFQuickAdapter.addHeader(LayoutInflater.from(this).inflate(R.layout.rvquick_header, null));
rvHFQuickAdapter.addFooter(LayoutInflater.from(this).inflate(R.layout.rvquick_footer, null));

//使用资源添加
rvHFQuickAdapter.addHeader(R.layout.rvquick_header);
rvHFQuickAdapter.addFooter(R.layout.rvquick_footer);

//你可以继承重写方法使用RvViewHolder更简单的操作View,而不需要在获取很多控件更改他的显示,当然也可以不使用,一行代码实现就可以包装
RvHFAdapter rvHFQuickAdapter = new RvHFAdapter(rvQuickAdapter);
RvHFAdapter rvHFQuickAdapter = new RvHFAdapter(rvQuickAdapter){
            @Override
            public void bindLisAndData4Footer(RvViewHolder footer) {
                super.bindLisAndData4Footer(footer);
            }

            @Override
            public void bindLisAndData4Header(RvViewHolder header) {
                super.bindLisAndData4Header(header);
            }
        };

//设置监听事件时返回的pos是在整个布局中的位置,如果你设置了header,你点击获得的下标实际上并不是真正的下标
//使用rvHFQuickAdapter.getDataPos(pos)可以获得点击位置在datas中真正的数据,当然你也可以使用pos-1这样更直接粗暴的方法
rvQuickAdapter.setClickListener(new OnRecyclerItemClickListener<RvViewHolder>() {
      @Override
      public void onItemClick(int pos, RvViewHolder holder) {
          Toast.makeText(MainActivity.this, "点击" + rvQuickAdapter.getDataPos(pos), Toast.LENGTH_SHORT).show();
      }
});

//获取Header
public View getHeader()
//获取Footer
public View getFooter()
//隐藏或显示Footer
public void setFooterEnable(boolean footerEnable)
//隐藏或显示Header
public void setHeaderEnable(boolean headerEnable)

#设置监听

// 设置item监听事件
rvQuickAdapter.setClickListener(new OnRecyclerItemClickListener<RvViewHolder>() {
            @Override
            public void onItemClick(int pos, RvViewHolder holder) {

            }
        });
//设置item长按事件
rvQuickAdapter.setLongClickListenter(new OnRecyclerItemLongClickListener<RvViewHolder>() {
            @Override
            public void onItemLongClick(int pos, RvViewHolder holder) {

            }
        });

#adapterId区分adapter类型

public int getAdapterId();

public void setAdapterId(int adapterId);

public boolean isThisAdapter(RvQuickAdapter adapter);

#给Item加分割线

//你可以使用shape自定义分割线样式
Drawable line = ContextCompat.getDrawable(self,R.drawable.shape_line);
//两种布局格式使用不同的分割线
linear = new LinearDividerDecoration(self, LinearDividerDecoration.VERTICAL_LIST,line);
grid = new GridDividerDecoration(self,line);
//设置
mRv.addItemDecoration(linear);

#加载网络图片可以提前创建图片加载工具,然后调用ViewHodler.setImg()方法可以直接加载

//你可以在Activity或者Application调用这段代码进行全局配置,第二次调用会将以前的设置覆盖,所以只需要执行一次
RvQuick.init(new RvQuick.QuickLoad() {
            @Override
            public void load(Context context, String url, ImageView view) {
                Log.e("chendong","加载图片");
                Glide.with(context).load("http://www.fresco-cn.org/static/fresco-logo.png").into(view);
            }
        });

//在adapter中使用
public RvViewHolder setImg(Context context, int resId, String url)

#更新使用方法

//Demo类是我的实体类
//如果你使用的控件RvViewHolder没有为你集成,如何避免强转?使用泛型解决
holder.<Button>getView(R.id.abc).setText("");

//设置监听事件
public RvViewHolder setLis(int resId,View.OnClickListener listener,Object tag)//带有tag监听
public RvViewHolder setLis(int resId,View.OnClickListener listener)//不带tag监听
public RvViewHolder setTag(int resId, Object tag)//给控件设置tag
public <T> T getTag(int resId)//从RvViewHolder获取tag,包含泛型,你可以这样holder.<Demo>getTag(R.id.xxx)

//如果你在控件中设置了tag,当你在适配器外部使用tag时务必使用改方法获取,用来替代view.getTag()方法,
包含泛型,你可以这样用 Quick.<Demo>getTagOutOfAdapter(listView);
RvQuick.getTagOutOfAdapter(View view)


//设置图片
public RvViewHolder setImg(int resId, Bitmap bit)
public RvViewHolder setImg(Context context, int resId, String url)

quickrv's People

Contributors

chendongmarch avatar

Watchers

James Cloos avatar mayu avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.