android RecyclerView下拉刷新与上拉更多,仿QQ左滑删除,点击展开,城市列表各种功能。

前言

现在下拉上拉控件非常多,但是网上的上拉下拉控件,只有这2种功能,有时候我们需要像QQ那样滑动item就出现了删除按钮,有时候我们需要点击item可以展开更多的信息,以便我们看更多的信息,有时候我们需要谷歌自带的下拉控件,有时候需要自己定义上下拉,切换来切换去很麻烦,于是我在某个大神(忘记是哪个了)的下拉上拉的控件的基础上,增加了谷歌自带下拉以及上拉样式模仿了谷歌下拉的那种样式,还有滑动item出现删除跟展开更多,和城市列表,,以上的功能都只需要简单的配置下就可以使用。

首先先看个效果图

GIF.gif

依赖:

compile'com.yanxuwen.MyRecyclerView:MyRecyclerview:1.5.7'

1.上下拉实现:

xml:
 <com.yanxuwen.MyRecyclerview.MyRecyclerView
 android:id="@+id/recyclerview"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
/>
java:
 mRecyclerView= (MyRecyclerView)this.findViewById(R.id.recyclerview);
 LinearLayoutManager layoutManager =newLinearLayoutManager(this);
  layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
  mRecyclerView.setLayoutManager(layoutManager);
//设置刷新样式,ProgressStyle里面设置了很多种样式,自行参考
mRecyclerView.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader);
//设置加载样式,ProgressStyle里面设置了很多种样式,自行参考
mRecyclerView.setLoadingMoreProgressStyle(ProgressStyle.BallRotate);
//设置下拉图标
mRecyclerView.setArrowImageView(R.drawable.iconfont_downgrey);
//设置动画
mRecyclerView.setItemAnimator(MyRecyclerView.ItemType.FadeInLeft);
//启动可以刷新
mRecyclerView.setPullRefreshEnabled(true);
//启动可以加载
mRecyclerView.setLoadingMoreEnabled(true);
//执行刷新
 mRecyclerView.setRefreshing(true);
//刷新跟加载监听
mRecyclerView.setLoadingListener(newMyRecyclerView.LoadingListener() {
public voidonRefresh() {
}
public voidonLoadMore() {
}
});
//执行添加item操作
findViewById(R.id.add).setOnClickListener(newView.OnClickListener() {
public voidonClick(View v) {
mAdapter.add("newly added item",2);
}
});
//执行删除item操作
findViewById(R.id.del).setOnClickListener(newView.OnClickListener() {
public voidonClick(View v) {
mAdapter.remove(2);
}
});
//执行点击item进行展开操作
mAdapter.setOnItemClickListener(newMyBaseAdapter.OnItemClickListener() {
public voidonItemClick(MyBaseAdapter.BaseViewHolder holder,View view, intposition) {
holder.expand();
Log.e("xxx",position +"");
}
});
刷新完后操作,记得调用
mAdapter.setFirstOnly(true);
mRecyclerView.refreshComplete();
加载完后操作:
mRecyclerView.refreshComplete();
mRecyclerView.loadMoreComplete();
如果没有数据了,调用
//也可以不传递参数,默认会显示空白
mRecyclerView.noMoreLoading("没有了");
Adapter:

需要继承MyBaseAdapter,主要介绍onCreateViewHolder的功能

publicViewHolderonCreateViewHolder(ViewGroup parent, intviewType) {
//添加滑动item删除按钮,可根据具体情况是否添加
addSwipe(R.layout.swipe_default2,SwipeLayout.ShowMode.LayDown,SwipeLayout.DragEdge.Right, true);
//添加展开详情,可根据具体情况是否添加,如何展开上面已经有介绍了。
addExpand(R.layout.expand_default);
//item布局
return newViewHolder(setLayout(R.layout.item,parent));
}

</br>

2.谷歌自带刷新样式:

xml:其实就是在外层嵌入SwipeRefreshLayout
<com.yanxuwen.MyRecyclerview.MySwipeRefreshLayout
    android:id="@+id/refreshLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <com.yanxuwen.MyRecyclerview.MyRecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    />
/>
java:代码几乎跟上面的写法是一样的,无非就是取消了下拉刷新用谷歌刷新替代,更改上拉加载样式,所以主要介绍变动的代码
//设置加载样式,为MaterialDesign样式,也就是类似谷歌刷新的样式
mRecyclerView.setLoadingMoreProgressStyle(ProgressStyle.MaterialDesign);
//注意设置MaterialDesign类型的时候,要单独的在设置下颜色,最好以SwipeRefreshLayout颜色拼配
if(mRecyclerView!=null&&mRecyclerView.getMaterialProgressView()!=null){
      mRecyclerView.getMaterialProgressView().setColorSchemeResources(R.color.black);
}
//【重点,一定要调用】注意由于下来刷新用的是谷歌的,,则要设置下谷歌刷新标识
mRecyclerView.setGoogleRefresh(true,mSwipeRefreshLayout);
//启动可以刷新,由于启动了谷歌刷新,该句不需要调用
//mRecyclerView.setPullRefreshEnabled(true);
//启动可以加载
mRecyclerView.setLoadingMoreEnabled(true);
//执行刷新,【注意,这里的谷歌刷新我们在封装了一层MySwipeRefreshLayout,如果使用的是MySwipeRefreshLayout,
 //mSwipeRefreshLayout.setRefreshing(true);会自动开启刷新,如果使用的是系统的MySwipeRefreshLayout,则还需要调
 //用onRefresh(),这些大家都指定,就不需要我多说了】
//执行刷新
mSwipeRefreshLayout.setRefreshing(true);

</br>

3.城市列表:

xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/white">

    </android.support.v7.widget.RecyclerView>

    <com.yanxuwen.PinnedHeader.IndexBar.widget.IndexBar
        android:id="@+id/indexBar"
        android:layout_width="24dp"
        android:layout_height="match_parent"
        android:layout_marginTop="150dp"
        android:layout_marginBottom="150dp"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        app:indexBarPressBackground="#00000000"
        app:textColor="#3388FF"
        app:indexBarTextSize="12sp"/>

    <TextView
        android:id="@+id/tvSideBarHint"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minWidth="80dp"
        android:minHeight="80dp"
        android:layout_gravity="center"
        android:background="@drawable/shape_side_bar_bg"
        android:gravity="center"
        android:layout_centerInParent="true"
        android:textColor="@android:color/white"
        android:textSize="48sp"
        android:visibility="gone"
        android:padding="10dp"
        tools:text="A"
        tools:visibility="visible"/>

</RelativeLayout>

java:
mRv = (RecyclerView) findViewById(R.id.rv);
mRv.setLayoutManager(mManager = new LinearLayoutManager(this));
mAdapter = new CityAdapter(this, mDatas);
mHeaderAdapter = new HeaderRecyclerAndFooterWrapperAdapter(mAdapter) {
protected void onBindHeaderHolder(ViewHolder holder, int headerPos, int layoutId, Object o) {
                holder.setText(R.id.tvCity, (String) o);
        }
 };
mHeaderAdapter.addHeaderView(R.layout.item_city, "测试头部");
mHeaderAdapter.addHeaderView(R.layout.item_city, "测试头部2");
mRv.setAdapter(mHeaderAdapter);
//添加头部导航
mRv.addItemDecoration(mDecoration = new SuspensionDecoration(this, mDatas).setHeaderViewCount(mHeaderAdapter.getHeaderViewCount()));
mRv.addItemDecoration(new DividerItemDecoration(PinnedHeaderActivity.this, LinearLayoutManager.VERTICAL));
//使用indexBar
mTvSideBarHint = (TextView) findViewById(R.id.tvSideBarHint);//HintTextView
mIndexBar = (IndexBar) findViewById(R.id.indexBar);//IndexBar
mIndexBar.setPressedShowTextView(mTvSideBarHint)//设置HintTextView
                .setNeedRealIndex(true)//设置需要真实的索引
                .setLayoutManager(mManager);//设置RecyclerView的LayoutManager
 initDatas(getResources().getStringArray(R.array.provinces));
