如何用Java/Kotlin在原生Android实现类亚马逊/Flipkart筛选界面并动态加载Fragment?
实现Android筛选界面:RecyclerView联动动态Fragment切换
一、基础布局搭建
先编写主界面XML布局,左侧放置RecyclerView作为筛选选项列表,右侧用FrameLayout作为Fragment的容器:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <!-- 左侧筛选选项列表 --> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rvFilterOptions" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@color/white" /> <!-- 右侧Fragment容器 --> <FrameLayout android:id="@+id/flFilterContent" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="2" android:background="@color/gray_f5" /> </LinearLayout>
二、RecyclerView适配器与点击回调
实现RecyclerView的适配器,核心是处理列表项的点击事件,将选中的位置传递给Activity,同时维护列表项的选中状态:
Kotlin示例:
class FilterOptionAdapter( private val options: List<String>, private val onItemClick: (Int) -> Unit ) : RecyclerView.Adapter<FilterOptionAdapter.ViewHolder>() { private var selectedPosition = 0 // 记录当前选中的选项位置 inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val tvOption: TextView = itemView.findViewById(R.id.tvOption) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val view = LayoutInflater.from(parent.context) .inflate(R.layout.item_filter_option, parent, false) return ViewHolder(view) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { holder.tvOption.text = options[position] // 设置选中/未选中的样式区分 holder.itemView.setBackgroundColor( if (position == selectedPosition) Color.LTGRAY else Color.WHITE ) // 绑定点击事件 holder.itemView.setOnClickListener { val oldSelected = selectedPosition selectedPosition = position // 更新旧选中项和新选中项的UI notifyItemChanged(oldSelected) notifyItemChanged(selectedPosition) // 回调给Activity处理Fragment切换 onItemClick(position) } } override fun getItemCount() = options.size }
对应的列表项布局item_filter_option.xml只需一个TextView,样式可根据需求自定义。
三、动态切换Fragment的核心逻辑
在Activity中初始化RecyclerView后,通过适配器的点击回调,根据选中位置创建对应Fragment,执行Fragment事务完成切换:
Kotlin示例:
class FilterActivity : AppCompatActivity() { private lateinit var rvFilterOptions: RecyclerView private lateinit var flFilterContent: FrameLayout private val filterOptions = listOf("分类", "价格", "品牌", "评分", "其他") private var currentFragmentTag: String? = null // 记录当前显示的Fragment标签 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_filter) rvFilterOptions = findViewById(R.id.rvFilterOptions) flFilterContent = findViewById(R.id.flFilterContent) // 初始化RecyclerView rvFilterOptions.layoutManager = LinearLayoutManager(this) val adapter = FilterOptionAdapter(filterOptions) { position -> switchFilterFragment(position) } rvFilterOptions.adapter = adapter // 默认加载第一个筛选Fragment switchFilterFragment(0) } private fun switchFilterFragment(position: Int) { val fragmentManager = supportFragmentManager val transaction = fragmentManager.beginTransaction() // 根据选中位置匹配对应的Fragment val targetFragment = when(position) { 0 -> CategoryFilterFragment() 1 -> PriceFilterFragment() 2 -> BrandFilterFragment() 3 -> RatingFilterFragment() else -> OtherFilterFragment() } val fragmentTag = "FRAGMENT_$position" // 如果当前显示的就是目标Fragment,直接返回 if (currentFragmentTag == fragmentTag) return // 处理Fragment事务:复用已存在的Fragment,避免重复创建 val existingFragment = fragmentManager.findFragmentByTag(fragmentTag) if (existingFragment != null) { // 隐藏当前显示的Fragment,显示目标Fragment currentFragmentTag?.let { tag -> fragmentManager.findFragmentByTag(tag)?.let { transaction.hide(it) } } transaction.show(existingFragment) } else { // 隐藏当前Fragment,添加新的目标Fragment currentFragmentTag?.let { tag -> fragmentManager.findFragmentByTag(tag)?.let { transaction.hide(it) } } transaction.add(R.id.flFilterContent, targetFragment, fragmentTag) } // 若需支持返回键切换历史Fragment,可添加到回退栈 // transaction.addToBackStack(null) transaction.commit() currentFragmentTag = fragmentTag } }
关键注意事项
- Fragment复用:通过标签判断Fragment是否已创建,用
hide/show替代replace,减少Fragment销毁重建的性能开销 - 选中状态同步:RecyclerView适配器内维护选中位置,切换时及时更新UI样式,保证和右侧Fragment的联动一致性
- 状态保存:如果需要屏幕旋转后保留当前筛选状态,可在
onSaveInstanceState中保存currentFragmentTag和选中位置,在onCreate恢复时重新切换
内容的提问来源于stack exchange,提问作者kishan antala
相关产品推荐
相关产品推荐

