Android RecyclerView上拉加載和下拉刷新(基礎(chǔ)版)
這里講述的是用谷歌原生的SwipeRefreshLayout,進(jìn)行刷新,以及利用RecycleView的滾動(dòng)事件,判斷是否到最后一個(gè)item,進(jìn)行加載更多,這里加載更多是在RecycleView的適配器中使用不同item進(jìn)行完成的。
這是activity的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" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipe_refresh_layout" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v7.widget.RecyclerView android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#F0F0F0" android:clipToPadding="false" android:paddingBottom="16dp" android:paddingTop="16dp"/> </android.support.v4.widget.SwipeRefreshLayout> <com.rey.material.widget.ProgressView android:id="@+id/progress_loading_main" app:pv_autostart="true" app:pv_circular="true" app:pv_progressStyle="@style/Material.Drawable.CircularProgress" app:pv_progressMode="indeterminate" android:layout_width="50dp" android:layout_height="50dp" android:visibility="gone" android:layout_centerInParent="true"/> </RelativeLayout>
接下來(lái)是對(duì)應(yīng)activity中的代碼:
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.retrofit.wangfei.viewpagertablayout.util.Constance;
import com.retrofit.wangfei.viewpagertablayout.R;
import com.retrofit.wangfei.viewpagertablayout.adapter.MyRecycleViewAdapter;
import com.rey.material.widget.ProgressView;
import java.util.ArrayList;
import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;
public class HomeFragment extends Fragment {
@Bind(R.id.recyclerview)
RecyclerView recyclerview;
@Bind(R.id.swipe_refresh_layout)
SwipeRefreshLayout swipeRefreshLayout;
@Bind(R.id.progress_loading_main)
ProgressView progress_loading_main; // 加載數(shù)據(jù)時(shí)顯示的進(jìn)度圓圈
private LinearLayoutManager mRecycleViewLayoutManager;
private int mPageNum = 1;
private List<String> lists = new ArrayList<>();
private MyRecycleViewAdapter mAdapter;
public static HomeFragment newInstance() {
HomeFragment fragment = new HomeFragment();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_home, container, false);
ButterKnife.bind(this, view);
return view;
}
/**在onCreateView方法后執(zhí)行*/
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mAdapter = new MyRecycleViewAdapter(lists,getActivity());
initRecyclerView();
swipeRefreshLayout.setColorSchemeResources(Constance.colors);//設(shè)置下拉刷新控件變換的四個(gè)顏色
recyclerview.setAdapter(mAdapter);
recyclerViewOnItemClickListener();
refresh();
loadMore(mAdapter);
progress_loading_main.setVisibility(View.VISIBLE);
initData();
}
@Override
public void onDestroyView() {
super.onDestroyView();
ButterKnife.unbind(this);
}
/**進(jìn)入頁(yè)面的初始化數(shù)據(jù)*/
private void initData(){
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
netNewsList(true);
progress_loading_main.setVisibility(View.GONE);
}
}, 2000);
}
/**RecyclerView每個(gè)item的點(diǎn)擊事件*/
private void recyclerViewOnItemClickListener() {
mAdapter.setOnItemClickListener(new MyRecycleViewAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Snackbar.make(view, "fly", Snackbar.LENGTH_SHORT).show();
}
});
}
/**
* 初始化RecyclerView
*/
private void initRecyclerView() {
// recyclerview.setItemAnimator(new DefaultItemAnimator());
// recyclerview.setHasFixedSize(true);
mRecycleViewLayoutManager = new LinearLayoutManager(getActivity());
recyclerview.setLayoutManager(mRecycleViewLayoutManager); // 設(shè)置RecycleView,顯示是ListView還是gridView還是瀑布流
}
/**下拉刷新*/
private void refresh() {
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
netNewsList(true);
swipeRefreshLayout.setRefreshing(false); // 停止刷新
}
}, 2000);
}
});
}
/**
* 設(shè)置上拉加載更多
*
* @param adapter RecyclerView適配器
*/
public void loadMore(final MyRecycleViewAdapter adapter) {
recyclerview.addOnScrollListener(new RecyclerView.OnScrollListener() {
private int lastVisibleItem;
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
lastVisibleItem = mRecycleViewLayoutManager.findLastVisibleItemPosition(); // 滑動(dòng)到最后一個(gè)
}
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
// 效果在暫停時(shí)顯示, 否則會(huì)導(dǎo)致重繪異常
if (newState == RecyclerView.SCROLL_STATE_IDLE
&& lastVisibleItem + 1 == adapter.getItemCount()) {
if (lists != null && lists.size() >= 10) { // 真實(shí)開(kāi)發(fā)中要設(shè)置mNews.size()大于加載分頁(yè)顯示的個(gè)數(shù)
adapter.loadLayout.setVisibility(View.VISIBLE);
//加載更多
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
netNewsList(false);
}
}, 2000);
}
}
}
});
}
/**
* 從網(wǎng)絡(luò)加載數(shù)據(jù)列表
*
* @param isRefresh 是否刷新 true 為刷新,false為不刷新
*/
private void netNewsList(boolean isRefresh) {
// viewDelegate.showLoading();
if (isRefresh) {
mPageNum = 1;
} else {
mPageNum++;
}
if (isRefresh) {
if (!lists.isEmpty()) {
lists.clear();
}
}
// TODO 這里把頁(yè)數(shù)mPageNum上傳到服務(wù)端
lists.clear();
lists.addAll(getData());
mAdapter.notifyDataSetChanged();
}
private List<String> list = new ArrayList<>();
private List<String> getData() {
for (int i = 0; i < 10; i++) {
list.add(i + "");
}
return list;
}
}
接下來(lái)是RecycleView適配器中的xml文件:
這是正常item的布局,至于用CardView是為了讓item展示出來(lái)的效果更好看
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/text" android:layout_width="match_parent" android:layout_height="50dp" android:text="" android:gravity="center"/> </android.support.v7.widget.CardView>
這是現(xiàn)實(shí)上拉加載的布局文件,作為不同item共同展示在RecycleView上面:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/load_layout" android:visibility="gone" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:orientation="horizontal" android:paddingBottom="12dip" android:paddingTop="12dip"> <com.rey.material.widget.ProgressView app:pv_autostart="true" app:pv_circular="true" app:pv_progressStyle="@style/Material.Drawable.CircularProgress" app:pv_progressMode="indeterminate" android:layout_width="24dp" android:layout_height="24dp" /> <TextView android:id="@+id/more_data_msg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="16sp" android:layout_marginLeft="10dp" android:text="正在加載..." /> </LinearLayout>
下面我們看看RecycleView適配器的寫(xiě)法:
import android.app.Activity;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.retrofit.wangfei.viewpagertablayout.R;
import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;
/**
* Created by Android Studio
* Description: RecycleView的適配器
*/
public class MyRecycleViewAdapter extends RecyclerView.Adapter {
private final static int TYPE_ITEM = 0X01;
private final static int TYPE_FOOTER = 0x02;
private List<String> lists;
private Activity context;
public LinearLayout loadLayout;
private OnItemClickListener mOnItemClickListener; // 聲明接口
public MyRecycleViewAdapter(List<String> lists, Activity context) {
this.lists = lists;
this.context = context;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (TYPE_ITEM == viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycle_view_item, parent,false);
ItemViewHolder itemViewHolder = new ItemViewHolder(view);
return itemViewHolder;
} else {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_footer, parent,false);
loadLayout = (LinearLayout) view.findViewById(R.id.load_layout);
return new FootViewHolder(view);
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof ItemViewHolder) {
String text = lists.get(position);
ItemViewHolder itemHolder = (ItemViewHolder) holder;
itemHolder.text.setText(text);
}
}
@Override
public int getItemCount() {
return lists.size() + 1;
}
@Override
public int getItemViewType(int position) {
if (position + 1 == getItemCount()) {
return TYPE_FOOTER;
} else {
return TYPE_ITEM;
}
}
public class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
@Bind(R.id.text)
TextView text;
public ItemViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this,itemView);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
mOnItemClickListener.onItemClick(v,getPosition());
}
}
public class FootViewHolder extends RecyclerView.ViewHolder {
public FootViewHolder(View itemView) {
super(itemView);
}
}
/**調(diào)到外部使用*/
public void setOnItemClickListener(OnItemClickListener onItemClickListener){
this.mOnItemClickListener = onItemClickListener;
}
/**定義接口*/
public interface OnItemClickListener{
void onItemClick(View v,int position);
}
}
最后是刷新控件的4個(gè)不同顏色:
public interface Constance {
/**
* 下拉刷新控件變化的四個(gè)顏色
*/
int[] colors = new int[] {
android.R.color.holo_green_light, android.R.color.holo_blue_light,
android.R.color.holo_green_light, android.R.color.holo_blue_light
};
}
所需要的依賴(lài)庫(kù):
compile 'com.android.support:appcompat-v7:23.3.0' compile 'com.android.support:design:23.3.0' compile 'com.jakewharton:butterknife:7.0.1' compile 'com.android.support:support-v4:23.3.0' /**谷歌服務(wù)*/ compile 'com.google.android.gms:play-services:8.4.0' compile 'com.github.rey5137:material:1.2.2'
到這里就結(jié)束了,完成了下拉刷新和上拉加載更多的實(shí)現(xiàn)。
下面說(shuō)說(shuō)RecyclerView的使用最基礎(chǔ)的三點(diǎn):
一:
recyclerview.setHasFixedSize(true); //方法用來(lái)使RecyclerView保持固定的大小,該信息被用于自身的優(yōu)化。
二:
recyclerview.setItemAnimator(new DefaultItemAnimator());
ItemAnimator會(huì)根據(jù)適配器上收到的通知?jiǎng)赢?huà)顯示視圖組的修改?;旧?,它會(huì)自動(dòng)顯示添加和移除條目動(dòng)畫(huà)。這也不是一個(gè)簡(jiǎn)單的類(lèi),但我們發(fā)現(xiàn)DefaultItemAnimator已經(jīng)可以運(yùn)行得很好了。
三:
recyclerview.setLayoutManager(mRecycleViewLayoutManager); // 設(shè)置RecycleView,顯示是ListView還是gridView還是瀑布流。 // 顯示是ListView LinearLayoutManager mRecycleViewLayoutManager = new LinearLayoutManager(context); // 顯示是gridView,參數(shù)一:上下文,參數(shù)二:列數(shù) GridLayoutManager mGridLayoutManager=new GridLayoutManager(context, 4); // 顯示是瀑布流,參數(shù)一:顯示幾列,參數(shù)二:現(xiàn)實(shí)的方向,垂直或水平 StaggeredGridLayoutManager mStaggeredGridLayoutManager=new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
更多詳細(xì)請(qǐng)參考:Android RecyclerView藝術(shù)般的控件使用完全解析
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- android RecyclerView側(cè)滑菜單,滑動(dòng)刪除,長(zhǎng)按拖拽,下拉刷新上拉加載
- Android RecyclerView實(shí)現(xiàn)下拉刷新和上拉加載更多
- Android之RecyclerView輕松實(shí)現(xiàn)下拉刷新和加載更多示例
- Android RecyclerView上拉加載和下拉刷新
- RecyclerView下拉刷新上拉加載
- Android RecyclerView下拉刷新和上拉加載更多
- Android使用recyclerview打造真正的下拉刷新上拉加載效果
- Android RecyclerView 上拉加載更多及下拉刷新功能的實(shí)現(xiàn)方法
- Android RecyclerView實(shí)現(xiàn)下拉刷新和上拉加載
- XRecyclerView實(shí)現(xiàn)下拉刷新、滾動(dòng)到底部加載更多等功能
相關(guān)文章
Android?控件自動(dòng)貼邊實(shí)現(xiàn)實(shí)例詳解
這篇文章主要為大家介紹了Android?控件自動(dòng)貼邊實(shí)現(xiàn)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Android筆記之:App調(diào)試的幾個(gè)命令的實(shí)踐與分析
本篇文章介紹了,在Android中:App調(diào)試的幾個(gè)命令的實(shí)踐與分析。需要的朋友參考下2013-04-04
Android那兩個(gè)你碰不到但是很重要的類(lèi)之ViewRootImpl
這兩個(gè)類(lèi)就是ActivityThread和ViewRootImpl,之所以說(shuō)碰不到是因?yàn)槲覀儫o(wú)法通過(guò)正常的方式引用這兩個(gè)類(lèi)或者其類(lèi)的對(duì)象,本文就嘗試從幾個(gè)我們經(jīng)常接觸的方面先談?wù)刅iewRootImpl,感興趣的可以參考閱讀下2023-05-05
android ListActivity顯示圖標(biāo)實(shí)例
在ListActivity中顯示圖標(biāo),好像并不復(fù)雜,實(shí)現(xiàn)起來(lái)卻不輕松,我們下面一步步來(lái)實(shí)現(xiàn)ListActivity中顯示圖標(biāo)2013-11-11
Android.mk文件中添加第三方j(luò)ar文件的方法
這篇文章主要介紹了Android.mk文件中添加第三方j(luò)ar文件及引用第三方j(luò)ar包的方法,需要的朋友可以參考下2018-01-01
搭建Android上的服務(wù)器 “實(shí)現(xiàn)隔空取物”的方法
本篇文章主要介紹了搭建Android上的服務(wù)器 “實(shí)現(xiàn)隔空取物”的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
Android Studio實(shí)現(xiàn)注冊(cè)頁(yè)面跳轉(zhuǎn)登錄頁(yè)面的創(chuàng)建
這篇文章主要為大家詳細(xì)介紹了Android Studio實(shí)現(xiàn)注冊(cè)頁(yè)面跳轉(zhuǎn)登錄頁(yè)面的創(chuàng)建,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
Android?Flutter實(shí)現(xiàn)有趣的頁(yè)面滾動(dòng)效果
Flutter提供了?CustomScrollView?來(lái)粘合多個(gè)滑動(dòng)組件,并且可以實(shí)現(xiàn)更有趣的滑動(dòng)效果,本文就來(lái)為大家詳細(xì)講講實(shí)現(xiàn)的方法,需要的可以參考一下2022-06-06

