RecyclerView setOnLongClickListener kotlin - PullRequest
0 голосов
/ 17 марта 2019

Прежде всего: Я хотел бы передать данные из моего RecyclerAdapter в мой фрагмент, поэтому я реализовал этот адаптер ниже:

class RecyclerItemCart(private val cart: MutableList<Post>, val context: Context, val listener: (Post) -> Unit) : RecyclerView.Adapter<RecyclerItemCart.ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context)
                .inflate(R.layout.cart_item, parent, false)
        return ViewHolder(view)
    }

    interface OnItemClickListener {
        fun onItemClickListener(post: Post)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(cart[position], listener)
        holder.mView.setOnLongClickListener {
            true }
    }

    override fun getItemCount(): Int {
        return cart.size
    }

    inner class ViewHolder (val mView: View) : RecyclerView.ViewHolder(mView) {
        fun bind(mItem: Post, listener: (Post) -> Unit) = with(itemView)
        {
            val title: TextView = mView.findViewById(R.id.title)
            val authorName: TextView = mView.findViewById<TextView>(R.id.owner)
            val priceIT: TextView = mView.findViewById(R.id.priceIncT)
            val priceExcT: TextView = mView.findViewById(R.id.priceExcT)
            val pic: ImageView = mView.findViewById(R.id.pic)
            title.text = mItem.title
            authorName.text = mItem.authorName
            priceIT.text = mItem.priceIT
            priceExcT.text = mItem.priceExcT
            //        Glide.with(context).load(mItem.url).into(pic)
            setOnLongClickListener { listener(mItem)
                true }
        }
    }
}

затем я устанавливаю onLongClickListener в своем фрагменте (версия 1):

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        val v = inflater.inflate(R.layout.cart_fragment, container, false)
        activity = getActivity() as MainActivity
        recyclerView = v.findViewById(R.id.recylerItemCart)

        totalAmountView = v.findViewById(R.id.total_amount)
        activity.toolbarTitle.text = resources.getString(R.string.cart)
        RequestGetCart.MakeRequestTask(this, activity).execute(activity.user.token)
        v.findViewById<Button>(R.id.checkout).setOnClickListener(this)
        recyclerView.setOnLongClickListener {
            recyclerView.adapter = RecyclerItemCart(cart.elements, activity){
                RequestRemoveItemCart.MakeRequestTask(this, activity).execute(activity.user.token, it.id, "1")
            }
           AlertDialog.Builder(activity)
                .setTitle("REMOVE ITEM")
                .setMessage(context!!.resources.getString(R.string.removeItemCart))
                .setPositiveButton(android.R.string.yes, DialogInterface.OnClickListener { dialog, which ->
                    recyclerView.adapter = RecyclerItemCart(cart.elements, activity){
                        RequestRemoveItemCart.MakeRequestTask(this, activity).execute(activity.user.token, it.id, "1")
                    }
                })
                .setNegativeButton(android.R.string.no, null)
                .setIcon(android.R.drawable.ic_dialog_alert)
                .show()
            true}
        return v
    }

но когда я пытаюсь долго кликать, ничего не происходит. Он никогда не входит в слушателя.

Поэтому я попытался немного изменить:

recyclerView.setOnLongClickListener(View.OnLongClickListener {
            true
             }) {
            recyclerView.adapter = RecyclerItemCart(cart.elements, activity){
                RequestRemoveItemCart.MakeRequestTask(this, activity).execute(activity.user.token, it.id, "1")
            }
           AlertDialog.Builder(activity)
                .setTitle("REMOVE ITEM")
                .setMessage(context!!.resources.getString(R.string.removeItemCart))
                .setPositiveButton(android.R.string.yes, DialogInterface.OnClickListener { dialog, which ->
                    recyclerView.adapter = RecyclerItemCart(cart.elements, activity){
                        RequestRemoveItemCart.MakeRequestTask(this, activity).execute(activity.user.token, it.id, "1")
                    }
                })
                .setNegativeButton(android.R.string.no, null)
                .setIcon(android.R.drawable.ic_dialog_alert)
                .show()
            true}

Но у меня возникает ошибка при использовании

recyclerView.setOnLongClickListener(View.OnLongClickListener {
            true
             })

он говорит, что я не передаю хорошие аргументы, но я передаю View.onLongClickListener в соответствии с запросом. Если у вас есть идеи об этом setOnLongClickListener или другом способе обработки longClick и передачи данных из Recycler во фрагмент. Единственное условие: я хочу сделать что-то из моего фрагмента, а не из моего переработчика.

Так, например, я могу поймать onLongClick из Adapter и вызвать обратный вызов, чтобы вернуться к фрагменту, но я не знаю, как это сделать.

1 Ответ

0 голосов
/ 17 марта 2019

Я думаю, что код адаптера в порядке, кроме избыточного OnItemClickListener. Поскольку вы передаете прослушиватель в конструктор адаптера, ваш метод обратного вызова будет лямбда, где вы инициализируете адаптер.

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    ...
    recyclerView = v.findViewById(R.id.recylerItemCart)
    recyclerView.layoutManager = LinearLayoutManager(context)
    recyclerView.adapter = RecyclerItemCart(cart.elements, activity) {
        //this is the lambda (listener) that you pass to the adapter,
        // and this will be called when long click occurs on itemView as it has already set in ViewHolder
    }
    ...
    return v
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...