代码之家  ›  专栏  ›  技术社区  ›  Zolly

RecyclerView的自定义侦听器未检测到单击

  •  0
  • Zolly  · 技术社区  · 8 年前

    This 是我下面的教程吗?在“使用侦听器附加单击处理程序”下。

    我正在尝试实现一个自定义侦听器来传递到适配器。这是为了确保适配器在 MainActivity 单击RecyclerView项时。 是在里面做的 adapter.setOnItemClickListener

    当我单击我的RecyclerView中的一个项目时, showAlertDialog() 不运行。 是因为我把我的RecyclerView放在了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
        }
    }
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   rafa    8 年前

    在onbindViewholder方法中添加以下代码。

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

    这应该是可行的。但是你有点复杂整个侦听器的事情。可以用简单的方式实现。