欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

RecyclerView使用詳解(代替ListView)

 更新時(shí)間:2017年12月05日 10:43:44   作者:ZhengJiaoCsdn  
這篇文章主要為大家詳細(xì)介紹了RecyclerView使用的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

老規(guī)矩,先看效果;

Recycler是android5.0版本中新添加的一個(gè)view;
使用之前必須添加依賴庫(kù):

dependencies { 
 compile 'com.android.support:recyclerview-v7:23.0.+' 
} 

這里我就不再過(guò)多的介紹RecyclerView,既然大家在找使用RecyclerView的demo想必大家都了解過(guò)了,如果不了解網(wǎng)上隨便打開一篇RecyclerView的文章應(yīng)該都有,已經(jīng)爛大街,在此就不過(guò)多的重復(fù)了;

今天寫的demo主要是利用RecyclerView代替普通的listview和橫向的listview;
個(gè)人感覺要想更深入的使用RecyclerView,必須要從最基礎(chǔ)的功能開始實(shí)現(xiàn);今天我們就實(shí)現(xiàn)最簡(jiǎn)單的五點(diǎn)功能:
功能點(diǎn):為RecyclerView添加點(diǎn)擊事件,添加頭布局和腳布局,添加下拉刷新和上拉加載更多;

好了首先說(shuō)下如何用RecyclerView代替橫向的listview:
RecyclerView的使用個(gè)人感覺其實(shí)比較簡(jiǎn)單,但是網(wǎng)上很多demo介紹的感覺有點(diǎn)復(fù)雜,在本文中RecyclerView的基本使用只需兩步:

第一:設(shè)置布局管理器

第二:設(shè)置adapter

//添加布局管理器,Orientation默認(rèn)是縱向的,所以我們?cè)诖诵枰謩?dòng)指定一下 
LinearLayoutManager layoutManager = new LinearLayoutManager(context); 
layoutManager.setOrientation(OrientationHelper.HORIZONTAL); 
recyclerView.setLayoutManager(layoutManager); 
 
//設(shè)置recyclerView標(biāo)記,如果確定內(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:線性布局,橫向或者縱向滑動(dòng)列表
GridLayoutManager:表格布局
StaggeredGridLayoutManager:流式布局
我們今天只使用第一種,先了解最實(shí)用,最基礎(chǔ)的,后期會(huì)更新

RecyclerView默認(rèn)是沒有分割線的,網(wǎng)上很多demo為了給RecyclerView添加分割線使用了系統(tǒng)提供的類;
個(gè)人感覺完全沒必要,甚至感覺多次一舉,個(gè)人感覺完全可以給RecyclerView和item設(shè)置背景實(shí)現(xiàn)分割線或者在item布局中添加view布局實(shí)現(xiàn);

首先了解下RecyclerView的adapter:

和listview的adapter有所不同,在這里需要繼承RecyclerView.Adapter,需要實(shí)現(xiàn)三個(gè)方法:
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方法,返回一個(gè)自定義的ViewHolder(當(dāng)RecyclerView需要一個(gè)ViewHolder時(shí)會(huì)回調(diào)該方法,如果有可復(fù)用的View不會(huì)回調(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)一個(gè)View需要出現(xiàn)在屏幕上時(shí),該方法會(huì)被回調(diào),我們需要再該方法中根據(jù)數(shù)據(jù)來(lái)更改視圖) 
 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有多少個(gè)視圖需要顯示) 
 public int getItemCount() { 
 return images.length; 
 } 
 
 //自定義的ViewHolder,持有每個(gè)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其實(shí)只需要實(shí)現(xiàn)三個(gè)方法,但是我這個(gè)adapter中卻多出來(lái)幾個(gè)方法,RecyclerView本身是沒有條目點(diǎn)擊事件的,所以多出來(lái)的幾個(gè)方法是變相的給RecyclerView設(shè)置設(shè)置條目點(diǎn)擊事件的,實(shí)際上是使用自定義監(jiān)聽給adapter設(shè)置了點(diǎn)擊事件;
自定義監(jiān)聽就不再過(guò)多介紹了,以前寫的博客中有專門介紹自定義監(jiān)聽的,不了解的朋友可以了解一下SwipeRefreshLayout實(shí)現(xiàn)ListView下拉刷新上拉加載

給RecyclerView設(shè)置adapter之后就可以使用了:

