如何解决如何在具有数据绑定的片段之间传递参数?
我试图将一个参数从一个片段传递到另一个片段,以使用新片段标签上的参数。 我有一个带日期的 recyclerView,我将 dayID 作为 Navigation 的参数,但我不知道如何将它放在 dataBinding 上以在下一个片段上检索它。 另外,检索它后,我如何将此日期分配给片段标签。
下面是我的片段、适配器和带有 onClick 数据绑定的 xml
class ShopDayFragment : Fragment() {
private lateinit var binding: FragmentShopDayBinding
private lateinit var viewModel: GroceryViewModel
private var cal = Calendar.getInstance()
private lateinit var dateSetListener: DatePickerDialog.OnDateSetListener
override fun onCreateView(
inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
binding = DataBindingUtil.inflate(
inflater,R.layout.fragment_shop_day,container,false
)
return binding.root
}
override fun onCreateOptionsMenu(menu: Menu,inflater: MenuInflater) {
inflater.inflate(R.menu.menu,menu)
super.onCreateOptionsMenu(menu,inflater)
}
@RequiresApi(Build.VERSION_CODES.N)
override fun onViewCreated(view: View,savedInstanceState: Bundle?) {
super.onViewCreated(view,savedInstanceState)
setHasOptionsMenu(true)
val application = requireNotNull(this.activity).application
val database = GroceryDatabase.getInstance(application).groceryDatabaseDao
val repository = GrocRepository(database)
val factory = GroceryViewModelFactory(repository,application)
viewModel = ViewModelProviders.of(this,factory).get(GroceryViewModel::class.java)
val adapter = GroceryDayAdapter(GroceryDayListener { id ->
viewModel.onGroceryDayClicked(id)
})
binding.rvShopDay.adapter = adapter
binding.lifecycleOwner = this
binding.groceryViewModel = viewModel
viewModel.getAllGroceryDays().observe(viewLifecycleOwner,Observer {
adapter.submitList(it)
})
viewModel.navigateToListItem.observe(viewLifecycleOwner,Observer { groceryDay ->
groceryDay?.let {
// val bundle = bundleOf("id" to groceryDay)
//
// this.findNavController().navigate(R.id.action_shopDayFragment_to_listFragment,bundle)
// viewModel.onListItemNavigated()
val action = ShopDayFragmentDirections.actionShopDayFragmentToListFragment(groceryDay)
this.findNavController().navigate(action)
}
})
binding.fab.setOnClickListener {
DatePickerDialog(
requireContext(),dateSetListener,cal.get(Calendar.YEAR),cal.get(Calendar.MONTH),cal.get(Calendar.DAY_OF_MONTH)
).show()
}
dateSetListener = DatePickerDialog.OnDateSetListener { view,year,month,dayOfMonth ->
cal.set(Calendar.YEAR,year)
cal.set(Calendar.MONTH,month)
cal.set(Calendar.DAY_OF_MONTH,dayOfMonth)
val myFormat = "dd/MM/yyyy"
val sdf = SimpleDateFormat(myFormat,Locale.getDefault())
val date = sdf.format(cal.time).toString()
val day = GroceryDay(0,date,10.0)
viewModel.upsert(day)
}
}
}```
class ListFragment : Fragment() {
private lateinit var binding: FragmentListBinding
private lateinit var viewModel: ListItemViewModel
private var adapter = ListItemAdapter()
private lateinit var day: String
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
day = it.getString("groceryDay").toString()
}
}
val tv: TextView = binding.tvTest
tv.text = day
```class GroceryDayAdapter(val clickListener: GroceryDayListener) :
ListAdapter<GroceryDay,GroceryDayAdapter.GroceryViewHolder>(GroceryDayDiffCallBack()) {
class GroceryViewHolder private constructor(val binding: AdapterShopDayBinding) :
RecyclerView.ViewHolder(binding.root) {
val ivDelete: ImageView = binding.ivDelete
fun bind(currDay: GroceryDay,clickListener: GroceryDayListener) {
binding.groceryDay = currDay
binding.clickListener = clickListener
binding.executePendingBindings()
}
companion object {
fun from(parent: ViewGroup): GroceryViewHolder {
val binding = AdapterShopDayBinding.inflate(
LayoutInflater.from(parent.context),parent,false
)
return GroceryViewHolder(binding)
}
}
}
override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): GroceryViewHolder {
return from(parent)
}
override fun onBindViewHolder(holder: GroceryViewHolder,position: Int) {
holder.bind(getItem(position)!!,clickListener)
}
}
class GroceryDayDiffCallBack : DiffUtil.ItemCallback<GroceryDay>() {
override fun areItemsTheSame(oldItem: GroceryDay,newItem: GroceryDay): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsTheSame(oldItem: GroceryDay,newItem: GroceryDay): Boolean {
return oldItem == newItem
}
}
class GroceryDayListener(val clickListener: (id: Int) -> Unit){
fun onClick(groceryDay: GroceryDay) = clickListener(groceryDay.id)
}```
``` <androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{() -> clickListener.onClick(groceryDay)}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">```
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。