1. 程式人生 > >自定義RecyclerView實現下拉重新整理和上拉載入

自定義RecyclerView實現下拉重新整理和上拉載入

2)尾部佈局(上拉載入部分):refresh_recyclerview_footer.xml
<span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:gravity="center"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <ProgressBar
        android:indeterminateDrawable="@drawable/custom_progressbar"
        android:layout_margin="5dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:text="載入更多中...."
        android:textColor="#ff0000"
        android:textSize="25sp"
        android:layout_marginLeft="10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout></span>


3)自定義ProgressBar樣式custom_progressbar.xml
<span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="0"
    android:toDegrees="360"
    android:pivotX="50%"
    android:pivotY="50%">
    <shape android:shape="ring"
        android:innerRadiusRatio="2.5"
        android:thicknessRatio="15"
        android:useLevel="false"
        >
        <gradient android:startColor="#ff0000"
            android:endColor="#ffffff"
            android:centerColor="#88ff0000"
            android:type="sweep"></gradient>
    </shape>
</rotate></span>
程式碼如下:

public class RefreshRecyclerView extends RecyclerView {

    private final Context mContext;
//    頂部檢視,下拉重新整理控制元件
    private LinearLayout headerView;
//    正在重新整理狀態的進度條
    private ProgressBar pb_header_refresh;
//    重新整理箭頭
    private ImageView iv_header_refresh;
//    顯示重新整理狀態
    private TextView tv_status;
//    顯示最近一次的重新整理時間
    private TextView tv_time;
//    轉到下拉重新整理狀態時的動畫
    private RotateAnimation downAnima;
//     轉到釋放重新整理狀態時的動畫
    private RotateAnimation upAnima;
    //觸控事件中按下的Y座標,初始值為-1,為防止ACTION_DOWN事件被搶佔
    private float startY = -1;
//    下拉重新整理控制元件的高度
    private int pulldownHeight;
    //    重新整理狀態:下拉重新整理
    private final int PULL_DOWN_REFRESH = 0;
    //    重新整理狀態:釋放重新整理
    private final int RELEASE_REFRESH = 1;
    //    重新整理狀態:正常重新整理
    private final int REFRESHING = 2;

    //    當前頭佈局的狀態-預設為下拉重新整理
    private int currState = PULL_DOWN_REFRESH;
//
    private RefreshRecyclerView.OnRefreshListener mOnRefreshListener;
//    尾部檢視
    private View footerView;
//    尾部試圖(上拉載入控制元件)的高度
    private int footerViewHeight;
//    判斷是否是載入更多
    private boolean isLoadingMore;

    public RefreshRecyclerView(Context context) {
        this(context, null);
    }

    public RefreshRecyclerView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public RefreshRecyclerView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mContext = context;
        initHeaderView();
        initFooterView();
    }
    /**
     * 返回尾部佈局,供外部呼叫
     * @return
     */
    public View getFooterView(){
        return footerView;
    }
    /**
     * 返回頭部佈局,供外部呼叫
     * @return
     */
    public View getHeaderView(){
        return headerView;
    }

    /**
     * 通過HeaderAndFooterWrapper物件給RecyclerView新增尾部
     * @param footerView 尾部檢視
     * @param headerAndFooterWrapper RecyclerView.Adapter的包裝類物件,通過它給RecyclerView新增尾部檢視
     */
    public void addFooterView(View footerView, HeaderAndFooterWrapper headerAndFooterWrapper) {
        headerAndFooterWrapper.addFooterView(footerView);
    }

    /**
     * 通過HeaderAndFooterWrapper物件給RecyclerView新增頭部部
     * @param headerView 尾部檢視
     * @param headerAndFooterWrapper RecyclerView.Adapter的包裝類物件,通過它給RecyclerView新增頭部檢視
     */
    public void addHeaderView(View headerView,HeaderAndFooterWrapper headerAndFooterWrapper) {
        headerAndFooterWrapper.addHeaderView(headerView);
    }


