RecyclerView使用詳解(代替ListView)
老規(guī)矩,先看效果;
Recycler是android5.0版本中新添加的一個view;
使用之前必須添加依賴庫:
dependencies { compile 'com.android.support:recyclerview-v7:23.0.+' }
這里我就不再過多的介紹RecyclerView,既然大家在找使用RecyclerView的demo想必大家都了解過了,如果不了解網(wǎng)上隨便打開一篇RecyclerView的文章應(yīng)該都有,已經(jīng)爛大街,在此就不過多的重復(fù)了;
今天寫的demo主要是利用RecyclerView代替普通的listview和橫向的listview;
個人感覺要想更深入的使用RecyclerView,必須要從最基礎(chǔ)的功能開始實現(xiàn);今天我們就實現(xiàn)最簡單的五點功能:
功能點:為RecyclerView添加點擊事件,添加頭布局和腳布局,添加下拉刷新和上拉加載更多;
好了首先說下如何用RecyclerView代替橫向的listview:
RecyclerView的使用個人感覺其實比較簡單,但是網(wǎng)上很多demo介紹的感覺有點復(fù)雜,在本文中RecyclerView的基本使用只需兩步:
第一:設(shè)置布局管理器
第二:設(shè)置adapter
//添加布局管理器,Orientation默認是縱向的,所以我們在此需要手動指定一下 LinearLayoutManager layoutManager = new LinearLayoutManager(context); layoutManager.setOrientation(OrientationHelper.HORIZONTAL); recyclerView.setLayoutManager(layoutManager); //設(shè)置recyclerView標記,如果確定內(nèi)容的高度都一致,設(shè)置為true,提高內(nèi)容渲染效率;(如果高度不確定系統(tǒng)要自己適配高度) recyclerView.setHasFixedSize(true); //設(shè)置adapter HRecyclerViewAdapter adapter = new HRecyclerViewAdapter(context, images); recyclerView.setAdapter(adapter);
RecyclerVIew提供了三種內(nèi)置的布局管理器:
LinearLayoutManager:線性布局,橫向或者縱向滑動列表
GridLayoutManager:表格布局
StaggeredGridLayoutManager:流式布局
我們今天只使用第一種,先了解最實用,最基礎(chǔ)的,后期會更新
RecyclerView默認是沒有分割線的,網(wǎng)上很多demo為了給RecyclerView添加分割線使用了系統(tǒng)提供的類;
個人感覺完全沒必要,甚至感覺多次一舉,個人感覺完全可以給RecyclerView和item設(shè)置背景實現(xiàn)分割線或者在item布局中添加view布局實現(xiàn);
首先了解下RecyclerView的adapter:
和listview的adapter有所不同,在這里需要繼承RecyclerView.Adapter,需要實現(xiàn)三個方法:
onCreateViewHolder()
onBindViewHolder()
getItemCount()
詳情看代碼:
public class HRecyclerViewAdapter extends RecyclerView.Adapter<HRecyclerViewAdapter.MyViewHolder>{ private Context context; private int[] images; private OnItemClickListener onItemClickListener; public HRecyclerViewAdapter(Context context, int[] images) { this.context=context; this.images=images; } //重寫onCreateViewHolder方法,返回一個自定義的ViewHolder(當(dāng)RecyclerView需要一個ViewHolder時會回調(diào)該方法,如果有可復(fù)用的View不會回調(diào)) public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.item_hrecycler, parent, false); MyViewHolder myViewHolder = new MyViewHolder(view); return myViewHolder; } //填充onCreateViewHolder方法返回的holder中的控件(當(dāng)一個View需要出現(xiàn)在屏幕上時,該方法會被回調(diào),我們需要再該方法中根據(jù)數(shù)據(jù)來更改視圖) public void onBindViewHolder(final MyViewHolder holder, int position) { holder.iv.setBackgroundResource(images[position]); if(onItemClickListener!=null){ holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int index = holder.getLayoutPosition(); //自定義監(jiān)聽第三步 onItemClickListener.onItemClick(index); } }); } } //獲取數(shù)據(jù)的數(shù)量(告訴RecyclerView有多少個視圖需要顯示) public int getItemCount() { return images.length; } //自定義的ViewHolder,持有每個Item的的所有界面元素 public class MyViewHolder extends RecyclerView.ViewHolder{ public ImageView iv; public MyViewHolder(View itemView) { super(itemView); iv= (ImageView) itemView.findViewById(R.id.imageview); } } //自定義監(jiān)聽第二步 public void setOnItemClickListener(OnItemClickListener onItemClickListener){ this.onItemClickListener=onItemClickListener; } //自定義監(jiān)聽第一步 public interface OnItemClickListener{ void onItemClick(int position); } }
從代碼中大家可以了解到RecyclerView的adpater其實只需要實現(xiàn)三個方法,但是我這個adapter中卻多出來幾個方法,RecyclerView本身是沒有條目點擊事件的,所以多出來的幾個方法是變相的給RecyclerView設(shè)置設(shè)置條目點擊事件的,實際上是使用自定義監(jiān)聽給adapter設(shè)置了點擊事件;
自定義監(jiān)聽就不再過多介紹了,以前寫的博客中有專門介紹自定義監(jiān)聽的,不了解的朋友可以了解一下SwipeRefreshLayout實現(xiàn)ListView下拉刷新上拉加載
給RecyclerView設(shè)置adapter之后就可以使用了:
adapter.setOnItemClickListener(new HRecyclerViewAdapter.OnItemClickListener() { @Override public void onItemClick(int position) { ToastUtils.showStaticToast(context,"當(dāng)前點擊的是第"+(position+1)+"張圖片"); } });
好了接下來了解下RecyclerView代替縱向listview:
分割線和上面一樣,在item中添加view實現(xiàn)分割線,點擊事件同樣是添加自定義監(jiān)聽;
RecyclerView默認是沒辦法添加頭布局和腳布局的,上面橫向的沒有使用這一塊,但是縱向的在真實項目中就極有可能使用到這個功能點了,在網(wǎng)上看了好多大神們寫的添加頭布局和腳布局的方法,感覺真的是大神,寫的真的很復(fù)雜,所以都沒有使用,最后在git上找到一個自定義的RecyclerView直接繼承系統(tǒng)的RecyclerView,除了添加了兩個方法,其他的用法不變,感覺挺實用的,在此就不復(fù)制這個類了,源碼中都有(MyRecyclerView),使用的話直接復(fù)制到項目中即可;
添加頭布局和腳布局的方法也極為簡單,和listview一樣:
//添加頭布局(必須在設(shè)置完布局管理器再添加頭布局和腳布局) View headerView = View.inflate(this, R.layout.headerview, null); myRecyclerView.addHeaderView(headerView); //添加腳布局 View footView = View.inflate(context, R.layout.footview, null); myRecyclerView.addFooterView(footView);
下拉刷新直接使用的是系統(tǒng)自帶的SwipeRefreshLayout,這個在以前的博客中也有介紹,在此就不再重復(fù)了,不了解的朋友可以了解一下
Android自定義ScrollView使用自定義監(jiān)聽
好了,剩下最后一個功能點,上拉加載更多:
直接給RecyclerView添加活動監(jiān)聽和添加腳布局實現(xiàn),首先得到當(dāng)前頁面顯示的條目個數(shù),adapter一共多少個條目,和當(dāng)前布局遮擋頁面?zhèn)€數(shù)
先求出用頁面實現(xiàn)個數(shù)+被頁面遮擋條目個數(shù)的和,然后拿這個和和adapter總條目個數(shù)做比較,當(dāng)?shù)扔诨蛘叽笥赼dapter條目個數(shù)的時候直接加載數(shù)據(jù):
//添加滑動監(jiān)聽 myRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override //當(dāng)RecyclerView的滑動狀態(tài)改變時觸發(fā) public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); } @Override //當(dāng)RecyclerView滑動時觸發(fā)(類似點擊事件的MotionEvent.ACTION_MOVE) public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); int visible = layoutManager.getChildCount();//當(dāng)天頁面顯示的條目個數(shù) int total = layoutManager.getItemCount();//當(dāng)前一共多少個條目 int past= layoutManager.findFirstCompletelyVisibleItemPosition();//布局上面被當(dāng)住多少個條目 //當(dāng)活動到最后一個條目時加載更多數(shù)據(jù) if ((visible + past) >= total){ <span style="white-space:pre"> </span>//發(fā)送handler加載數(shù)據(jù) handler.sendEmptyMessageDelayed(1,1000); } } });
好了,以上功能點已經(jīng)全部實現(xiàn),如果大家有更簡單的方法實現(xiàn)以上功能點,歡迎告知,感謝;
點擊打開鏈接免費下載源碼
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 淺談RecyclerView(完美替代ListView,GridView)
- Android中實現(xiàn)淘寶購物車RecyclerView或LIstView的嵌套選擇的邏輯
- Android添加圖片到ListView或者RecyclerView顯示
- Android RecyclerView詳解之實現(xiàn) ListView GridView瀑布流效果
- 將替代ListView的RecyclerView 的使用詳解(一)
- Android App開發(fā)中使用RecyclerView替代ListView的實踐
- Android仿XListView支持下拉刷新和上劃加載更多的自定義RecyclerView
- 學(xué)習(xí)Android Material Design(RecyclerView代替ListView)
相關(guān)文章
Android自定義view實現(xiàn)電影票在線選座功能
這篇文章主要為大家詳細介紹了Android自定義view實現(xiàn)選座功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11Android開發(fā)實現(xiàn)的幾何圖形工具類GeometryUtil完整實例
這篇文章主要介紹了Android開發(fā)實現(xiàn)的幾何圖形工具類GeometryUtil,涉及Android坐標圖形數(shù)值運算相關(guān)操作技巧,需要的朋友可以參考下2017-11-11

Flutter檢查連接網(wǎng)絡(luò)connectivity_plus實現(xiàn)步驟

Android BottomNavigationBar底部導(dǎo)航的使用方法