網站首頁 編程語言 正文
1.RecyclerView介紹
- RecyclerView是一個增強版的ListView(Android 5.0推出)。
- 被用來代替ListView和GridView控件,并且能夠實現瀑布流的布局。
- 它更加高級并且更加靈活·,可提供更為高效的回收復用機制,同時實現管理與視圖的解耦合。
2.RecyclerView控件的使用
步驟: 在項目的build.gradle中添加RecyclerView庫的依賴。
implementation 'androidx.recyclerview:recyclerview:1.2.1'
在布局中加入RecyclerView控件和為RecyclerView的子項指定一個我們自定義的布局。
<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適配器
- 要創建一個Adapter類,該類繼承于RecyclerView.Adapter<VH>,其中VH是我們在Adapter類中創建的一個繼承于RecyclerView.ViewHolder的內部類。
- 該Adapter類主要有3個方法和一個自定義ViewHolder組成。
(1)onCreateViewHolder:創建ViewHolder并返回,后續item布局里控件都是從ViewHolder中取出
(2)onBindViewHolder:通過方法提供ViewHolder,將數據綁定到ViewHolder。
(3)getItemCount:獲取數據源總的條數。
(4)viewHolder:這是RecyclerView.ViewHolder的實現類,可用于初始化item布局中的子控件。需要注意的是,在這個類的構造方法中需要傳遞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綁定數據適配器
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()
//設置RecyclerView布局管理器
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))
}
}
}
效果如圖:
3.實現橫向滾動
瀑布流布局和網格布局
橫向滾動
(1)對子布局進行修改
<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)對子布局進行修改
LinearLayout的寬度改為match_parent,因為瀑布流布局的寬度是根據布局的列數自動適配的,而不是一個固定值。
<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)
效果圖:
網格布局
(1)在MainActivity中加入一行代碼
val layoutManager=GridLayoutManager(this,3)
效果圖:
4.RecyclerView的點擊事件
與ListView不同的是,RecyclerView并沒有提供類似于setOnItemClickListener()這樣的注冊監聽器,而是需要我們自己給子項具體的View去注冊點擊事件。
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,"你點擊了${fruit.name}",Toast.LENGTH_SHORT).show()
}
viewHolder.fruitImage.setOnClickListener{
val position=viewHolder.bindingAdapterPosition
val fruit=fruitList[position]
Toast.makeText(parent.context,"你點擊了${fruit.name}的圖片",Toast.LENGTH_SHORT).show()
}
return viewHolder
}
效果圖:
getAdapterPosition()方法被標記成了廢棄問題:
官方放棄getAdapterPosition()方法,換成了getbindingAdapter()和getAbsoluteAdapterPosition()方法,當使用recyclerView的監聽事件時,
getbindingAdapter():表示單個數據源的單獨位置。
getAbsoluteAdapterPosition():表示多個數據源的位置。
5.下拉刷新
1.SwipeRefreshLayout控件的介紹
SwipeRefreshLayout控件是谷歌公司提供的下拉刷新控件,具有使用簡單、靈活等特點。
SwipeRefreshLayout控件的方法有很大,這里只介紹常用的5個方法:
- isRefreshing()
判斷當前的狀態是否是刷新狀態
- setColorSchemeResources()
設置下拉進度條的顏色主題,參數為可變參數,并且為資源ID,可以用來設置多種不同的顏色,沒轉一圈就顯示一種顏色。
- setOnRefreshListener()
設置監聽,需要重寫onRefresh()方法頂部下拉時會調用這個方法。在里面實現請求數據的邏輯,設置下拉進度條消失等。
- setProgressBackgroundColorSchemeResource()
設置下拉進度條的背景顏色,默認為白色。
- setRefreshing(boolean refreshing)
設置刷新狀態,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>
首先調用swipeRefreshLayout的setColorSchemeResources()方法設置下拉刷新進度條的顏色,接著調用swipeRefreshLayout的setOnRefreshListener()方法來設置一個下拉刷新的監聽器,當觸發了下拉刷新事件時,就去網絡上請求最新的數據,然后再將這些數據展示出來。
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
}
}
}
原文鏈接:https://blog.csdn.net/weixin_63357306/article/details/128052030
相關推薦
- 2022-02-07 SecureCRT連Linux服務器,提示The remote system refused the
- 2021-12-14 RHCE橋接,免密登錄和修改端口號介紹_Linux
- 2022-11-04 Android自定義定時鬧鐘開發_Android
- 2023-01-30 django中只使用ModleForm的表單驗證_python
- 2024-04-08 Stack.peek()與Stack.pop() 以及 poll與pop
- 2023-03-20 C#?BeginInvoke實現異步編程方式_C#教程
- 2022-04-04 小程序Arrow function should not return assignment
- 2022-09-24 詳解K8S?apiVersion對照表_云其它
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支