UltimateRecyclerView发布,Android下新Listview的大杀器

一个多功能的RecyclerView,包括了下拉刷新、加载更多,滑动删除,拖拽排序、多种动画、视差拖动、Toolbar渐变、Toolbar和FAB随着滚动出现消失等等效果,都可以放在同一个RecyclerVIew中并自由配置。

项目地址:https://github.com/cymcsg/UltimateRecyclerView

Description

UltimateRecyclerView is a RecyclerView(advanced and flexible version of ListView) with pulling to refresh, loading more, swiping to dismiss, draging and drop, animations ,show or hide toolbar and FAB when scrolling and many other features.You can use it just like RecyclerView.

Notice that UltimateRecyclerView is a project under development.

Features:

  • Swipe to refresh(using android.support.v4.widget.SwipeRefreshLayout)
  • Many kinds of animations
  • Swipe to dismiss
  • Parallax head view
  • Drag and drop
  • Loading more when reach the last item(infinite scrolling)
  • Custom views in loading more
  • Showing or hiding toolbar and floating button when scrolling

Upcoming features:

  • More animations
  • Colorful style of Swipe to refresh

If you have some good idea, please mention us.My email is cymcsg # gmail.com

Welcome to fork.

If you want to use a rapid development framework for developing apps,you can try UltimateAndroid Framework.

Screenshot

Sample

You can clone the project and compile it yourself (it includes a sample), or you can check it out already compiled at Google Play

Notice that it might not be the latest version

Quick Setup(Basic Usage)

1.Integration
repositories {
        jcenter()
    }
dependencies {
    ...
    compile ‘com.marshalchen.ultimaterecyclerview:library:0.2.1‘
}
2.Usage:
<com.marshalchen.ultimaterecyclerview.UltimateRecyclerView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/ultimate_recycler_view"
        app:recyclerviewClipToPadding="true"
        app:recyclerviewPadding="2dp">
        </com.marshalchen.ultimaterecyclerview.UltimateRecyclerView>
3.Features:

Loading more:

  ultimateRecyclerView.enableLoadmore();

Set ParallaxHeader:

 ultimateRecyclerView.setParallaxHeader(getLayoutInflater().inflate(R.layout.parallax_recyclerview_header, ultimateRecyclerView.mRecyclerView, false));
        ultimateRecyclerView.setOnParallaxScroll(new UltimateRecyclerView.OnParallaxScroll() {
            @Override
            public void onParallaxScroll(float percentage, float offset, View parallax) {
                Drawable c = toolbar.getBackground();
                c.setAlpha(Math.round(127 + percentage * 128));
                toolbar.setBackgroundDrawable(c);
            }
        });

Set swipe to refresh:

 ultimateRecyclerView.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        simpleRecyclerViewAdapter.insert("Refresh things", 0);
                        ultimateRecyclerView.setRefreshing(false);
                        //   ultimateRecyclerView.scrollBy(0, -50);
                        linearLayoutManager.scrollToPosition(0);
                    }
                }, 1000);
            }
        });

Set swipe to dismiss:

  ultimateRecyclerView.setSwipeToDismissCallback(new SwipeToDismissTouchListener.DismissCallbacks() {
            @Override
            public SwipeToDismissTouchListener.SwipeDirection dismissDirection(int position) {
                return SwipeToDismissTouchListener.SwipeDirection.BOTH;
            }
            @Override
            public void onDismiss(RecyclerView view, List<SwipeToDismissTouchListener.PendingDismissData> dismissData) {
                for (SwipeToDismissTouchListener.PendingDismissData data : dismissData) {
                    simpleRecyclerViewAdapter.remove(data.position);
                }
            }
            @Override
            public void onResetMotion() {
                isDrag = true;
            }
            @Override
            public void onTouchDown() {
                isDrag = false;
            }
        });
 ```

 Drag and drop:

 ```java
    dragDropTouchListener = new DragDropTouchListener(ultimateRecyclerView.mRecyclerView, this) {
            @Override
            protected void onItemSwitch(RecyclerView recyclerView, int from, int to) {
                simpleRecyclerViewAdapter.swapPositions(from, to);
                simpleRecyclerViewAdapter.clearSelection(from);
                simpleRecyclerViewAdapter.notifyItemChanged(to);
                if (actionMode != null) actionMode.finish();
                Logs.d("switch----");
            }
            @Override
            protected void onItemDrop(RecyclerView recyclerView, int position) {
                Logs.d("drop----");
                ultimateRecyclerView.enableSwipeRefresh(true);
            }
        };
        dragDropTouchListener.setCustomDragHighlight(getResources().getDrawable(R.drawable.custom_drag_frame));
        ultimateRecyclerView.mRecyclerView.addOnItemTouchListener(dragDropTouchListener);

Animations:

java

ultimateRecyclerView.setItemAnimator(Type.values()[position].getAnimator());

ultimateRecyclerView.getItemAnimator().setAddDuration(300);

ultimateRecyclerView.getItemAnimator().setRemoveDuration(300);

Showing and hiding toolbar and floating button:

java

ultimateRecyclerView.setScrollViewCallbacks(new ObservableScrollViewCallbacks() {

@Override

public void onScrollChanged(int scrollY, boolean firstScroll, boolean dragging) {

}

@Override

public void onDownMotionEvent() {

}

@Override

public void onUpOrCancelMotionEvent(ObservableScrollState observableScrollState) {

if (observableScrollState == ObservableScrollState.DOWN) {

ultimateRecyclerView.showToolbar(toolbar, ultimateRecyclerView,getScreenHeight());

} else if (observableScrollState == ObservableScrollState.UP) {

ultimateRecyclerView.hideToolbar(toolbar,ultimateRecyclerView,getScreenHeight());

} else if (observableScrollState == ObservableScrollState.STOP) {

}

}

});

