【问题标题】:Custom listener for RecyclerView is not detecting clicksRecyclerView 的自定义侦听器未检测到点击
【发布时间】:2018-07-11 03:07:49
【问题描述】:

This 是我正在关注的教程,在“使用监听器附加点击处理程序”下

我正在尝试实现一个自定义侦听器以传递给适配器。这是为了确保适配器在单击 RecyclerView 项目时运行MainActivity 中的代码。 它在adapter.setOnItemClickListener内部完成

当我单击回收站视图中的一项时,showAlertDialog() 不会运行。 是因为我将我的回收站视图放在了一个 swiperefreshlayout 中吗?

class MainActivity : AppCompatActivity(), MainContract.View {

    private lateinit var presenter: MainContract.Presenter
    private lateinit var adapter: MainAdapter

    override fun onCreate(savedInstanceState: Bundle?) {

        ...

        swipe_container.setOnRefreshListener { presenter.refreshPlaceList() }

        recyclerViewPlaces.layoutManager = LinearLayoutManager(this)
    }

    override fun showFavouritePlaces(favouritePlaces: List<Place>) {
        adapter = MainAdapter(favouritePlaces.toMutableList(), this)

        // Anonymous object passed here as listener
        adapter.setOnItemClickListener(object: MainAdapter.OnItemClickListener{
            override fun onItemClick(itemView: View) {
                showAlertDialog()
            }
        })

        recyclerViewPlaces.adapter = adapter
    }

    override fun showFavouritePlace(favouritePlace: Place) {
        if (this::adapter.isInitialized) {
            adapter.addFavouritePlace(favouritePlace)
        } else {
            adapter = MainAdapter(mutableListOf(favouritePlace), this)
            recyclerViewPlaces.adapter = adapter
        }
    }

    override fun showAlertDialog() {
        val builder = AlertDialog.Builder(this)

        builder.setTitle("Delete")

        builder.setMessage("Would you like to delete this place?")

        builder.setPositiveButton("YES") { dialog, which ->
            Toast.makeText(applicationContext, "Yes selected", Toast.LENGTH_SHORT).show()
        }

        builder.setNegativeButton("No") { dialog, which ->
            Toast.makeText(applicationContext, "Nope", Toast.LENGTH_SHORT).show()
        }

        val dialog: AlertDialog = builder.create()

        dialog.show()
    }
}


class MainAdapter(private val favouritePlaces: MutableList<Place>, private val context: Context)
    : RecyclerView.Adapter<MainAdapter.CustomViewHolder>() {

    private lateinit var listener: OnItemClickListener

    interface OnItemClickListener {
        fun onItemClick(itemView: View)
    }

    fun setOnItemClickListener(listener: OnItemClickListener) {
        this.listener = listener
    }

    class CustomViewHolder(val view: View, private val listener: OnItemClickListener)
                                : RecyclerView.ViewHolder(view), View.OnClickListener {

        override fun onClick(v: View?) {
            if (listener != null) {
                listener.onItemClick(v!!)
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MainAdapter.CustomViewHolder {
        val placeView = LayoutInflater.from(parent.context)
                .inflate(R.layout.place_list_item, parent, false)

        return MainAdapter.CustomViewHolder(placeView, listener)
    }

    override fun onBindViewHolder(holder: MainAdapter.CustomViewHolder, position: Int) {

        holder.view.isLongClickable = true

        // Setting XML properties
    }
}

【问题讨论】:

    标签: android android-recyclerview kotlin adapter onclicklistener


    【解决方案1】:

    在您的 onBindViewHolder 方法中添加以下代码。

    override fun onBindViewHolder(holder: MainAdapter.CustomViewHolder, position: Int) {
    
        holder.view.isLongClickable = true
    
        //set the listener like below 
        holder.view.setOnClickListener(holder);
    }
    

    这应该可以工作。但是你让整个监听器有点复杂。可以用简单的方式实现。

    【讨论】:

      猜你喜欢
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多