【问题标题】:How I can open fragments from Recyclerview?如何从 Recyclerview 打开片段?
【发布时间】:2020-09-25 22:38:58
【问题描述】:

科特林 嗨,我想知道如何从 recyclerview 打开片段(我想要汽车项目打开 cars_fragment,艺术项目打开 art_fragment......)。

非常感谢您的帮助!谢谢!

这是我的适配器,我没有添加 clicklistner,因为我在运行代码时遇到错误

类别适配器

class CategoriesAdapter(var context: CategoriesFragment, var arrayList: ArrayList<CategoriesModel>) : RecyclerView.Adapter<CategoriesAdapter.ItemHolder>() {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemHolder {

    val itemHolder = LayoutInflater.from(parent.context)
        .inflate(R.layout.categorie_gridlayout, parent, false)
    return ItemHolder(itemHolder)
}

override fun onBindViewHolder(holder: ItemHolder, position: Int) {

    val categoriesModel: CategoriesModel = arrayList[position]

    holder.images.setImageResource(categoriesModel.imagesGrid!!)
    holder.titles.text = categoriesModel.textGrid


}

override fun getItemCount(): Int {
    return arrayList.size
}

class ItemHolder (itemView : View) : RecyclerView.ViewHolder(itemView) {

    var images = itemView.findViewById<ImageView>(R.id.categories_images)
    var  titles = itemView.findViewById<TextView>(R.id.categories_title)
}

}

这是我的 Categories_fragment

Categories_fragment

class CategoriesFragment : Fragment() {

private var recyclerView : RecyclerView? = null
private var gridLayoutManger : GridLayoutManager? = null
private var arrayList : ArrayList<CategoriesModel>? = null
private var categoriesAdapter : CategoriesAdapter? = null


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)


}

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
    val rootView = inflater.inflate(R.layout.fragment_categories, container, false)

    recyclerView = rootView.findViewById(R.id.categories_recycler) as RecyclerView
    gridLayoutManger = GridLayoutManager(context,2, LinearLayoutManager.VERTICAL, false)
    recyclerView?.layoutManager = gridLayoutManger
    recyclerView?.setHasFixedSize(true)
    arrayList = ArrayList()
    arrayList = setDataInList()
    categoriesAdapter = CategoriesAdapter(this,arrayList!!)
    recyclerView?.adapter = categoriesAdapter
    return rootView

}

private fun setDataInList() : ArrayList<CategoriesModel>{

    val items : ArrayList<CategoriesModel> = ArrayList()

    items.add(CategoriesModel(R.drawable.drawable_cars, "CARS"))
    items.add(CategoriesModel(R.drawable.drawable_abstract, "ABSTRACT"))
    items.add(CategoriesModel(R.drawable.drawable_city, "CITY"))
    items.add(CategoriesModel(R.drawable.drawable_nature, "NATURE"))
    items.add(CategoriesModel(R.drawable.drawable_3d, "3D"))
    items.add(CategoriesModel(R.drawable.drawable_space, "SPACE"))
    items.add(CategoriesModel(R.drawable.drawable_love, "LOVE"))
    items.add(CategoriesModel(R.drawable.drawable_minimalist, "MINIMLAIST"))
    items.add(CategoriesModel(R.drawable.drawable_art, "ART"))
    items.add(CategoriesModel(R.drawable.drawable_sport, "SPORT"))
    items.add(CategoriesModel(R.drawable.drawable_anime, "ANIME"))
    items.add(CategoriesModel(R.drawable.drawable_typography, "TYPOGRAPHY"))
    items.add(CategoriesModel(R.drawable.drawable_music, "MUSIC"))
    items.add(CategoriesModel(R.drawable.drawable_4k, "4K"))

    return items
}

}

【问题讨论】:

    标签: kotlin android-recyclerview fragment adapter


    【解决方案1】:

    使用监听器回调片段并打开另一个片段

    第一步:定义接口

        interface CategoriesAdapterListener {
    
            fun itemClick()
        }
    

    第二步:实现接口

    class CategoriesFragment : Fragment(), CategoriesAdapterListener {
    
        override fun itemClick() {
          //open fragment
        }
    

    第三步:将其传递给适配器

    //modify adapter constructor parameter
    categoriesAdapter = CategoriesAdapter(this, this,arrayList!!)
    
    //modify adapter constructor
    class CategoriesAdapter(
     var listener: CategoriesAdapterListener,
     var context: CategoriesFragment,
     var arrayList: ArrayList<CategoriesModel>)
    

    step4:viewHolder被点击时回调

    override fun onBindViewHolder(holder: ItemHolder, position: Int) {
    
        val categoriesModel: CategoriesModel = arrayList[position]
    
        holder.images.setImageResource(categoriesModel.imagesGrid!!)
        holder.titles.text = categoriesModel.textGrid
    
        holder.titles.setOnClickListener {
    
          listener.itemClick()//callback
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      相关资源
      最近更新 更多