自定義RecyclerView實現下拉重新整理和上拉載入
<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的增多內心的愧疚感逐漸增強,但幾個月前的程式
使用SwipeRefreshLayout和RecyclerView實現仿“簡書”下拉重新整理和上拉載入
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的彈性效果,程式碼很簡單,使用也很簡