initDatas:
   mDatas = new ArrayList<>();
                for (int i = 0; i < data.length; i++) {
                    CityBean cityBean = new CityBean();
                    cityBean.setCity(data[i]);//设置城市名称
                    mDatas.add(cityBean);
                }

                mIndexBar
                       //设置悬停头部如A,B,C,D,跟索引进行关联
                        .setSuspensionDecoration(mDecoration)
                        //是否需要根据实际的数据来生成索引数据源(例如 只有 A B C 三种tag,那么索引栏就 A B C 三项),如果为false索引栏就会显示从A到Z的数据
                        .setNeedRealIndex(true)
                        //设置是否排序,默认true强制从A到Z进行排序,false则会按照给的数据顺序进行排序,而且会自动隐藏索引栏
                        .setIsSort(true)
                        .setSourceDatas(mDatas)//设置数据
                        .setHeaderViewCount(mHeaderAdapter.getHeaderViewCount())//设置HeaderView数量
                        .invalidate();

                mAdapter.setDatas(mDatas);
                mHeaderAdapter.notifyDataSetChanged();
Adapter:跟上面的Adapter没什么区别,这里就不需要多介绍
CityBean 重点,一定要继承BaseIndexPinyinBean
public class CityBean extends BaseIndexPinyinBean {

    private String city;//城市名字

    public CityBean() {
    }

    public CityBean(String city) {
        this.city = city;
    }

    public String getCity() {
        return city;
    }

    public CityBean setCity(String city) {
        this.city = city;
        return this;
    }

    /**
     * 是否需要被转化成拼音,
     * true的话,头部跟索引都会将getTarget值转换为拼音
     * 【这里给ab值做了特殊处理,如果是ab则不强制转换为拼音】
     */
    @Override
    public boolean isNeedToPinyin() {
        return  city.equals("ab")?false:true;
    }

    /**
     * 前提【isNeedToPinyin为false,才能显示是全文,不然都getTarget的首拼】
     * 头部跟索引的值,isNeedToPinyin为true则会自动转换为拼音首字母,false的话则原文显示
     * 【这里做了特殊处理,如果是ab值,则头部显示"&%%"标记,其他显示Aab】
     */
    @Override
    public String getTarget() {
        return  city.equals("ab")?"&%%":city;
    }


    /**
     *  前提【isNeedToPinyin为false,才能自定义,不然无线】
     * 自定义索引值
     */
    public String getIndexString() {
        return  city.equals("ab")?"&":null;
    }

    /**
     * 是否需要显示悬停title
     */
    @Override
    public boolean isShowSuspension() {
        return true;
    }
}

github代码:https://github.com/yanxuwen/MyRecyclerView
微信公众号:
qrcode_for_gh_8e99f824c0d6_344.jpg

喜欢就在github star下,非常感谢o(∩_∩)o~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,364评论 25 707
  • 原来年少时的欢喜 是受了很多委屈,却都不介意 后来再遇到其他人 吹毛求疵跟你较真 而你也不愿多说什么 心中小鹿已经...
    石坚强阅读 980评论 2 14
  • 书一拿到手,不禁让人望而生畏。捧在手上,沉甸甸的历史厚重感,仿佛捧起了那个丝绸之路的大背景下满满的精髓与记忆。足足...
    鲸小奇fir阅读 545评论 0 0
  • 一个人为什么要努力? 因为虽然未来总是未知,但只要你肯努力,你想要的,岁月都会给你。 1一个人为什么要努力? 因为...
    猎豹七七阅读 409评论 0 2