kotlin - 如何将数据从 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()
}
}
解决方案
推荐阅读
- python - scikit-learn v21 与 v22 的不同结果
- snowflake-cloud-data-platform - 创建和更新雪花表的工具
- jmeter - 如何将我从 HTTP 请求中获得的响应拆分为 2 个单独的数组,并在 JMeter 中的后续 HTTP 请求中使用它们?
- javascript - 在 React.js 上添加元标记
- r - 如何在 R 中读取 .MAP 文件扩展名?
- javascript - 防止特定页面直接访问
- eiffel - estudio 什么时候不检查`require`?
- java - 从另一个类获取按钮调用
- json - 在 scala 中解析 HTTP POST 响应 JSON 正文
- javascript - Vue watch 没有注意到组件属性的变化