定制SwipeRefreshLayout

定制SwipeRefreshLayoutSwipeRefreshLayout大家都用过,google推出的,亲生儿子,兼容性自然最好!可是SwipeRefreshLayout只支持下拉刷新,没有上拉加载更多,这样是没办法满足我们的需要的,所以本文就对它进行一下定制,加上下拉刷新。首先贴用法:xml:

大家好,又见面了,我是你们的朋友全栈君。

SwipeRefreshLayout大家都用过,google推出的,亲生儿子,兼容性自然最好!可是SwipeRefreshLayout只支持下拉刷新,没有上拉加载更多,这样是没办法满足我们的需要的,所以本文就对它进行一下定制,加上下拉刷新。

首先贴用法:

xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffccee"
    android:orientation="vertical" >

    <com.utilslibrary.widget.SuperSwipeLayout
        android:id="@+id/swipeRefreshLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <ListView
            android:id="@+id/listView"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >
        </ListView>
    </com.utilslibrary.widget.SuperSwipeLayout>

</LinearLayout>

Activity 里面只需要这样设置即可:

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.widget.SwipeRefreshLayout;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.utilslibrary.widget.SuperSwipeLayout;

import java.util.ArrayList;
public class SwipeRefreshLayoutActivity extends Activity {
    private SuperSwipeLayout swipeRefreshLayout;
    private ArrayList<String> data = new ArrayList<String>();
    private ArrayAdapter<String> adapter;
    int loadNum;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_swipe_refresh_layout);

        adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, data);

        swipeRefreshLayout = (SuperSwipeLayout) findViewById(R.id.swipeRefreshLayout);
        ListView listView = (ListView) findViewById(R.id.listView);

        //下拉刷新监听
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            // SwipeRefreshLayout接管其包裹的ListView下拉事件。
            // 每一次对ListView的下拉动作,将触发SwipeRefreshLayout的onRefresh()。
            @Override
            public void onRefresh() {
                System.out.println("======fresh...");
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        adapter.clear();
                        for(int i = 0; i < 20; i ++){
                            adapter.add(i + "");
                        }
                        swipeRefreshLayout.stopFreshing(false);
                        loadNum = 0;
                    }
                }, 3500);
            }
        });

        //加载更多的监听
        swipeRefreshLayout.setOnReLoadListener(new SuperSwipeLayout.OnReLoadListener() {
            @Override
            public void onLoad() {
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        for(int i = 0; i < 10; i ++){
                            data.add("loadMore: " + loadNum + " - " + i);
                        }
                        //一页的更多加载完了
                        swipeRefreshLayout.stopReLoad();
                        adapter.notifyDataSetChanged();
                        loadNum++;

                        if(loadNum >= 3){
                            //没有更多了
                            swipeRefreshLayout.ReLoadComplete();
                        }
                    }
                }, 1500);
            }
        });

        listView.setAdapter(adapter);
        swipeRefreshLayout.startRefresh();
    }
}


//看到没?用法是不是超简单?哈哈~下面看实现:

import android.content.Context;
import android.database.DataSetObserver;
import android.graphics.drawable.AnimationDrawable;
import android.support.v4.widget.SwipeRefreshLayout;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.AbsListView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import com.utilslibrary.R;
/**
* 定制SwipeRefreshLayout实现自动刷新,加载更多
* Created by sam on 17/2/22.
*/
public class SuperSwipeLayout extends SwipeRefreshLayout {
public static final int PULL_STATUS_NOMAL = 0;//正常狀態
public static final int PULL_STATUS_REFRESHING = 1;//正在刷新
public static final int PULL_STATUS_LOADMORE = 2;//正在加载更多
public static final int PULL_STATUS_LOADMORE_STOP = 3;//已经加载完更多
Context mContext;
ListView mListView;
OnReLoadListener mOnReLoadListener;
View mFooterView;
View mLoreMoreView;//加载更多的view
LinearLayout mFooterLayout;//整个footer的布局
LinearLayout mFooterLayoutGroup;//自定义footerView的父布局
SwipeRefreshLayout.OnRefreshListener mOnRefreshListener;
TextView mLoadMoreTextView;
ImageView mLoadMoreImage;
private int mStatus;
String mReLoadingText, mNoMoreText;
public SuperSwipeLayout(Context context) {
super(context);
init(context);
}
public SuperSwipeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
/**
* 初始化样式
*/
private void initRefreshStyle(){
//加载颜色是循环播放的,只要没有完成刷新就会一直循环
setColorSchemeResources(
android.R.color.holo_blue_bright,
android.R.color.holo_orange_light,
android.R.color.holo_green_light,
android.R.color.holo_red_light,
android.R.color.holo_purple
);
}
private void initLoadTextRes(){
mReLoadingText = "正在加载更多...";
mNoMoreText = "没有更多了~";
}
public ListView getListView(){
return mListView;
}
private void init(Context context) {
this.mContext = context;
initRefreshStyle();
initLoadTextRes();
mLoreMoreView = createLoadView(context);
mLoadMoreTextView = (TextView) mLoreMoreView.findViewWithTag("tv_loadmoer");
mLoadMoreImage = (ImageView) mLoreMoreView.findViewWithTag("image_loading");
mLoreMoreView.setVisibility(View.GONE);
AnimationDrawable anim = (AnimationDrawable) mLoadMoreImage.getBackground();
anim.start();
mFooterLayoutGroup = new LinearLayout(mContext);
mFooterLayoutGroup.setOrientation(LinearLayout.VERTICAL);
mFooterLayout = new LinearLayout(mContext);
mFooterLayout.setOrientation(LinearLayout.VERTICAL);
LinearLayout.LayoutParams footerParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
dipToPixels(context, 45));
footerParams.gravity = Gravity.CENTER;
mFooterLayout.addView(mFooterLayoutGroup);//外部添加的footerView
mFooterLayout.addView(mLoreMoreView, footerParams);//加载更多view
mListView = new ListView(context);
mListView.addFooterView(mFooterLayout);
addView(mListView, new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (mStatus == PULL_STATUS_LOADMORE_STOP) {
return;
}
// 当不滚动时
if (mStatus != PULL_STATUS_LOADMORE
&& scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
// 判断是否滚动到底部
if (view.getLastVisiblePosition() == view.getCount() - 1) {
if (null != mListView && mListView.getFooterViewsCount() == 0) {
mLoreMoreView.setVisibility(View.INVISIBLE);
return;
}
//加载更多佈局的代码
mOnReLoadListener.onLoad();
setStatus(PULL_STATUS_LOADMORE);
}
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}
});
getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//这里要减去footerview
//
int defaultViewCount = mListView.getHeaderViewsCount() + mListView.getFooterViewsCount();
if (null != mOnReLoadListener && mListView.getCount() > defaultViewCount) {
mLoreMoreView.setVisibility(View.VISIBLE);
System.out.println("===onGlobalLayout " + mListView.getCount());
return;
}
}
});
}
private View createLoadView(Context context){
LinearLayout layout = new LinearLayout(context);
layout.setOrientation(LinearLayout.HORIZONTAL);
ImageView imageView = new ImageView(context);
imageView.setTag("image_loading");
TextView textView = new TextView(context);
textView.setTag("tv_loadmoer");
LinearLayout.LayoutParams imageParams = new LinearLayout.LayoutParams(dipToPixels(context, 40),
dipToPixels(context, 40));
imageParams.gravity = Gravity.CENTER;
imageView.setBackgroundResource(R.drawable.progressbar);
layout.addView(imageView, imageParams);
LinearLayout.LayoutParams textParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
textParams.gravity = Gravity.CENTER;
layout.addView(textView, textParams);
return layout;
}
private int dipToPixels(Context context, float dip){
return (int)(context.getResources().getDisplayMetrics().density * dip);
}
private void setStatus(int status){
mStatus = status;
switch (status){
case PULL_STATUS_NOMAL:
mLoadMoreTextView.setText(mReLoadingText);
break;
case PULL_STATUS_LOADMORE:
mLoreMoreView.setVisibility(View.VISIBLE);
mLoadMoreImage.setVisibility(View.VISIBLE);
mLoadMoreTextView.setText(mReLoadingText);
break;
case PULL_STATUS_LOADMORE_STOP:
mLoadMoreTextView.setText(mNoMoreText);
mLoadMoreImage.setVisibility(View.GONE);
break;
case PULL_STATUS_REFRESHING:
break;
}
}
/**
* 更多加载完成
*/
public void stopReLoad(){
setStatus(PULL_STATUS_NOMAL);
}
/**
* 没有更多了~
*/
public void ReLoadComplete(){
setStatus(PULL_STATUS_LOADMORE_STOP);
}
/**
* 这里说一下,一般listview加载更多是没有footerview的,
* 但我这样把它加进去了,mFooterLayout是整个footerview的容器,是线性布局的,当然你也可以改
* 加载更多的view会拼在addFooterView这个传进来的view下面
* @param footerView
*/
public void addFooterView(View footerView){
if(null == mFooterLayoutGroup || mFooterLayoutGroup.getChildCount() > 0){
return;
}
mFooterLayoutGroup.addView(footerView,
new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
}
public void removeFooterView(){
if(null != mFooterLayoutGroup && mFooterLayoutGroup.getChildCount() > 0){
mFooterLayoutGroup.removeAllViews();
}
}
/**
* 自动刷新
*/
public void startRefresh(){
this.post(new Runnable() {
@Override
public void run() {
setStatus(PULL_STATUS_REFRESHING);
setRefreshing(true);
mOnRefreshListener.onRefresh();
}
});
}
public void stopFreshing(boolean fresh){
if(fresh){
setStatus(PULL_STATUS_REFRESHING);
}else{
setStatus(PULL_STATUS_NOMAL);
}
super.setRefreshing(fresh);
}
public void setOnRefreshListener(SwipeRefreshLayout.OnRefreshListener listener){
mOnRefreshListener = listener;
super.setOnRefreshListener(mOnRefreshListener);
}
public void setOnReLoadListener(OnReLoadListener listener){
this.mOnReLoadListener = listener;
}
public interface OnReLoadListener{
public void onLoad();
}
}


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/152935.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • oracle 触发器通知,Oracle触发器详细介绍

    oracle 触发器通知,Oracle触发器详细介绍欢迎进入Oracle社区论坛,与200万技术人员互动交流>>进入触发器是特定事件出现的时候,自动执行的代码块。类似于存储过程,但是用户不能直接调用他们。功能:1、允许/限制对表的修改2、自动生成派生列,比如自增字段3、强制数据一致性4、提供欢迎进入Oracle社区论坛,与200万技术人员互动交流>>进入触发器是特定事件出现的时候,自动执行的代…

  • vue 富文本编辑框_基于vue的富文本编辑器

    vue 富文本编辑框_基于vue的富文本编辑器1、下载插件npmiwangeditor–save插件官网地址:https://www.wangeditor.com/2、封装富文本组件<templatelang=”html”><divclass=”editor”><!–<divref=”toolbar”class=”toolbar”></div>–><divref=”editor”class=”text”></div

  • [Unity3D]Unity4全新的动画系统Mecanim

    [Unity3D]Unity4全新的动画系统Mecanim

    2021年12月17日
  • Matlab GUI上位机界面实现串口通信

    Matlab GUI上位机界面实现串口通信MatlabGUI因项目需求,不得不学的又杂又浅,趁着还没彻底忘记,写下来一些关键注意点。命令行窗口输入guide→BlankGUI→确定根据自己的需求,拖动选择对应的工具,如下图所示双击每一个对象,就可以弹出其检查器,修改其属性,字体大小、粗细、位置等,其中最关键的是两个,一是String,二是Tag,String是用来修改对象中的文字,Tag是所调用的代码名,这个要好的…

  • 计算机网络协议(三)——UDP、TCP、Socket[通俗易懂]

    计算机网络协议(三)——UDP、TCP、Socket[通俗易懂]底层网络知识详解:最重要的传输层概述一、UDP协议二、TCP协议2.1TCP的三次握手概述这个专栏的计算机网络协议,我是在极客时间上学习已经有三万多人购买的刘超老师的趣谈网络协议专栏,讲的特别好,像看小说一样学习到了平时很枯燥的知识点,计算机网络的书籍太枯燥,感兴趣的同学可以去付费购买,绝对物超所值,本文就是对自己学习专栏的总结,评论区可以留下你的问题,咱们一起讨论!传输层中有两…

  • 屏幕硬件参数选取

    屏幕硬件参数选取

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号