初始化頭部佈局和尾部佈局
 private void initHeaderView() {
        headerView = (LinearLayout) View.inflate(mContext, R.layout.refresh_recyclerview_header, null);
        tv_time = (TextView) headerView.findViewById(R.id.tv_time);
        tv_status = (TextView) headerView.findViewById(R.id.tv_status);
        iv_header_refresh = (ImageView) headerView.findViewById(R.id.iv_header_refresh);
        pb_header_refresh = (ProgressBar) headerView.findViewById(R.id.pb_header_refresh);
        headerView.measure(0, 0);
        pulldownHeight = headerView.getMeasuredHeight();
        headerView.setPadding(0, -pulldownHeight, 0, 0);
        //初始化頭部佈局的動畫
        initAnimation();
    }
 /**
     * 重新整理狀態改變時的動畫
     */
    private void initAnimation() {
//        從下拉重新整理狀態轉換為釋放重新整理狀態
        upAnima = new RotateAnimation(0, -180, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        upAnima.setFillAfter(true);
        upAnima.setDuration(500);
//         轉到下拉重新整理的動畫
        downAnima = new RotateAnimation(-180, -360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        downAnima.setFillAfter(true);
        downAnima.setDuration(500);
    }

 private void initFooterView() {
        footerView = View.inflate(mContext, R.layout.refresh_recyclerview_footer, null);
        footerView.measure(0, 0);
        //得到控制元件的高
        footerViewHeight = footerView.getMeasuredHeight();
        //預設隱藏下拉重新整理控制元件
        // View.setPadding(0,-控制元件高,0,0);//完全隱藏
        //View.setPadding(0, 0,0,0);//完全顯示
        footerView.setPadding(0, -footerViewHeight, 0, 0);
//        addFooterView(footerView);
//        自己監聽自己
        this.addOnScrollListener(new MyOnScrollListener());
    }

重寫onTouchEvent()方法,startY表示按下時的座標,但是有可能ACTION_DOWN事件被強佔,那麼case MotionEvent.ACTION_DOWN:就沒機會執行。所以case MotionEvent.ACTION_MOVE:子句時首先判斷startY是否為-1,是的話把第一次移動的座標當作按下時的坐
標。然後判斷當前的狀態,如果正在重新整理就不必再次執行下面的重新整理程式碼,直接跳出。dY>0表示使用者正在執行下拉操作,因為頭部檢視初始座標為-pulldownHeight,所以手指在螢幕上滑動多少距離,頂部檢視的y座標就應該增加相應值。paddingTop==0是一個狀態
分界線,paddingTop < 0 是下拉重新整理狀態,大於0是釋放重新整理狀態。根據paddingTop的值跳轉相應的狀態。最後在手指擡起的時候,首先重置startY = -1;然後判斷重新整理狀態,如果是下拉重新整理(頭部檢視沒有完全顯示)就設定下拉控制元件為預設隱藏狀態,如果是釋放
重新整理狀態(paddingTop > 0),就跳轉到正在重新整理狀態,並讓下拉控制元件完全顯示同時呼叫使用者的回撥事件,重新整理頁面資料。
 @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                startY = ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                //防止ACTION_DOWN事件被搶佔,沒有執行
                if (startY == -1) {
                    startY = ev.getY();
                }
                float endY = ev.getY();
                float dY = endY - startY;
                //判斷當前是否正在重新整理中
                if (currState == REFRESHING) {
                    //如果當前是正在重新整理,不執行下拉重新整理了,直接break;
                    break;
                }
//                如果是下拉
                if (dY > 0) {
                    int paddingTop = (int) (dY - pulldownHeight);
                    if (paddingTop > 0 && currState != RELEASE_REFRESH) {
                        //完全顯示下拉重新整理控制元件,進入鬆開重新整理狀態
                        currState = RELEASE_REFRESH;
                        refreshViewState();
                    } else if (paddingTop < 0 && currState != PULL_DOWN_REFRESH) {
                        //沒有完全顯示下拉重新整理控制元件,進入下拉重新整理狀態
                        currState = PULL_DOWN_REFRESH;
                        refreshViewState();
                    }
                    headerView.setPadding(0, paddingTop, 0, 0);
                }
                break;
            case MotionEvent.ACTION_UP:
                //5.重新記錄值
                startY = -1;
                if (currState == PULL_DOWN_REFRESH) {
                    //設定預設隱藏
                    headerView.setPadding(0, -pulldownHeight, 0, 0);
                } else if (currState == RELEASE_REFRESH) {
                    //當前是釋放重新整理,進入到正在重新整理狀態,完全顯示
                    currState = REFRESHING;
                    refreshViewState();
                    headerView.setPadding(0, 0, 0, 0);
                    //呼叫使用者的回撥事件,重新整理頁面資料
                    if (mOnRefreshListener != null) {
                        mOnRefreshListener.onPullDownRefresh();
                    }
                }
                break;
        }
        return super.onTouchEvent(ev);
    }
 /**
     * 跳轉重新整理狀態
     */
    private void refreshViewState() {
        switch (currState) {
//            跳轉到下拉重新整理
            case PULL_DOWN_REFRESH:
                iv_header_refresh.startAnimation(downAnima);
                tv_status.setText("下拉重新整理");
                break;
//            跳轉到釋放重新整理
            case RELEASE_REFRESH:
                iv_header_refresh.startAnimation(upAnima);
                tv_status.setText("釋放重新整理");
                break;
//            跳轉到正在重新整理
            case REFRESHING:
                iv_header_refresh.clearAnimation();
                iv_header_refresh.setVisibility(GONE);
                pb_header_refresh.setVisibility(VISIBLE);
                tv_status.setText("正在重新整理中.....");
                break;
        }
    }