adapter.setOnItemClickListener(new HRecyclerViewAdapter.OnItemClickListener() { 
 @Override 
 public void onItemClick(int position) { 
 ToastUtils.showStaticToast(context,"當(dāng)前點(diǎn)擊的是第"+(position+1)+"張圖片"); 
 } 
 }); 

好了接下來(lái)了解下RecyclerView代替縱向listview:
分割線和上面一樣,在item中添加view實(shí)現(xiàn)分割線,點(diǎn)擊事件同樣是添加自定義監(jiān)聽;
RecyclerView默認(rèn)是沒辦法添加頭布局和腳布局的,上面橫向的沒有使用這一塊,但是縱向的在真實(shí)項(xiàng)目中就極有可能使用到這個(gè)功能點(diǎn)了,在網(wǎng)上看了好多大神們寫的添加頭布局和腳布局的方法,感覺真的是大神,寫的真的很復(fù)雜,所以都沒有使用,最后在git上找到一個(gè)自定義的RecyclerView直接繼承系統(tǒng)的RecyclerView,除了添加了兩個(gè)方法,其他的用法不變,感覺挺實(shí)用的,在此就不復(fù)制這個(gè)類了,源碼中都有(MyRecyclerView),使用的話直接復(fù)制到項(xiàng)目中即可;
添加頭布局和腳布局的方法也極為簡(jiǎn)單,和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,這個(gè)在以前的博客中也有介紹,在此就不再重復(fù)了,不了解的朋友可以了解一下
Android自定義ScrollView使用自定義監(jiān)聽

好了,剩下最后一個(gè)功能點(diǎn),上拉加載更多:
直接給RecyclerView添加活動(dòng)監(jiān)聽和添加腳布局實(shí)現(xiàn),首先得到當(dāng)前頁(yè)面顯示的條目個(gè)數(shù),adapter一共多少個(gè)條目,和當(dāng)前布局遮擋頁(yè)面?zhèn)€數(shù)
先求出用頁(yè)面實(shí)現(xiàn)個(gè)數(shù)+被頁(yè)面遮擋條目個(gè)數(shù)的和,然后拿這個(gè)和和adapter總條目個(gè)數(shù)做比較,當(dāng)?shù)扔诨蛘叽笥赼dapter條目個(gè)數(shù)的時(shí)候直接加載數(shù)據(jù):

//添加滑動(dòng)監(jiān)聽 
 myRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 
 @Override 
 //當(dāng)RecyclerView的滑動(dòng)狀態(tài)改變時(shí)觸發(fā) 
 public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
 super.onScrollStateChanged(recyclerView, newState); 
 } 
 
 @Override 
 //當(dāng)RecyclerView滑動(dòng)時(shí)觸發(fā)(類似點(diǎn)擊事件的MotionEvent.ACTION_MOVE) 
 public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
 super.onScrolled(recyclerView, dx, dy); 
 
 int visible = layoutManager.getChildCount();//當(dāng)天頁(yè)面顯示的條目個(gè)數(shù) 
 int total = layoutManager.getItemCount();//當(dāng)前一共多少個(gè)條目 
 int past= layoutManager.findFirstCompletelyVisibleItemPosition();//布局上面被當(dāng)住多少個(gè)條目 
 
 //當(dāng)活動(dòng)到最后一個(gè)條目時(shí)加載更多數(shù)據(jù) 
 if ((visible + past) >= total){ 
  <span style="white-space:pre"> </span>//發(fā)送handler加載數(shù)據(jù) 
  handler.sendEmptyMessageDelayed(1,1000); 
  
 } 
 
 } 
 }); 

好了,以上功能點(diǎn)已經(jīng)全部實(shí)現(xiàn),如果大家有更簡(jiǎn)單的方法實(shí)現(xiàn)以上功能點(diǎn),歡迎告知,感謝;

點(diǎn)擊打開鏈接免費(fèi)下載源碼

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

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

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

    這篇文章主要為大家介紹了Flutter檢查連接網(wǎng)絡(luò)connectivity_plus實(shí)現(xiàn)步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Android BottomNavigationBar底部導(dǎo)航的使用方法

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

    這篇文章主要為大家詳細(xì)介紹了Android BottomNavigationBar底部導(dǎo)航的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • MTK Android平臺(tái)開發(fā)流程

    MTK Android平臺(tái)開發(fā)流程

    這篇文章主要介紹了MTK在Android平臺(tái)開發(fā)的流程,一共分析了44個(gè)步驟,需要的朋友學(xué)習(xí)下吧。
    2017-12-12
  • 最新評(píng)論