Android RecyclerView詳解之實(shí)現(xiàn) ListView GridView瀑布流效果
什么是RecyclerView
RecyclerView 是Google推出的最新的 替代ListView、GridView的組件,RecyclerView是用來(lái)顯示大量數(shù)據(jù)的容器,并通過(guò)有限數(shù)量的子View,來(lái)提高滾動(dòng)時(shí)的性能。
與ListView不同,RecyclerView 不再負(fù)責(zé)布局,而是專注于布局復(fù)用。布局主要通過(guò) LayoutManager來(lái)管理,目前提供了3種常用的布局管理:
LinearLayoutManager 線性布局管理器 (ListView效果)
GridLayoutManager 網(wǎng)格布局管理器 (GridView效果)
StaggeredGridLayoutManager 瀑布流管理器
RecyclerView 主要通過(guò)Adapter 來(lái)獲得要顯示的子View。Adapter要繼承RecyclerView.Adapter類,并且 需要制定一個(gè) RecyclerView.ViewHolder子類的泛型。
使用RecyclerView需要導(dǎo)包,需要在 build.gradle上加入依賴
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:21.0.3' compile 'com.android.support:recyclerview-v7:21.0.3' ... }
代碼如下:
//繼承自 RecyclerView.Adapter class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { //RecyclerView顯示的子View //該方法返回是ViewHolder,當(dāng)有可復(fù)用View時(shí),就不再調(diào)用 @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View v = getLayoutInflater().inflate(R.layout.recycler_item, null); return new ViewHolder(v); } //將數(shù)據(jù)綁定到子View,會(huì)自動(dòng)復(fù)用View @Override public void onBindViewHolder(ViewHolder viewHolder, int i) { viewHolder.textView.setText(data[i]); } //RecyclerView顯示數(shù)據(jù)條數(shù) @Override public int getItemCount() { return data.length; } //自定義的ViewHolder,減少findViewById調(diào)用次數(shù) class ViewHolder extends RecyclerView.ViewHolder { TextView textView; ImageView imageView; //在布局中找到所含有的UI組件 public ViewHolder(View itemView) { super(itemView); textView = (TextView) itemView.findViewById(R.id.textView); imageView = (ImageView) itemView.findViewById(R.id.imageView); } } }
注意:當(dāng)數(shù)據(jù)發(fā)生變化時(shí),可以通過(guò)notifyDataSetChanged來(lái)刷新UI,通過(guò)getItemViewType來(lái)獲取對(duì)應(yīng)位置的類型,但是它不再需要你指定有多少類型了,因?yàn)樵摲椒ㄒ呀?jīng)能夠判斷出有多少類型。
子View布局如下:res/layout/recycler
<?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"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageView" android:src="@drawable/ic_launcher" /> <TextView android:layout_width="wrap_content" android:layout_height="match_parent" android:text="Medium Text" android:layout_marginLeft="5dp" android:gravity="center_vertical" android:id="@+id/textView" /> </LinearLayout>
Adapter準(zhǔn)備好后,接下來(lái)就準(zhǔn)備RecyclerView。在Activity的布局中加入RecyclerView
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout>
然后在Activity中,加入初始化、設(shè)置的代碼
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //找到 RecyclerView RecyclerView recylcer = (RecyclerView) findViewById(R.id.recyclerView); //ListView效果的 LinearLayoutManager LinearLayoutManager mgr = new LinearLayoutManager(this); //VERTICAL縱向,類似ListView,HORIZONTAL<span style="font-family: Arial, Helvetica, sans-serif;">橫向,類似Gallery</span> mgr.setOrientation(LinearLayoutManager.VERTICAL); recylcer.setLayoutManager(mgr); //設(shè)置適配器 recylcer.setAdapter(new MyAdapter()); }
運(yùn)行后的效果如下:
如果要顯示為 GridView效果,只用把LinearLayoutManager 換成 GridLayoutManager
//GridLayout 3列 GridLayoutManager mgr=new GridLayoutManager(this,3); recylcer.setLayoutManager(mgr);
效果如下:
如果要顯示效果為 瀑布流,則需要換成 StaggeredGridLayoutManager。
//3列 方向垂直 StaggeredGridLayoutManager mgr = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL); recylcer.setLayoutManager(mgr);
使用瀑布流時(shí),高度最好不一樣,所以可以隨機(jī)設(shè)置下子View的高度。修改Adapter中的方法
//將數(shù)據(jù)綁定到子View @Override public void onBindViewHolder(ViewHolder viewHolder, int i) { viewHolder.textView.setText(data[i]); LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, <span style="white-space:pre"> </span>100+(int) (Math.random() * 50)); viewHolder.imageView.setLayoutParams(lp); }
運(yùn)行效果如下:
以上所述是小編給大家介紹的Android RecyclerView詳解之實(shí)現(xiàn) ListView GridView瀑布流效果,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
如何在Android 中實(shí)現(xiàn)scp操作
這篇文章主要介紹了如何在Android 中實(shí)現(xiàn)scp操作,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下2021-03-03Android 超詳細(xì)SplashScreen入門教程
Android 12正式版即將發(fā)布,有一個(gè)非常顯著的視覺變化就是,Android 12強(qiáng)制給所有的App都增加了SplashScreen的功能。是的,即使你什么都不做,只要你的App安裝到了Android 12手機(jī)上,都會(huì)自動(dòng)擁有這個(gè)新功能2022-03-03android開發(fā)之橫向滾動(dòng)/豎向滾動(dòng)的ListView(固定列頭)
由于項(xiàng)目需要,我們需要一個(gè)可以橫向滾動(dòng)的,又可以豎向滾動(dòng)的 表格;經(jīng)過(guò)幾天的研究終于搞定,感興趣的朋友可以了解下哦2013-01-01Android環(huán)形進(jìn)度條(安卓默認(rèn)形式)實(shí)例代碼
這篇文章主要介紹了Android環(huán)形進(jìn)度條(安卓默認(rèn)形式)實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-03-03Android實(shí)現(xiàn)雙層ViewPager嵌套
這篇文章主要介紹了Android實(shí)現(xiàn)雙層ViewPager嵌套,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04Android開發(fā)實(shí)現(xiàn)錄屏小功能
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)錄屏小功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07