Kotlin使用滾動(dòng)控件RecyclerView實(shí)例教程
1.RecyclerView介紹
- RecyclerView是一個(gè)增強(qiáng)版的ListView(Android 5.0推出)。
- 被用來(lái)代替ListView和GridView控件,并且能夠?qū)崿F(xiàn)瀑布流的布局。
- 它更加高級(jí)并且更加靈活·,可提供更為高效的回收復(fù)用機(jī)制,同時(shí)實(shí)現(xiàn)管理與視圖的解耦合。
2.RecyclerView控件的使用
步驟: 在項(xiàng)目的build.gradle中添加RecyclerView庫(kù)的依賴。
implementation 'androidx.recyclerview:recyclerview:1.2.1'
在布局中加入RecyclerView控件和為RecyclerView的子項(xiàng)指定一個(gè)我們自定義的布局。
<androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" />
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="60dp"> <ImageView android:id="@+id/fruitImage" android:layout_width="40dp" android:layout_height="40dp" android:layout_gravity="center_horizontal" android:layout_marginTop="10dp" /> <TextView android:id="@+id/fruitName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="10dp"/> </LinearLayout>
自定義RecyclerView.Adapter適配器
- 要?jiǎng)?chuàng)建一個(gè)Adapter類,該類繼承于RecyclerView.Adapter<VH>,其中VH是我們?cè)贏dapter類中創(chuàng)建的一個(gè)繼承于RecyclerView.ViewHolder的內(nèi)部類。
- 該Adapter類主要有3個(gè)方法和一個(gè)自定義ViewHolder組成。
(1)onCreateViewHolder:創(chuàng)建ViewHolder并返回,后續(xù)item布局里控件都是從ViewHolder中取出
(2)onBindViewHolder:通過(guò)方法提供ViewHolder,將數(shù)據(jù)綁定到ViewHolder。
(3)getItemCount:獲取數(shù)據(jù)源總的條數(shù)。
(4)viewHolder:這是RecyclerView.ViewHolder的實(shí)現(xiàn)類,可用于初始化item布局中的子控件。需要注意的是,在這個(gè)類的構(gòu)造方法中需要傳遞item布局的View給父類。
class FruitAdapter(val fruitList:List<Fruit>):RecyclerView.Adapter<FruitAdapter.ViewHolder>(){ inner class ViewHolder(view: View):RecyclerView.ViewHolder(view){ val fruitName:TextView=view.findViewById(R.id.fruitName) val fruitImage:ImageView=view.findViewById(R.id.fruitImage) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val view=LayoutInflater.from(parent.context).inflate(R.layout.fruit_item,parent,false) return ViewHolder(view) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { val fruit=fruitList[position] holder.fruitImage.setImageResource(fruit.imageId) holder.fruitName.text=fruit.name } override fun getItemCount(): Int { return fruitList.size } }
RecyclerView綁定數(shù)據(jù)適配器
class MainActivity : AppCompatActivity() { private val fruitList = ArrayList<Fruit>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) //初始化控件 val recyclerView = findViewById<RecyclerView>(R.id.recyclerView) initFruits() //設(shè)置RecyclerView布局管理器 val layoutManager = LinearLayoutManager(this) recyclerView.layoutManager = layoutManager //設(shè)置適配器 val adapter = FruitAdapter(fruitList) recyclerView.adapter = adapter } private fun initFruits() { repeat(2) { fruitList.add(Fruit("Apple", R.drawable.apple_pic)) fruitList.add(Fruit("Banana", R.drawable.banana_pic)) fruitList.add(Fruit("Orange", R.drawable.orange_pic)) fruitList.add(Fruit("Watermelon", R.drawable.watermelon_pic)) fruitList.add(Fruit("Pear", R.drawable.pear_pic)) fruitList.add(Fruit("Grape", R.drawable.grape_pic)) fruitList.add(Fruit("Pineapple", R.drawable.pineapple_pic)) fruitList.add(Fruit("Strawberry", R.drawable.strawberry_pic)) fruitList.add(Fruit("Cherry", R.drawable.cherry_pic)) fruitList.add(Fruit("Mango", R.drawable.mango_pic)) } } }
效果如圖:
3.實(shí)現(xiàn)橫向滾動(dòng)
瀑布流布局和網(wǎng)格布局
橫向滾動(dòng)
(1)對(duì)子布局進(jìn)行修改
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="80dp" android:layout_height="wrap_content"> <ImageView android:id="@+id/fruitImage" android:layout_width="40dp" android:layout_height="40dp" android:layout_gravity="center_horizontal" android:layout_marginTop="10dp" /> <TextView android:id="@+id/fruitName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="10dp"/> </LinearLayout>
(2)在MainActivity中加入一行代碼
layoutManager.orientation=LinearLayoutManager.HORIZONTAL//表示讓布局橫行排列
效果圖:
瀑布流布局
(1)對(duì)子布局進(jìn)行修改
LinearLayout的寬度改為match_parent,因?yàn)槠俨剂鞑季值膶挾仁歉鶕?jù)布局的列數(shù)自動(dòng)適配的,而不是一個(gè)固定值。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dp"> <ImageView android:id="@+id/fruitImage" android:layout_width="40dp" android:layout_height="40dp" android:layout_gravity="center_horizontal" android:layout_marginTop="10dp" /> <TextView android:id="@+id/fruitName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="left" android:layout_marginTop="10dp"/> </LinearLayout>
(2)在MainActivity中加入一行代碼
val layoutManager=StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL)
效果圖:
網(wǎng)格布局
(1)在MainActivity中加入一行代碼
val layoutManager=GridLayoutManager(this,3)
效果圖:
4.RecyclerView的點(diǎn)擊事件
與ListView不同的是,RecyclerView并沒(méi)有提供類似于setOnItemClickListener()這樣的注冊(cè)監(jiān)聽(tīng)器,而是需要我們自己給子項(xiàng)具體的View去注冊(cè)點(diǎn)擊事件。
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val view=LayoutInflater.from(parent.context).inflate(R.layout.fruit_item,parent,false) val viewHolder=ViewHolder(view) viewHolder.itemView.setOnClickListener { val position=viewHolder.bindingAdapterPosition val fruit=fruitList[position] Toast.makeText(parent.context,"你點(diǎn)擊了${fruit.name}",Toast.LENGTH_SHORT).show() } viewHolder.fruitImage.setOnClickListener{ val position=viewHolder.bindingAdapterPosition val fruit=fruitList[position] Toast.makeText(parent.context,"你點(diǎn)擊了${fruit.name}的圖片",Toast.LENGTH_SHORT).show() } return viewHolder }
效果圖:
getAdapterPosition()方法被標(biāo)記成了廢棄問(wèn)題:
官方放棄getAdapterPosition()方法,換成了getbindingAdapter()和getAbsoluteAdapterPosition()方法,當(dāng)使用recyclerView的監(jiān)聽(tīng)事件時(shí),
getbindingAdapter():表示單個(gè)數(shù)據(jù)源的單獨(dú)位置。
getAbsoluteAdapterPosition():表示多個(gè)數(shù)據(jù)源的位置。
5.下拉刷新
1.SwipeRefreshLayout控件的介紹
SwipeRefreshLayout控件是谷歌公司提供的下拉刷新控件,具有使用簡(jiǎn)單、靈活等特點(diǎn)。
SwipeRefreshLayout控件的方法有很大,這里只介紹常用的5個(gè)方法:
- isRefreshing()
判斷當(dāng)前的狀態(tài)是否是刷新?tīng)顟B(tài)
- setColorSchemeResources()
設(shè)置下拉進(jìn)度條的顏色主題,參數(shù)為可變參數(shù),并且為資源ID,可以用來(lái)設(shè)置多種不同的顏色,沒(méi)轉(zhuǎn)一圈就顯示一種顏色。
- setOnRefreshListener()
設(shè)置監(jiān)聽(tīng),需要重寫(xiě)onRefresh()方法頂部下拉時(shí)會(huì)調(diào)用這個(gè)方法。在里面實(shí)現(xiàn)請(qǐng)求數(shù)據(jù)的邏輯,設(shè)置下拉進(jìn)度條消失等。
- setProgressBackgroundColorSchemeResource()
設(shè)置下拉進(jìn)度條的背景顏色,默認(rèn)為白色。
- setRefreshing(boolean refreshing)
設(shè)置刷新?tīng)顟B(tài),true表示正在刷新,false表示取消刷新。
2.SwipeRefreshLayout控件的使用
添加依賴
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
在RecyclerView的外面嵌套一層SwipeRefreshLayout,這樣RecyclerView就擁有下拉刷新功能了。
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout android:id="@+id/swipeRefresh" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent"/> </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
首先調(diào)用swipeRefreshLayout的setColorSchemeResources()方法設(shè)置下拉刷新進(jìn)度條的顏色,接著調(diào)用swipeRefreshLayout的setOnRefreshListener()方法來(lái)設(shè)置一個(gè)下拉刷新的監(jiān)聽(tīng)器,當(dāng)觸發(fā)了下拉刷新事件時(shí),就去網(wǎng)絡(luò)上請(qǐng)求最新的數(shù)據(jù),然后再將這些數(shù)據(jù)展示出來(lái)。
val swipeRefresh:SwipeRefreshLayout=findViewById(R.id.swipeRefresh) swipeRefresh.setColorSchemeResources(R.color.purple_200) swipeRefresh.setOnRefreshListener { thread { Thread.sleep(2000) runOnUiThread { initFruits() adapter.notifyDataSetChanged() swipeRefresh.isRefreshing=false } } }
到此這篇關(guān)于Kotlin使用滾動(dòng)控件RecyclerView實(shí)例教程的文章就介紹到這了,更多相關(guān)Kotlin RecyclerView內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android?app啟動(dòng)節(jié)點(diǎn)與上報(bào)啟動(dòng)實(shí)例詳解
系統(tǒng)的啟動(dòng)過(guò)程非常復(fù)雜,下面這篇文章主要給大家介紹了關(guān)于Android?app啟動(dòng)節(jié)點(diǎn)與上報(bào)啟動(dòng)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04解決EditText、ListView以及GridView同時(shí)使用,輸入法自動(dòng)跳出來(lái)的方法
本篇文章是對(duì)在Android中EditText、ListView以及GridView同時(shí)使用,輸入法自動(dòng)跳出來(lái)的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Android實(shí)現(xiàn)帶圓環(huán)的圓形頭像
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)帶圓環(huán)的圓形頭像,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08Android studio 切換flutterSDK之后報(bào)錯(cuò)及解決辦法(推薦)
這篇文章主要介紹了Android studio 切換flutterSDK之后報(bào)錯(cuò)及解決辦法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07Flutter實(shí)現(xiàn)可以縮放拖拽的圖片示例代碼
這篇文章主要給大家介紹了關(guān)于利用Flutter實(shí)現(xiàn)可以縮放拖拽的圖片的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Flutter具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06Android 將文件下載到指定目錄的實(shí)現(xiàn)代碼
本文通過(guò)實(shí)例代碼給大家介紹了android將文件下載到指定目錄的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-06-06Android開(kāi)發(fā)之TextView控件用法實(shí)例總結(jié)
這篇文章主要介紹了Android開(kāi)發(fā)之TextView控件用法,結(jié)合實(shí)例形式總結(jié)分析了TextView控件常用的屬性設(shè)置及使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-02-02