【问题标题】:Kotlin Fragment RecyclerView Adapter ...trying to make ItemClickOnListener to workKotlin Fragment RecyclerView Adapter ...试图使 ItemClickOnListener 工作
【发布时间】:2021-10-17 06:33:05
【问题描述】:

这让我发疯了!发誓我再也不吃香蕉了!! 我正在尝试在 Kotlin/Fragment/RecyclerViewAdapter/OnItemClickListener 上工作,但它不起作用

我正在尝试使 ItemOnClickListener 在 RecyclerView 适配器和 Fragment 之间工作。我已经在代码中指出了问题所在。

片段

class VCTask : Fragment() {
    private val TAG = "VCTask"
    private lateinit var mContext: Context
    private var _binding: FTaskBinding? = null
    private val binding get() = _binding!!

    private val exampleList = generateDummyList(500)
    ***private val adapter = ExampleAdapter(exampleList,this) <-----ERROR "this" in Fragment is rejected obviously 
it refers to Activity..tried to use context etc but it is expecting ContentListener

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

    private fun fragbind(view:View) {
        mContext = this.requireContext()
        binding.recyclerView.adapter = adapter
        binding.recyclerView.layoutManager = LinearLayoutManager(mContext)
        binding.recyclerView.setHasFixedSize(true)

    }

    fun onItemClicked(position: Int) { <------------------------ERROR: I want this to work
        mContext = this.requireContext()
        Toast.makeText(mContext, "Item $position clicked", Toast.LENGTH_SHORT).show()
        val clickedItem = exampleList[position]
        clickedItem.text1 = "Clicked"
        adapter.notifyItemChanged(position)
    }

}

回收器适配器



class ExampleAdapter(private val exampleList: List<ExampleItem>,listener: ContentListener) : <---LISTENER 
ADDED AS VARIABLE..WHAT TO SHOW IN FRAGMENT ??
RecyclerView.Adapter<ExampleAdapter.ExampleViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ExampleViewHolder {
        val itemView = ExampleItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return ExampleViewHolder(itemView)
    }

    override fun onBindViewHolder(holder: ExampleViewHolder, position: Int) {
        val currentItem = exampleList.get(position)
            holder.binding.imageView.setImageResource(currentItem.imageResource)
            holder.binding.textView1.text = currentItem.text1
            holder.binding.textView2.text = currentItem.text2
    }

    override fun getItemCount(): Int = exampleList.size

    inner class ExampleViewHolder(val binding: ExampleItemBinding) : RecyclerView.ViewHolder(binding.root) {
        val imageView: ImageView = binding.imageView
        val textView1: TextView = binding.textView1
        val textView2: TextView = binding.textView2

        fun bind(listOfData: 
         ArrayList<ExampleItem>, listener: ContentListener) {  <-----------IS THIS CORRECT ??  
Because adapterPosition is deprecated

            val item = listOfData[adapterPosition]
            itemView.setOnClickListener {
                listener.onItemClicked(listOfData.get(adapterPosition))
            }
        }
    }

    public interface ContentListener {
        fun onItemClicked(item: ExampleItem)
    }

}

感谢您的意见...我在这方面花费了太多时间...

【问题讨论】:

  • 您需要在onBindViewHolder中调用bind(...)函数并传递ContentListener的值

标签: android-fragments android-recyclerview android-adapter kotlin-android


【解决方案1】:

您需要在片段中声明和实现您的接口,如下所示:

binding.recyclerView.adapter.setOnclickListiner(mOnAdapterClickListener)

然后像这样定义和实现..

private val mOnAdapterClickListener = object : ContentListener {
    override fun onItemClicked(item: ExampleItem) {

    //do your stuff

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    相关资源
    最近更新 更多