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

 

posted on 2024-10-24 10:42  巫山老妖  阅读(47)  评论(0编辑  收藏  举报