首页 > 解决方案 > 如何将数据从 recyclerview 传递到片段?

问题描述

该项目有几个片段和一个活动。

其中一个片段包含recyclerview。我需要在单击项目 recyclerview 时打开一个片段并显示有关该项目的详细信息。我正在尝试直接从 recyclerview 传输数据,以免通过传递 id 和从数据库中提取数据来使代码复杂化(顺便说一下,我也无法传输 recyclerview 位置)。然而,bandle 是空的。我没有做错什么?

适配器

    class CarsRecyclerAdapter(val context: Context, var carList: List<Cars>):
    RecyclerView.Adapter<CarsRecyclerAdapter.CarsHolder>() {
    val db = MainActivity.getInstance(context)
    private var clickHandler: ClickEventHandler = context as ClickEventHandler


    inner class CarsHolder(item: View): RecyclerView.ViewHolder(item) {
        var binding = CarItemBinding.bind(item)


        fun bind(car: Cars, carInfoFragment: CarInfoFragment) = with(binding){
            carItemCarName.text = car.name
            carItemMileage.text = car.mileage + R.string.designation_km

            itemView.setOnClickListener {
                val bundle = Bundle()
                bundle.putString("title", "тест")
                carInfoFragment.arguments = bundle
                clickHandler.forwardClick(CarsHolder(it))
            }
          }
        }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CarsHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.car_item, parent, false)
        return CarsHolder(view)

    }

    override fun onBindViewHolder(holder: CarsHolder, position: Int) {
        holder.bind(carList[position], CarInfoFragment())

    }

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

    fun addCar(car: Cars){
        (carList as MutableList).add(car)
        notifyDataSetChanged()
    }

    fun removeItem(position: Int){
        val item = carList[position]
        (carList as MutableList).remove(item)
        notifyItemChanged(position)
        db.carsDao().delete(item)
    }

    interface ClickEventHandler {
        fun forwardClick(holder: CarsRecyclerAdapter.CarsHolder)
            }
}

Activity

    class MainActivity : AppCompatActivity(), CarsRecyclerAdapter.ClickEventHandler {
    lateinit var binding_main: ActivityMainBinding

    val mainFragment = MainFragment.newInstance()
    val carsFragment = CarsFragment.newInstance()
    val listFragment = ListFragment.newInstance()
    val carInfoFragment = CarInfoFragment.newInstance()



    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding_main = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding_main.root)
            supportFragmentManager.beginTransaction().replace(R.id.fragment_holder,
            MainFragment.newInstance()).commit()
        navigation()
            }


    companion object {
        @Volatile
        private var INSTANCE: CarsDatabase? = null

        fun getInstance(context: Context): CarsDatabase {
            synchronized(this) {
                var instance = INSTANCE

                if (instance == null) {
                    instance = Room.databaseBuilder(
                        context.applicationContext,
                        CarsDatabase::class.java,
                        "car_table"
                    )
                        .allowMainThreadQueries()
                        .build()
                    INSTANCE = instance
                }
                return instance
            }
        }
    }

    private fun navigation (){
        binding_main.bottonNavigation.selectedItemId = R.id.main
        binding_main.bottonNavigation.setOnNavigationItemSelectedListener{
            when(it.itemId){
                R.id.main -> {
                    supportFragmentManager
                        .beginTransaction()
                        .replace(R.id.fragment_holder, mainFragment)
                        .addToBackStack(null).commit()
                }
                R.id.my_cars -> {
                    supportFragmentManager
                        .beginTransaction()
                        .replace(R.id.fragment_holder, carsFragment)
                        .addToBackStack(null).commit()
                }
                R.id.my_list -> {
                    supportFragmentManager
                        .beginTransaction()
                        .replace(R.id.fragment_holder, listFragment)
                        .addToBackStack(null).commit()
                }
            }
            true
        }

    }

    override fun forwardClick(holder: CarsRecyclerAdapter.CarsHolder) {
        supportFragmentManager.beginTransaction().replace(R.id.fragment_holder,
            carInfoFragment).addToBackStack(null).commit()
    }


}

Fragment

class CarInfoFragment : Fragment(R.layout.fragment_cars) {
    private var carInfo_binding: FragmentCarInfoBinding? = null
    private val binding get() = carInfo_binding!!

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        carInfo_binding = FragmentCarInfoBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        binding.carInfoCarNameText.text = arguments?.getString("title")

        val bundle = this.arguments
        if (bundle != null) {

            binding.carInfoCarNameText.text = bundle.getString("данные")
        } else {
            binding.carInfoCarNameText.text = "Неудача"
        }

    }

    companion object {
        @JvmStatic
        fun newInstance() = CarInfoFragment()
            }

}

标签: kotlin

解决方案


推荐阅读