Android 与其他片段共享recyclerview项目ID
目前,我有一个recyclerview适配器,它从数据库获取数据并将其显示在仪表板片段中。单击项目后,我希望将项目id传递给details片段,以在detailed视图中获得正确的项目信息。如何将此ID传递给详细片段 仪表板片段Android 与其他片段共享recyclerview项目ID,android,kotlin,android-recyclerview,Android,Kotlin,Android Recyclerview,目前,我有一个recyclerview适配器,它从数据库获取数据并将其显示在仪表板片段中。单击项目后,我希望将项目id传递给details片段,以在detailed视图中获得正确的项目信息。如何将此ID传递给详细片段 仪表板片段 class DashboardFragment : Fragment() { private lateinit var viewModel: DashboardViewModel override fun onCreateView(inflater:
class DashboardFragment : Fragment() {
private lateinit var viewModel: DashboardViewModel
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
// Get a reference to the binding object and inflate the fragment views.
val binding: DashboardFragmentBinding = DataBindingUtil.inflate(
inflater, R.layout.dashboard_fragment, container, false)
val application = requireNotNull(this.activity).application
val dataSource = NumberDatabase.getInstance(application).numberDatabaseDao
val viewModelFactory = DashboardViewModelFactory(dataSource, application)
// Get a reference to the ViewModel associated with this fragment.
val dashboardViewModel =
ViewModelProviders.of(
this, viewModelFactory).get(DashboardViewModel::class.java)
// To use the View Model with data binding, you have to explicitly
// give the binding object a reference to it.
binding.dashboardViewModel = dashboardViewModel
val adapter = CounterAdapter(CounterListener { nightId ->
dashboardViewModel.onCountClicked(nightId)
})
binding.counterList.adapter = adapter
dashboardViewModel.counts.observe(viewLifecycleOwner, Observer {
it?.let {
adapter.submitList(it)
}
})
}
适配器
class CounterAdapter (val clickListener: CounterListener): ListAdapter<Number, CounterAdapter.ViewHolder>(NightDiffCallback()) {
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(getItem(position)!!, clickListener)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder.from(parent)
}
class ViewHolder private constructor(val binding: ListItemCounterBinding) : RecyclerView.ViewHolder(binding.root){
fun bind(item: Number, clickListener: CounterListener) {
binding.night = item
binding.clickListener = clickListener
binding.executePendingBindings()
}
companion object {
fun from(parent: ViewGroup): ViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val binding = ListItemCounterBinding.inflate(layoutInflater, parent, false)
return ViewHolder(binding)
}
}
}
}
class CounterListener(val clickListener: (nightId: Long) -> Unit) {
fun onClick(night: Number) = clickListener(night.nightId)
}
class CounterAdapter(val clickListener:CounterListener):ListAdapter(NightDiffCallback()){
覆盖BindViewHolder(holder:ViewHolder,位置:Int){
holder.bind(getItem(位置)!!,单击Listener)
}
override onCreateViewHolder(父级:ViewGroup,viewType:Int):ViewHolder{
返回ViewHolder.from(父级)
}
类ViewHolder私有构造函数(val绑定:ListItemCounterBinding):RecyclerView.ViewHolder(binding.root){
趣味绑定(项目:编号,clickListener:CounterListener){
binding.night=项目
binding.clickListener=clickListener
binding.executePendingBindings()
}
伴星{
乐趣来自(父:视图组):视图持有者{
val layoutInflater=layoutInflater.from(parent.context)
val binding=ListItemCounterBinding.inflate(LayoutFlater,parent,false)
返回视图保持器(绑定)
}
}
}
}
类计数器侦听器(val clickListener:(nightId:Long)->单位){
fun onClick(night:Number)=clickListener(night.nightId)
}
class RecipeRecyclerAdapter(
mFragmentCommunication: FragmentCommunication
) :
RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private var mFragmentCommunication: FragmentCommunication? = null
init {
this.mFragmentCommunication =mFragmentCommunication
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int):
RecyclerView.ViewHolder {
view = LayoutInflater.from(parent.context)
.inflate(
com.broadcast.recipeslistapp.R.layout.layout_recipe_list_item,
parent,
false
)
return RecipeViewHolder(view)
}
}
override fun getItemCount(): Int {
if (mRecipes.isNullOrEmpty()) {
return 0
} else {
return mRecipes!!.size
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
holder.itemView.setOnClickListener {
mFragmentCommunication!!.PassNightId(nightId = 1) //value of nightId
}
}
interface FragmentCommunication {
fun PassNightId(nightId: Int)
}
要获取数据的片段B:
class TestFragment : Fragment()
{
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val nightId =arguments?.getString("nightId")
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.test_fragment,container,false)
}
}
这就是如何将数据从一个片段发送到另一个片段。使用片段的
setArguments
发送nightId
。在片段中使用dashboardViewModel
并观察nightId您可以共享片段和适配器的更多代码吗?我假设您想传递通过计数器获得的nightId从仪表板片段到其他片段的侦听器。如果是这样,如果其他片段与仪表板片段处于同一活动中,则可以使用接口与这些片段通信。如果共享更多代码,效果会更好。
class TestFragment : Fragment()
{
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val nightId =arguments?.getString("nightId")
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.test_fragment,container,false)
}
}