定義介面
/**
 * 定義下拉重新整理和上拉載入的介面
 */
public interface OnRefreshListener {
    /**
     * 當下拉重新整理時觸發此方法
     */
    void onPullDownRefresh();

    /**
     * 當載入更多的時候回撥這個方法
     */
    void onLoadingMore();

}
public void setOnRefreshListener(RefreshRecyclerView.OnRefreshListener listener) {
        this.mOnRefreshListener = listener;
 }

 /**
     * 當重新整理完資料之後,呼叫此方法,把標頭檔案隱藏,並且狀態設定為初始狀態
     * @param isSuccess
     */
    public void onFinishRefresh(boolean isSuccess) {
        if (isLoadingMore) {
            footerView.setPadding(0, -footerViewHeight, 0, 0);
            isLoadingMore = false;
        } else {
            headerView.setPadding(0, -pulldownHeight, 0, 0);
            currState = PULL_DOWN_REFRESH;
            iv_header_refresh.setVisibility(VISIBLE);
            pb_header_refresh.setVisibility(GONE);
            tv_status.setText("下拉重新整理");
            if (isSuccess) {
                //設定更新時間
                tv_time.setText(getSystemTime());
            }
        }
    }

    private String getSystemTime() {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return dateFormat.format(new Date());
    }
上拉載入邏輯的實現,重寫onScrollStateChanged()方法。如果newState為空閒狀態或者是快速滑動狀態就判斷RecyclerView的最後一個可見Item的索引是否 >= getChildCount()-1。是的話就觸發載入更多事件,完全顯示上拉載入控制元件並呼叫回撥事件。這裡要注意:ListView是SCROLL_STATE_FLING而RecyclerView是SCROLL_STATE_SETTLING,ListView得到最後一個可見Item索引直接
getLastVisiblePosition()方法就行了。RecyclerView比較麻煩:首先要判斷佈局管理器是否是線性佈局管理器,因為只有LinearLayoutManager才有查詢第一個和最後一個可見View位置的方法。
 private class MyOnScrollListener extends OnScrollListener {
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
//            super.onScrollStateChanged(recyclerView, newState);
            if (newState == SCROLL_STATE_IDLE || newState == SCROLL_STATE_SETTLING) {
                //判斷是當前layoutManager是否為LinearLayoutManager
                // 只有LinearLayoutManager才有查詢第一個和最後一個可見view位置的方法
                LayoutManager layoutManager = recyclerView.getLayoutManager();
                if (layoutManager instanceof LinearLayoutManager) {
                    LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager;
                    //當停止滾動時或者慣性滾動時,RecyclerView的最後一個顯示的條目:getCount()-1
//                    注意是findLastVisibleItemPosition()而不是getLastVisiblePosition
                    if (linearLayoutManager.findLastVisibleItemPosition() >= getChildCount() - 1) {
                        isLoadingMore = true;
                        //把底部載入顯示
                        footerView.setPadding(0, 0, 0, 0);
                        if (mOnRefreshListener != null) {
                            mOnRefreshListener.onLoadingMore();
                        }
                    }
                }
            }
        }
    }

     第三步:使用 自定義的RecyclerView
