国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android RecyclerView + SwipeRefreshLayout 分頁、下拉刷新

2019-11-09 18:02:12
字體:
來源:轉載
供稿:網友

RecyclerView出現已經有一段時間了,可以通過導入support-v7對其進行使用。

據官方的介紹,該控件用于在有限的窗口中展示大量數據集,

其實這樣功能的控件并不陌生,例如:ListView、GridView。

那么有了ListView、GridView為什么還需要RecyclerView這樣的控件呢?

整體上看RecyclerView架構,提供了一種插拔式的體驗,高度的解耦,異常的靈活,

通過設置它提供的不同LayoutManager,

ItemDecoration , ItemAnimator實現非常炫的效果。

你想要控制其顯示的方式,

請通過布局管理器LayoutManager你想要控制Item間的間隔(可繪制),

請通過ItemDecoration你想要控制Item增刪的動畫,

請通過ItemAnimator你想要控制點擊、長按事件,自己實現。。。。。。。

實現非常簡單

布局文件:

在RecyclerView包裹SwipeRefreshLayout

<android.support.v4.widget.SwipeRefreshLayout        android:id="@+id/swipe_refresh_widget"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:layout_below="@+id/editTextRelayout">        <com.gsl.demo.utils.RefreshRecyclerView            android:id="@+id/recyclerView"            android:layout_width="match_parent"            android:layout_height="match_parent"            android:layout_below="@+id/editTextRelayout"            android:dividerHeight="18dp"            android:scrollbars="vertical" />    </android.support.v4.widget.SwipeRefreshLayout>

RefreshRecyclerView(自定義的view)

public class RefreshRecyclerView extends RecyclerView {    PRivate AutoLoadAdapter autoLoadAdapter;    public RefreshRecyclerView(Context context) {        this(context, null);    }    public RefreshRecyclerView(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public RefreshRecyclerView(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);        init();    }    private boolean isLoadingMore = false;//是否正在加載更多    private OnLoadMoreListener loadMoreListener;//加載數據監聽    private boolean loadMoreEnable = false;//是否允許加載更多    private int footerResource = -1;//腳布局    private boolean footer_visible = false;//腳部是否可以見    private void init() {        setOnScrollListener(new OnScrollListener() {            @Override            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {                super.onScrollStateChanged(recyclerView, newState);                if (getAdapter() != null && getLayoutManager() != null) {                    int lastVisiblePosition = ((LinearLayoutManager) getLayoutManager()).findLastVisibleItemPosition();                    int itemCount = getAdapter().getItemCount();                    /**                     * 控制下拉刷新回調                     * itemCount != 0 排除沒有數據情況                     * lastVisiblePosition + 4 >= itemCount - 1 最后可見+4 >= 總條數 加載更多                     * distanceY < 0 為上拉的時候才刷新                     */                    if (distanceY < 0 && itemCount != 0 && lastVisiblePosition + 4 >= itemCount - 1 && !isLoadingMore && loadMoreEnable) {                        Log.i("test","加載更多");                        //正在加載更多                        loading();                        if (footerResource != -1){//有腳布局                            //顯示腳布局                            footer_visible = true;                            getAdapter().notifyItemChanged(itemCount - 1);                        }                        if (loadMoreListener != null) {                            loadMoreListener.loadMoreListener();                        }                    }                }            }        });    }    /**     * 判斷滑動方向     */    private float distanceY = 0;    float startY = 0;    @Override    public boolean dispatchTouchEvent(MotionEvent ev) {        float y = ev.getRawY();        switch (ev.getAction()){            case MotionEvent.ACTION_DOWN:                startY = y;                break;            case MotionEvent.ACTION_MOVE:                distanceY = y - startY;                startY = y;                break;        }        return super.dispatchTouchEvent(ev);    }    @Override    public void setAdapter(Adapter adapter) {        SlideInBottomAnimationAdapter slideInBottomAnimationAdapter = new SlideInBottomAnimationAdapter(adapter);        slideInBottomAnimationAdapter.setDuration(600);        autoLoadAdapter = new AutoLoadAdapter(slideInBottomAnimationAdapter);//添加動畫        super.setAdapter(autoLoadAdapter);    }    /**     * 設置是否允許加載更多     *     * @param isEnable     */    public void setLoadMoreEnable(boolean isEnable) {        this.loadMoreEnable = isEnable;    }    /**     * 設置腳布局     */    public void setFooterResource(int footerResource) {        this.footerResource = footerResource;    }    /**     * 加載完成     */    private void loadMoreComplete() {        this.isLoadingMore = false;    }    /**     * 正在刷新     */    private void loading(){        this.isLoadingMore = true;//設置正在刷新    }    /**     * 加載更多數據回調     *     * @param listener     */    public void setOnLoadMoreListener(OnLoadMoreListener listener) {        this.loadMoreListener = listener;    }    public interface OnLoadMoreListener {        void loadMoreListener();//上拉刷新    }    /**     * 刷新數據     */    public void notifyData() {        if (getAdapter() != null) {            loadMoreComplete();            if(footerResource != -1 && loadMoreEnable){                //隱藏腳布局                footer_visible = false;            }            getAdapter().notifyDataSetChanged();        }    }    public class AutoLoadAdapter extends Adapter<ViewHolder> {        private Adapter dataAdapter;//數據adapter        private final int TYPE_FOOTER = Integer.MAX_VALUE;//底部布局        public AutoLoadAdapter(Adapter adapter) {            this.dataAdapter = adapter;        }        @Override        public int getItemViewType(int position) {            if (position == getItemCount() - 1 && loadMoreEnable && footerResource != -1 && footer_visible) {                return TYPE_FOOTER;            }            if (dataAdapter.getItemViewType(position) == TYPE_FOOTER) {                throw new RuntimeException("adapter中itemType不能為:" + Integer.MAX_VALUE);            }            return dataAdapter.getItemViewType(position);        }        @Override        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {            ViewHolder holder = null;            if (viewType == TYPE_FOOTER) {//腳部                holder = new FooterViewHolder(LayoutInflater.from(getContext()).inflate(footerResource, parent, false));            } else {//數據                holder = dataAdapter.onCreateViewHolder(parent, viewType);            }            return holder;        }        @Override        public void onBindViewHolder(ViewHolder holder, int position) {            int itemViewType = getItemViewType(position);            if (itemViewType != TYPE_FOOTER) {                dataAdapter.onBindViewHolder(holder, position);            }        }        @Override        public int getItemCount() {            if (dataAdapter.getItemCount() != 0) {                int count = dataAdapter.getItemCount();                if (loadMoreEnable && footerResource != -1 && footer_visible) {                    count++;                }                return count;            }            return 0;        }        public class FooterViewHolder extends ViewHolder {            public FooterViewHolder(View itemView) {                super(itemView);            }        }    }}

activity中:

