Git Product home page Git Product logo

customadapter's Introduction

CustomAdapter

## 可随意定制的RecyclerView 适配器 #### 1.支持多类型 #### 2.支持header和footer(适配网格布局和流布局,可控制隐藏与显示) #### 3.支持添加状态如:获取数据失败、网络没有连接等(可控制隐藏与显示)

关于加载更多

由于加载更多的实现方法很多,这里并没有引入这个功能,例子中也给了一个来自度娘的简单实现,有需要可以参考一下

GIF

include lib

Gradle: compile 'com.yan.adapter:adapter:1.2.0'

how to use    

//adapter初始化,该怎么用还怎么用
adapter = initAdapter(dataList);
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
//recyclerView.setLayoutManager(new LinearLayoutManager(this));
//recyclerView.setLayoutManager(new GridLayoutManager(this,2));
recyclerView.setAdapter(adapter);

##1.添加普通的数据类型    

//添加普通的数据类型 CustomAdapterItem<T,V> T为holder的类型,V为数据类型
.addAdapterItem(new CustomAdapterItem<HolderTest1, Integer>() {
        @Override
        public Class dataType() {
                return Integer.class;//直接返回数据类型,这里并没有根据V的泛型判断数据类型,毕竟反射影响运行效率
        }
        @Override
        public HolderTest1 viewHolder(ViewGroup parent) {
                return new HolderTest1(
                    LayoutInflater.from(MainActivity.this).inflate(R.layout.item_type_1, parent, false)
                );
        }
        @Override
        public void bindData(HolderTest1 holder, Integer item, int position) {
                holder.textView.setText(item + "");
        }
})

##2.添加状态类型

//添加状态类型 StateAdapterItem<HolderTest2>(String tag, boolean isShow) tag是标签,便于之后找到这个item;isShow为是否显示
.addAdapterItem(new StateAdapterItem<HolderTest2>("NO_WIFI", false) {
        @Override
        public HolderTest2 viewHolder(ViewGroup parent) {
                HolderTest2 holderTest2 = new HolderTest2(
                        LayoutInflater.from(MainActivity.this).inflate(R.layout.state_view, parent, false)
                );
                holderTest2.textView.setText("确保网络连接正常");
                return holderTest2;
        }
})
//在recycleview初次加载的时候,不可见的item并不会执行createviewholder,所以如果你需要对item做动态修改最好以传参的方式传入viewholder
.addAdapterItem(new StateAdapterItem<HolderTest2>("DataError", false,
                getHolder()) {
        @Override
        public HolderTest2 viewHolder(ViewGroup parent) {
                return null;
        }
})
//当然也可以是stateAdapterItem.setHolder(ViewHolder)来设置
//------------------------------------------------
private HolderTest2 getHolder() {//这里布局大小需要自己给定
        RecyclerView.LayoutParams layoutParams = new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT,
                RecyclerView.LayoutParams.MATCH_PARENT);
        View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.state_view, null);
        view.setLayoutParams(layoutParams);
        HolderTest2 holderTest2 = new HolderTest2(view);
        holderTest2.textView.setText("获取数据出错");
        return holderTest2;
}
//------------------------------------------------

##3.添加header和footer

//添加header
.addAdapterItem(new StateAdapterItem<HolderTest2>(StateAdapterItem.HEADER)
//添加footer
.addAdapterItem(new StateAdapterItem<HolderTest2>(StateAdapterItem.FOOTER)

##4.动态更改数据

StateAdapterItem dataError = adapter.findStateItem("DataError");
//以参数形式传入的ViewHolder不会出现viewholder为空的情况
((HolderTest2) dataError.getHolder()).textView.append("!");
((HolderTest2) adapter.getStateFooter().getHolder())
        .textView.setText("footer" + times);
StateAdapterItem noWifi = adapter.findStateItem("NO_WIFI");
if (noWifi.getHolder() != null)
        ((HolderTest2) noWifi.getHolder()).textView.append(".");
StateAdapterItem noData = adapter.findStateItem("NO_DATA");
if (noData.getHolder() != null)
        ((HolderTest2) noData.getHolder()).textView.append("-");

##5.控制显示与隐藏

adapter.findStateItem("FIXED").hide();
//或者
adapter.show("DataError")
        .hide("NO_WIFI")
        .hide("NO_DATA")
        .hideHeader(false)//false不立即执行
        .hideFooter(false)
        .commit();

##6.点击事件

 adapter.setOnItemClickListener(...//设置所有位置的点击事件
 //设置数据所在位置的点击事件
adapter.setOnDataItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(RecyclerView.ViewHolder holder, int position) {
                ((HolderTest) holder).textView.append(position + "");
                toast.setText("onItemClick: position " + position);
                toast.show();
        }
});

LICENSE

Copyright 2017 yan

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

customadapter's People

Contributors

genius158 avatar

Stargazers

binny1024 avatar  avatar VV avatar  avatar  avatar inmyfree avatar wanghaowen avatar 高DJ avatar  avatar  avatar  avatar Papaya avatar

Watchers

James Cloos avatar  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.