首先上佈局

<?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:orientation="vertical">

    <com.example.refreshrecyclerview_library.RefreshRecyclerView
        android:id="@+id/custom_recyclerview"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:cacheColorHint="@android:color/transparent"
        android:divider="@null"
        android:fadingEdge="none" />

</LinearLayout>

測試程式碼

public class MainActivity extends Activity {


    private static final int REFRESH = 0;
    private static final int LOADMORE = 1;
    private HeaderAndFooterWrapper headerAndFooterWrapper;
    private RefreshRecyclerViewAdapter recyclerAdapter;
    private RefreshRecyclerView custom_recyclerview;
    private Handler handler = new Handler(){
        public void handleMessage(Message msg){
            switch (msg.what) {
                case REFRESH:
                    custom_recyclerview.onFinishRefresh(true);
                    break;
                case LOADMORE:
                    custom_recyclerview.onFinishRefresh(false);
                    break;
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        custom_recyclerview = (RefreshRecyclerView) findViewById(R.id.custom_recyclerview);
        initRefreshRecyclerView();
    }

    private void initRefreshRecyclerView() {
//        給Recycler設定分割線
        custom_recyclerview.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
        recyclerAdapter = new RefreshRecyclerViewAdapter(this);
        headerAndFooterWrapper = new HeaderAndFooterWrapper(recyclerAdapter);
//        不要忘記設定佈局管理器
        custom_recyclerview.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
        custom_recyclerview.setAdapter(headerAndFooterWrapper);
        custom_recyclerview.addHeaderView(custom_recyclerview.getHeaderView(), headerAndFooterWrapper);
        custom_recyclerview.addFooterView(custom_recyclerview.getFooterView(), headerAndFooterWrapper);
        custom_recyclerview.setOnRefreshListener(new OnRecyclerRefreshListener());
    }

    private class OnRecyclerRefreshListener implements RefreshRecyclerView.OnRefreshListener {
        @Override
        public void onPullDownRefresh() {
//           執行下拉重新整理操作,一般是聯網更新資料
            new Thread(new Runnable() {
                @Override
                public void run() {
                    SystemClock.sleep(2000);
                    handler.sendEmptyMessage(REFRESH);
                }
            }).start();
        }

        @Override
        public void onLoadingMore() {
//            執行上拉載入操作,一般是聯網請求更多分頁資料
            new Thread(new Runnable() {
                @Override
                public void run() {
                    SystemClock.sleep(2000);
                    handler.sendEmptyMessage(LOADMORE);
                }
            }).start();
        }
    }
}
<pre name="code" class="java">
public class RefreshRecyclerViewAdapter extends RecyclerView.Adapter<RefreshRecyclerViewAdapter.ViewHolder> {

    private Context mContext;
    private List<String> datas;

    public RefreshRecyclerViewAdapter(Context mContext) {
        this.mContext = mContext;
        datas = new ArrayList<>();
       for(int i = 1; i <= 20; i++) {
         datas.add("我是Content :"+i);
       }
    }

    @Override
    public RefreshRecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View convertView = View.inflate(mContext, R.layout.item_recycler, null);
        return new ViewHolder(convertView);
    }

    @Override
    public void onBindViewHolder(RefreshRecyclerViewAdapter.ViewHolder holder, final int position) {
        String data = datas.get(position);
        holder.tv_content.setText(data);
    }

    @Override
    public int getItemCount() {
        return datas.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        TextView tv_content;

        public ViewHolder(final View itemView) {
            super(itemView);
            tv_content = (TextView) itemView.findViewById(R.id.tv);
        }
    }
}

