您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)Android中RecyclerView的具體使用方法,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
和我們之前學(xué)習(xí)的控件不一樣,RecyclerView 屬于新增控件,所以我們需要在項(xiàng)目的 build.gradle 中添加 RecyclerView 庫(kù)的依賴,才能使用該控件
dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation 'androidx.core:core-ktx:1.2.0' implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'com.google.android.material:material:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.recyclerview:recyclerview:1.1.0' testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' }
修改 activity_main.xml 中的代碼,如下所示
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" 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" /> </LinearLayout>
這里我們想要使用 RecyclerView 實(shí)現(xiàn)了 ListView 一樣的效果,準(zhǔn)備一個(gè)適配器,新建 FruitAdapter 類,讓這個(gè)適配器繼承 RecyclerView.Adapter,并將泛型指定為 FruitAdapter.ViewHolder,其中 ViewHolder 是我們?cè)?FruitAdapter 中定義的一個(gè)內(nèi)部類
class FruitAdapter(val fruitList: List<Fruit>) : RecyclerView.Adapter<FruitAdapter.ViewHolder>() { inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { val fruitImage: ImageView = view.findViewById(R.id.fruitImage) val fruitName: TextView = view.findViewById(R.id.fruitName) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FruitAdapter.ViewHolder { val view = LayoutInflater.from(parent.context).inflate(R.layout.fruit_item, parent, false) return ViewHolder(view) } override fun getItemCount() = fruitList.size override fun onBindViewHolder(holder: FruitAdapter.ViewHolder, position: Int) { val fruit = fruitList[position] holder.fruitImage.setImageResource(fruit.imageId) holder.fruitName.text = fruit.name } }
首先,我們定義一個(gè)內(nèi)部類 ViewHolder,繼承自 RecyclerView.ViewHolder,然后 ViewHolder 的主構(gòu)造函數(shù)中傳入一個(gè) View 參數(shù),這個(gè)參數(shù)通常是 RecyclerView 子項(xiàng)的最外層布局,然后我們就可以通過(guò) findViewById() 方法來(lái)獲取布局中的 ImageView 和 TextView 實(shí)例了
FruitAdapter 繼承自 RecyclerView.Adapter,那么就必須重寫(xiě) onCreateViewHolder()、onBindViewHolder()、getItemCount() 這三個(gè)方法:
onCreateViewHolder() 方法用于創(chuàng)建 ViewHolder 實(shí)例
onBindViewHolder() 方法用于對(duì) RecyclerView 子項(xiàng)的數(shù)據(jù)進(jìn)行賦值
getItemCount() 方法告訴 RecyclerView 一共有多少個(gè)子項(xiàng),直接返回?cái)?shù)據(jù)源的長(zhǎng)度
修改 MainActivity 中的代碼,開(kāi)始使用 RecyclerView
class MainActivity : AppCompatActivity() { private val fruitList = ArrayList<Fruit>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) initFruits() val layoutManager = LinearLayoutManager(this) recyclerView.layoutManager = layoutManager 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)) } } }
在 onCreate() 方法中先創(chuàng)建一個(gè) LinearLayoutManager 對(duì)象,并設(shè)置到 RecyclerView 中,用于指定 RecyclerView 的布局方式。然后再創(chuàng)建 FruitAdapter 的實(shí)例,調(diào)用 RecyclerView 的 setAdapter() 方法完成適配器設(shè)置
如果我們要實(shí)現(xiàn)橫向滾動(dòng)的話,要先對(duì) fruit_item 的布局進(jìn)行修改,把里面的元素改成垂直排列
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="80dp" android:layout_height="wrap_content" tools:ignore="UseCompoundDrawables"> <ImageView android:id="@+id/fruitImage" android:layout_width="40dp" android:layout_height="40dp" android:layout_gravity="center_vertical" android:layout_marginLeft="10dp" tools:ignore="ContentDescription,RtlHardcoded" /> <TextView android:id="@+id/fruitName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginLeft="10dp" tools:ignore="RtlHardcoded" /> </LinearLayout>
接下來(lái)修改 MainActivity 中的代碼
class MainActivity : AppCompatActivity() { private val fruitList = ArrayList<Fruit>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) initFruits() val layoutManager = LinearLayoutManager(this) layoutManager.orientation = LinearLayoutManager.HORIZONTAL recyclerView.layoutManager = layoutManager val adapter = FruitAdapter(fruitList) recyclerView.adapter = adapter } ... }
除了橫向滾動(dòng),RecyclerView 還能實(shí)現(xiàn)瀑布流和網(wǎng)格布局
不同于 ListView,RecyclerView 并沒(méi)有提供類似于 setOnItemClickListener() 這樣的注冊(cè)監(jiān)聽(tīng)器方法,而是需要我們自己給子項(xiàng)具體的 View 注冊(cè)點(diǎn)擊事件
修改 FruitAdapter 中的代碼
class FruitAdapter(val fruitList: List<Fruit>) : RecyclerView.Adapter<FruitAdapter.ViewHolder>() { inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { val fruitImage: ImageView = view.findViewById(R.id.fruitImage) val fruitName: TextView = view.findViewById(R.id.fruitName) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FruitAdapter.ViewHolder { val view = LayoutInflater.from(parent.context).inflate(R.layout.fruit_item, parent, false) val viewHolder = ViewHolder(view) viewHolder.itemView.setOnClickListener { val position = viewHolder.adapterPosition Log.d("FruitAdapter", position.toString()) val fruit = fruitList[position] Toast.makeText(parent.context, "you clicked view ${fruit.name}", Toast.LENGTH_SHORT).show() } viewHolder.fruitImage.setOnClickListener { val position = viewHolder.adapterPosition Log.d("FruitAdapter", position.toString()) val fruit = fruitList[position] Toast.makeText(parent.context, "you clicked image ${fruit.name}", Toast.LENGTH_SHORT).show() } return viewHolder } override fun getItemCount() = fruitList.size override fun onBindViewHolder(holder: FruitAdapter.ViewHolder, position: Int) { val fruit = fruitList[position] holder.fruitImage.setImageResource(fruit.imageId) holder.fruitName.text = fruit.name } }
以上就是Android中RecyclerView的具體使用方法,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。