Android 与其他片段共享recyclerview项目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:

目前,我有一个recyclerview适配器,它从数据库获取数据并将其显示在仪表板片段中。单击项目后,我希望将项目id传递给details片段,以在detailed视图中获得正确的项目信息。如何将此ID传递给详细片段

仪表板片段

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)
    }
     }