  這裡還用到一個分割線的類,RecyclerView預設是沒有分割線的,這段程式碼可以直接貼上使用
public class DividerItemDecoration extends RecyclerView.ItemDecoration {

    public final static int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
    public final static int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
    private int mOrientation;
    private Drawable mDivider;
    private static final int[] ATTRS = new int[]{android.R.attr.listDivider};

    public DividerItemDecoration(Context context, int mOrientation) {
        final TypedArray a = context.obtainStyledAttributes(ATTRS);
        mDivider = a.getDrawable(0);
        a.recycle();
        setOrientation(mOrientation);

    }

    private void setOrientation(int mOrientation) {
        if (mOrientation != VERTICAL_LIST && mOrientation != HORIZONTAL_LIST) {
            throw new IllegalArgumentException("Invalid orientation");
        } else {
            this.mOrientation = mOrientation;
        }
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        super.onDraw(c, parent, state);
        if (mOrientation == VERTICAL_LIST) {
            drawVertical(c, parent);
        } else if (mOrientation == HORIZONTAL_LIST) {
            drawHorizontal(c, parent);
        }
    }

    private void drawVertical(Canvas c, RecyclerView parent) {
        int left = parent.getPaddingLeft();
        int right = parent.getWidth() - parent.getPaddingRight();
        int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View child = parent.getChildAt(i);
            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
            int top = child.getBottom() + params.bottomMargin;
            int bottom = top + mDivider.getIntrinsicHeight();
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }
    }

    private void drawHorizontal(Canvas c, RecyclerView parent) {
        int top = parent.getPaddingTop();
        int bottom = parent.getHeight() - parent.getPaddingBottom();
        int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View child = parent.getChildAt(i);
            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
            int left = child.getRight() + params.rightMargin;
            int right = left + mDivider.getIntrinsicHeight();
            mDivider.setBounds(left,top,right,bottom);
            mDivider.draw(c);
        }

    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
//        super.getItemOffsets(outRect, view, parent, state);
        if(mOrientation == VERTICAL_LIST) {
            outRect.set(0,0,0,mDivider.getIntrinsicHeight());
        }else{
            outRect.set(0,0,mDivider.getIntrinsicHeight(),0);
        }
    }
}

github程式碼連結:https://github.com/18895612697/CustomRefreshRecyclerView

相關推薦

定義RecyclerView實現重新整理載入

2)尾部佈局(上拉載入部分):refresh_recyclerview_footer.xml<span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andro

定義RecyclerView實現重新整理載入(第一種實現方式)

說明:該自定義RecyclerView只適用於layoutManager為LinearLayoutManager的情況,使用的還是RecyclerView.Adapter。效果圖使用1、編寫layout檔案<?xml version="1.0" encoding="ut

定義ListView實現重新整理載入

實現ListView的下拉重新整理和上拉載入,需要先新增headerView和footerView,通過在拖動的過程中,控制頭尾佈局的paddingTop實現。先把paddingTop設為負值,來隱藏header,在下拉的過程中,不斷改變headerView的p

最全的使用RecyclerView實現重新整理載入更多

前言:            縱觀多數App,下拉重新整理和上拉載入更多是很常見的功能,但是谷歌官方只有一個SwipeRefreshLayout用來下拉重新整理,上拉載入更多還要自己做。      本篇文章基於RecyclerView簡單封裝了這兩個操作,下拉重

android定義重新整理載入控制元件

import android.content.Context; import android.graphics.Point; import android.support.v4.view.MotionEventCompat; import android.support.v4.view.NestedScro

