Android App使用RecyclerView實(shí)現(xiàn)上拉和下拉刷新的方法
關(guān)于RecyclerView
RecyclerView在Android 5.0以來被引入,以前經(jīng)常使用的ListView 繼承的是AbsListView,而RecyclerView則直接繼承 ViewGroup,并實(shí)現(xiàn)了ScrollingView 和 NestedScrollingChild接口,RecyclerView相比ListView,是一次徹底的改變。
RecyclerView比listview更先進(jìn)更靈活,對(duì)于很多的視圖它就是一個(gè)容器,可以有效的重用和滾動(dòng)。當(dāng)數(shù)據(jù)動(dòng)態(tài)變化的時(shí)候請(qǐng)使用它。
RecyclerView使用起來很方便因?yàn)樗峁?br />
1、它為item的定位提供一個(gè)layoutmanager
2、為item的操作提供一個(gè)缺省的animations
3、還可以靈活地定義這個(gè)小部件的自定義布局管理器和動(dòng)畫
實(shí)現(xiàn)上拉刷新和下拉刷新
布局文件:
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/swipe_refresh_widget" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v7.widget.RecyclerView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="match_parent" android:cacheColorHint="@null" android:scrollbars="vertical" /> </android.support.v4.widget.SwipeRefreshLayout>
在Activity中引用這個(gè)布局并初始化
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSwipeRefreshWidget = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_widget); mRecyclerView = (RecyclerView) findViewById(android.R.id.list); mSwipeRefreshWidget.setColorScheme(R.color.color1, R.color.color2, R.color.color3, R.color.color4); mSwipeRefreshWidget.setOnRefreshListener(this); // 這句話是為了,第一次進(jìn)入頁面的時(shí)候顯示加載進(jìn)度條 mSwipeRefreshWidget.setProgressViewOffset(false, 0, (int) TypedValue .applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24, getResources() .getDisplayMetrics())); mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem + 1 == adapter.getItemCount()) { mSwipeRefreshWidget.setRefreshing(true); // 此處在現(xiàn)實(shí)項(xiàng)目中,請(qǐng)換成網(wǎng)絡(luò)請(qǐng)求數(shù)據(jù)代碼,sendRequest ..... handler.sendEmptyMessageDelayed(0, 3000); } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); lastVisibleItem = mLayoutManager.findLastVisibleItemPosition(); } }); mRecyclerView.setHasFixedSize(true); mLayoutManager = new LinearLayoutManager(this); mRecyclerView.setLayoutManager(mLayoutManager); mRecyclerView.setItemAnimator(new DefaultItemAnimator()); adapter = new SampleAdapter(); mRecyclerView.setAdapter(adapter); // 此處在現(xiàn)實(shí)項(xiàng)目中,請(qǐng)換成網(wǎng)絡(luò)請(qǐng)求數(shù)據(jù)代碼,sendRequest ..... handler.sendEmptyMessageDelayed(0, 3000); }
SwipeRefreshLayout里面需要注意的Api:
1、setOnRefreshListener(OnRefreshListener listener) 設(shè)置下拉監(jiān)聽,當(dāng)用戶下拉的時(shí)候會(huì)去執(zhí)行回調(diào)
2、setColorSchemeColors(int... colors) 設(shè)置 進(jìn)度條的顏色變化,最多可以設(shè)置4種顏色
3、setProgressViewOffset(boolean scale, int start, int end) 調(diào)整進(jìn)度條距離屏幕頂部的距離
4、setRefreshing(boolean refreshing) 設(shè)置SwipeRefreshLayout當(dāng)前是否處于刷新狀態(tài),一般是在請(qǐng)求數(shù)據(jù)的時(shí)候設(shè)置為true,在數(shù)據(jù)被加載到View中后,設(shè)置為false。
RecyclerView的實(shí)現(xiàn):
第一種,下拉刷新和上拉刷新都用SwipeRefreshLayout 自帶的進(jìn)度條
mRecyclerView = (RecyclerView) findViewById(android.R.id.list); mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem + 1 == adapter.getItemCount()) { mSwipeRefreshWidget.setRefreshing(true); // 此處在現(xiàn)實(shí)項(xiàng)目中,請(qǐng)換成網(wǎng)絡(luò)請(qǐng)求數(shù)據(jù)代碼,sendRequest ..... handler.sendEmptyMessageDelayed(0, 3000); } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); lastVisibleItem = mLayoutManager.findLastVisibleItemPosition(); } }); mRecyclerView.setHasFixedSize(true); mLayoutManager = new LinearLayoutManager(this); mRecyclerView.setLayoutManager(mLayoutManager); mRecyclerView.setItemAnimator(new DefaultItemAnimator()); adapter = new SampleAdapter(); mRecyclerView.setAdapter(adapter);
第二種實(shí)現(xiàn)下拉刷新用SwipeRefreshLayout 自帶的進(jìn)度條, 上拉刷新用類似ListView的刷新 提示“加載中”等信息。
我們可以給RecyclerView 也添加一個(gè)類似FooterView的item。
我們?cè)贏dapter中實(shí)現(xiàn):
public class SampleAdapter extends RecyclerView.Adapter<ViewHolder> { private List<Integer> list; private static final int TYPE_ITEM = 0; private static final int TYPE_FOOTER = 1; public List<Integer> getList() { return list; } public SampleAdapter() { list = new ArrayList<Integer>(); } // RecyclerView的count設(shè)置為數(shù)據(jù)總條數(shù)+ 1(footerView) @Override public int getItemCount() { return list.size() + 1; } @Override public int getItemViewType(int position) { // 最后一個(gè)item設(shè)置為footerView if (position + 1 == getItemCount()) { return TYPE_FOOTER; } else { return TYPE_ITEM; } } @Override public void onBindViewHolder(ViewHolder holder, final int position) { if (holder instanceof ItemViewHolder) { ((ItemViewHolder) holder).textView.setText(String.valueOf(list .get(position))); } } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == TYPE_ITEM) { View view = LayoutInflater.from(parent.getContext()).inflate( R.layout.list_item_text, null); view.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); return new ItemViewHolder(view); } // type == TYPE_FOOTER 返回footerView else if (viewType == TYPE_FOOTER) { View view = LayoutInflater.from(parent.getContext()).inflate( R.layout.footerview, null); view.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); return new FooterViewHolder(view); } return null; } class FooterViewHolder extends ViewHolder { public FooterViewHolder(View view) { super(view); } } class ItemViewHolder extends ViewHolder { TextView textView; public ItemViewHolder(View view) { super(view); textView = (TextView) view.findViewById(R.id.text); } } }
這樣我們就可以針對(duì)footerview的布局做一些處理了,比如提示“加載中,”,“已經(jīng)全部加載”等信息。更加靈活一點(diǎn)
- android使用ViewPager組件實(shí)現(xiàn)app引導(dǎo)查看頁面
- Android用webView包裝WebAPP方法
- Android APP之WebView校驗(yàn)SSL證書的方法
- Android中TabLayout+ViewPager 簡(jiǎn)單實(shí)現(xiàn)app底部Tab導(dǎo)航欄
- 詳解Android中ListView實(shí)現(xiàn)圖文并列并且自定義分割線(完善仿微信APP)
- Android App開發(fā)中使用RecyclerView替代ListView的實(shí)踐
- Android App中使用ViewPager實(shí)現(xiàn)滑動(dòng)分頁的要點(diǎn)解析
- Android App中ViewPager所帶來的滑動(dòng)沖突問題解決方法
- Android自定義View app更新動(dòng)畫詳解
相關(guān)文章
Android自定義View實(shí)現(xiàn)風(fēng)車效果
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)風(fēng)車效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08unity3d發(fā)布apk在android虛擬機(jī)中運(yùn)行的詳細(xì)步驟(unity3d導(dǎo)出android apk)
這篇文章主要介紹了unity3d發(fā)布apk在android虛擬機(jī)中運(yùn)行的詳細(xì)步驟,需要的朋友可以參考下2014-05-05Android利用ViewPager實(shí)現(xiàn)可滑動(dòng)放大縮小畫廊效果
這篇文章主要介紹了Android利用ViewPager實(shí)現(xiàn)可滑動(dòng)放大縮小畫廊效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08Android開發(fā)教程之shape和selector的結(jié)合使用
shape和selector是Android UI設(shè)計(jì)中經(jīng)常用到的,比如我們要自定義一個(gè)圓角Button,點(diǎn)擊Button有些效果的變化,就要用到shape和selector,接下來通過本文給大家介紹Android開發(fā)教程之shape和selector的結(jié)合使用,感興趣的朋友一起學(xué)習(xí)吧2016-01-01Android中自定義ContentProvider實(shí)例
應(yīng)用A(TestBaidu)調(diào)用另外一個(gè)應(yīng)用(TestContentProvider)中的自定義ContentProvider,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下哈2013-06-06使用ViewPager2實(shí)現(xiàn)簡(jiǎn)易輪播圖效果
這篇文章主要為大家詳細(xì)介紹了使用ViewPager2實(shí)現(xiàn)簡(jiǎn)易輪播圖效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09Android實(shí)現(xiàn)手機(jī)震動(dòng)抖動(dòng)效果的方法
今天小編就為大家分享一篇關(guān)于Android實(shí)現(xiàn)手機(jī)震動(dòng)抖動(dòng)效果的方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03Android實(shí)現(xiàn)史上最簡(jiǎn)單自定義開關(guān)按鈕的方法
在平常的開發(fā)中按鈕是經(jīng)常使用到的控件之一,下面這篇文章主要給大家介紹了關(guān)于Android實(shí)現(xiàn)史上最簡(jiǎn)單自定義開關(guān)按鈕的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04Android仿新聞頂部導(dǎo)航標(biāo)簽切換效果
這篇文章主要為大家詳細(xì)介紹了Android仿新聞頂部導(dǎo)航標(biāo)簽切換效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11