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
在屏幕横竖屏切换时的动态变化。这种方式确保了用户在使用应用时能够获得良好的体验。