當scrollview巢狀多個recyclerview時如何實現整個頁面的重新整理載入

最近做的一個專案中有個佈局比較複雜一點,整個頁面是個srollview裡面又嵌套了幾個recycview,剛開始是有的滑動衝突卡頓的問題,通過如下方法解決了 mRecyclerView.setLayoutManager(new GridLayoutManager(getContext(),

手把手教你實現RecyclerView重新整理載入更多

個人原創,轉載請註明出處http://blog.csdn.net/u012402124/article/details/78210639 2018年10月25日更新 讓大家花費時間看文章卻沒有解決需求,隨著bug的增多內心的愧疚感逐漸增強,但幾個月前的程式

使用SwipeRefreshLayoutRecyclerView實現仿“簡書”重新整理載入

package com.leohan.refresh;import android.os.Bundle;import android.os.Handler;import android.support.v4.widget.SwipeRefreshLayout;import android.support.v7

Android 定義重新整理載入

完整程式碼在最下面。。 頭佈局xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_pare

採用SwipeFreshLayout+Recyclerview實現重新整理載入更多以及CoordinatorLayout的引入

       之前都是採用PullToRefresh進行下拉重新整理和下拉載入,現在採用谷歌自己的控制元件SwipeFreshLayout,配合Recyclerview來實現這一效果。使用SwipeRefreshLayout可以實現下拉重新整理,前提是佈局裡需要包裹一個可以

template-web.js 結合dropload.min.js外掛實現重新整理載入

//引入js,所需要的js已經上傳到個人資源 <script type="text/javascript" src="/web/home/js/template-web.js"></script> <link href="/web/h

Flutter如何實現重新整理載入更多

效果 下拉重新整理 如果實現下拉重新整理,必須藉助RefreshIndicator,在listview外面包裹一層RefreshIndicator,然後在RefreshIndicator裡面實現onRefresh方法。 body: movie

RecyclerView三種顯示方式的重新整理載入更多

但是之前寫的那個有一點點的小問題,如果上拉重新整理,重新整理小圖示還沒有移動到重新整理位置,重新整理資料就已經獲取到,並且呼叫了setRefreshing(false),在setRefreshing(false)中會去呼叫translationTo(int from,i

Android RecyclerView重新整理載入封裝

效果圖:程式碼已經同步到github~Gradle引入依賴: allprojects { repositories { ... maven { url 'https://jitpack.io' } } }

iOS UIScrollView 的重新整理載入實現

iOS UIScrollView的下拉重新整理和上拉載入的實現 下面我簡單的說一說iOS UIScrollView的下拉重新整理和上拉載入的實現。 首先匯入第三方庫: MJRefre

ionic2重新整理載入功能實現

先看程式碼: <!--預設顯示出來的資料--> <ion-list> <ion-item *ngFor="let i of items">{{i}}</ion-item> </ion-list> <

Android簡單實現重新整理重新整理

先把佈局檔案裡面新增一個ListView控制元件, <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.a

使用PullToRefresh實現重新整理載入

PullToRefresh是一套實現非常好的下拉重新整理庫,它支援: 1.ListView 2.ExpandableListView 3.GridView 4.WebView 等多種常用的需要重新整理的View型別,而且使用起來也十分方便。 (下載地址:https://gi

3秒鐘不懂你砍我:RecyclerView重新整理載入更多(開源中國List業務流程全解析)

這裡以開源中國開源資訊頁面為例子。 這個頁面資料的url:http://www.oschina.net/action/apiv2/news?pageToken= 是這樣的 json資料的結構: NewsBean返回成功與否的code和msg。 ResultBean返回的

通過ViewGroup實現重新整理載入,2018/2/12 06

為了重新瞭解一下自定義ViewGroup,自己實現了一個下拉重新整理view,衝突的解決Recyclerview滾動到底部和頂部的處理全部放在了父view 中,滾動實現使用的是Scroller,所以使整個控制元件還有類似ios的彈性效果,程式碼很簡單,使用也很簡