        mSwipeRefreshLayout.setColorSchemeResources(android.R.color.holo_red_light, android.R.color.ho        lo_blue_light, android.R.color.holo_green_light);        recyclerView.setLoadMoreEnable(true);//允許加載更多        recyclerView.setFooterResource(R.layout.item_footer);//設置腳布局        recyclerView.setOnLoadMoreListener(new RefreshRecyclerView.OnLoadMoreListener() {            @Override            public void loadMoreListener() {                handler.postDelayed(new Runnable() {                    @Override                    public void run() {                        for (int i = 0; i < 10; i++) {                            statisticsResponseModel = new StatisticsResponseModel();                            statisticsResponseModel.setName("OK" + i);                            mList.add(statisticsResponseModel);                        }                        mRefreshAdapter.setmList(mList);                        recyclerView.notifyData();//刷新數據                    }                }, 5000);            }        });//分頁        mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {            @Override            public void onRefresh() {                handler.postDelayed(new Runnable() {                    @Override                    public void run() {                        mSwipeRefreshLayout.setRefreshing(false);                        recyclerView.notifyData();//刷新數據                    }                }, 2000);            }        });    }//下拉刷新

gradle文件添加:

 compile 'jp.wasabeef:recyclerview-animators:1.3.0'

有問題聯系:1808418098(微信、QQ)


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 海门市| 赤壁市| 乐山市| 滨州市| 鹤庆县| 昌黎县| 曲阜市| 凤庆县| 隆子县| 巴青县| 长岛县| 禄丰县| 伊金霍洛旗| 洞头县| 黎平县| 揭东县| 博兴县| 长丰县| 平南县| 红安县| 万州区| 兴仁县| 博爱县| 社会| 穆棱市| 定兴县| 剑川县| 剑河县| 长治市| 雷波县| 蕉岭县| 利辛县| 扬中市| 仙居县| 那坡县| 平阴县| 乐至县| 忻城县| 克山县| 长岛县| 山东省|