Android开发之平板和横竖屏适配-RecyclerView
需求:Android中RecyclerView在平板上实现列表横屏4个卡片,竖屏3个卡片,手机上2个卡片?
1. 添加依赖
确保在 build.gradle 中添加了 RecyclerView 的依赖:
implementation 'androidx.recyclerview:recyclerview:1.2.1'
2. 创建布局文件
在 res/layout 目录下创建一个 RecyclerView 的布局文件,例如 activity_main.xml:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
3. 创建适配器
创建一个简单的 RecyclerView 适配器,例如 MyAdapter.kt:
class MyAdapter(private val items: List<String>) : RecyclerView.Adapter<MyAdapter.ViewHolder>() {
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val textView: TextView = view.findViewById(android.R.id.text1)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(android.R.layout.simple_list_item_1, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.textView.text = items[position]
}
override fun getItemCount() = items.size
}
要在屏幕横竖屏切换时动态更新 RecyclerView 的列数,可以重写 onConfigurationChanged 方法。这样,当设备的配置(如屏幕方向)发生变化时,可以重新设置 GridLayoutManager 的列数。以下是具体实现:
1. 更新 AndroidManifest.xml
首先,确保在 AndroidManifest.xml 中为你的 Activity 添加 configChanges 属性,以避免 Activity 重建:
<activity
android:name=".MainActivity"
android:configChanges="orientation|screenSize">
</activity>
2. 修改 MainActivity.kt
在 MainActivity.kt 中,重写 onConfigurationChanged 方法,并在其中更新 RecyclerView 的列数:
class MainActivity : AppCompatActivity() {
private lateinit var recyclerView: RecyclerView
private lateinit var adapter: MyAdapter
private val items = List(100) { "Item $it" } // 示例数据
private lateinit var layoutManager: GridLayoutManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
recyclerView = findViewById(R.id.recyclerView)
adapter = MyAdapter(items)
recyclerView.adapter = adapter
// 初始化 GridLayoutManager
layoutManager = GridLayoutManager(this, getColumnCount())
recyclerView.layoutManager = layoutManager
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
// 更新列数
layoutManager.spanCount = getColumnCount()
layoutManager.requestLayout() // 请求重新布局
}
private fun getColumnCount(): Int {
return when {
resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE && isTablet() -> 4
resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT && isTablet() -> 3
else -> 2
}
}
private fun isTablet(): Boolean {
return (resources.configuration.screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE
}
}
3. 运行应用
现在,当你在设备上切换屏幕方向时,RecyclerView 的列数将根据当前的方向和设备类型动态更新。
总结
通过重写 onConfigurationChanged 方法并更新 GridLayoutManager 的列数,你可以实现 RecyclerView 在屏幕横竖屏切换时的动态变化。这种方式确保了用户在使用应用时能够获得良好的体验。