If you want to see more details,you can check the demo.

时间: 2024-11-02 23:24:15

UltimateRecyclerView发布,Android下新Listview的大杀器的相关文章

eBay回到中国做“倒爷”,在俄罗斯能飙50%的跨境电商能成大杀器吗?

eBay在中国已经沉寂了多年,当人们基本快要遗忘它之时,它却在今年1月,宣布与宁波国家跨境电子商务综合试验区达成了战略合作. 看起来似乎是有一个招商引资的成功,而且往往许多人看到各种巨头和国内某地达成某种战略合作之时,总是一笑置之.毕竟,这种大战略经常都是以没有然后而划上省略号的. 文/张书乐 人民网.人民邮电报专栏作家.TMT行业观察者.游戏产业时评人 但请把注意点落在"跨境电商"4个字上,这恰恰是eBay用来撬开当年攻不下的那些地区大门的大杀器. 从俄罗斯传来的大杀器,据说很有用

一文读懂机器学习大杀器XGBoost原理

http://blog.itpub.net/31542119/viewspace-2199549/ XGBoost是boosting算法的其中一种.Boosting算法的思想是将许多弱分类器集成在一起形成一个强分类器.因为XGBoost是一种提升树模型,所以它是将许多树模型集成在一起,形成一个很强的分类器.而所用到的树模型则是CART回归树模型.讲解其原理前,先讲解一下CART回归树. 一.CART回归树 CART回归树是假设树为二叉树,通过不断将特征进行分裂.比如当前树结点是基于第j个特征值进

MHA大杀器——mysql主、从双击热备配置安装解析

MHA的主要作用: 在mysql的主从复制中,当master崩溃了,利用mha实现backup顶替崩溃的master自动切换为master继续工作,从而实现高可用. 下面介绍本次实验的环境: MHA分为manager管理节点和node节点,一般来讲最少是三台服务器,两台node节点,一台manager节点,但本次环境限制,只能使用两台,所以把manager也装在一台node节点上. 两台服务器,两个网口: IP: 10.2.16.253     10.0.0.1  node1 10.2.16.2

Python中的网络扫描大杀器Scapy初探

Python中的网络扫描大杀器Scapy初探     最近经历了Twisted的打击,这个网络编程实在看不懂,都摸不透它的内在逻辑,看来网络编程不是那么好弄的.还好,看到了scapy,这种网络的大杀器,让我一看就爱不释手,这才是我需要的网络工具啊.Scapy的功能如此之多,以至于...我到现在还是没看懂.在官方网站也介绍的不多,后来搜了一下,有一本书Security Power Tools一书中,第六章介绍了Scapy,虽然简单,但是还是不明白,这两天一直在忙活着看Scapy.看了几个应用,比较

汉澳sinox运行大杀器virtualbox让winxp回归

汉澳sinox运行大杀器virtualbox让winxp回归 虽然sinox能运行部分windows程序,可是仍然有些windows运行不了,就算你绞尽脑汁也没有办法,因为各种原因导致不支持! 难道就这样等死吗?不用,还有办法,那就是用virtualbox虚拟机安装 winxp,让 winxp复活.在虚拟机下面运行winxp可能比直接在真机器上运行安全.当然数据安全都是一样的.但是有了 winxp我们可以等,一直等到QQforsinox,不用去乞求别人的支持.等到有一天sinox完全普及了,软件

【爬虫】大杀器——phantomJS+selenium

[爬虫]大杀器--phantomJS+selenium 视频地址 江湖上有一个传说,得倚天屠龙者可称霸武林.爬虫中也有两个大杀器,他们结合在一起时,无往不利,不管你静态网站还是动态网站,通吃. phantomJS http://phantomjs.org/ 一种无头浏览器,何为无头浏览器,你可以看做一个无界面的浏览器,电脑能看到,人却看不到(没界面怎么看). 下载安装:http://phantomjs.org/download.html selenium http://selenium-pyth

Android下设置ListView数据加载完成后执行layoutanimation

今天使用android的volley框架写了一个简单的网络天气获取的demo. 承载数据的空间是ListView 因为是网络加载,必然先要设置ListView的默认数据,我设置的就是那个Loading... 然后从网络获取到数据后,再解析,然后更新到adapter,然后notifyDataSetChanged更新数据到ListView. 可是ListView设置了layoutanimation,这样默认的ListView打开后那个Loading执行了动画,当网络数据加载完毕后, layoutan

【大杀器】利用划分树秒杀区间内第k大的数

最近看了一道题,大概就是给出一个序列,不断询问其子区间内第k大的数,下面是个截图 绕了一圈没找到中文版题目,if(你是大佬) then 去看截图:else{我来解释:给出一个整数n,和一个整数m,分别表示序列元素个数和询问次数,然后输入n个数和m个询问,每个询问包含3个数,分别是区间起止点(l和r)和k,求出区间内第k大的数并输出:}这是一道很简单的模板题,怎么解决呢?小编最初想到的是打暴力,正所谓暴力出奇迹,说不定可以成功,反正不会优化,先试试吧,直接把规定区间[l,r]排一次序了,然后在查找

Linux大杀器命令:查找所有目录下的所有文件的字符串命令

命令为: *find . |xargs grep -ri "bspSetPonTxDisable" -l* 查找目录下的所有文件中是否含有某个字符串 find .|xargs grep -ri "IBM" 查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名 find .|xargs grep -ri "IBM" -l 1.正则表达式 (1)正则表达式一般用来描述文本模式的特殊用法,由普通字符(例如字符a-z)以及特殊字符(称为元字符,如