Почему onLongclicklistener не работает в onBindviewholder с kotlin - PullRequest
0 голосов
/ 28 июня 2019

Я искал решения этой проблемы, но не могу найти ответ.Я могу заставить свой onClickListener работать (Kotlin) изнутри onBindViewHolder моего адаптера, но onLongClickListener (Kotlin) не отвечает, даже если код не показывает ошибку

 override fun onBindViewHolder(holder: MyViewHolder, position: Int) {

    val ingredientdisplay=displayItems[position]
    holder.setData(ingredientdisplay,position)
    runningTotal=runningTotal+holder.itemView.tvcost.text.toString().toDouble()
    println ("running total $runningTotal")

    val intent = Intent("message_from_displayadapter")
    intent.putExtra("runningtotal", runningTotal)
    LocalBroadcastManager.getInstance(context).sendBroadcast(intent)   

    holder.itemView.setOnLongClickListener {view->
        println("longclick")
        true
    }

    holder.itemView.setOnClickListener {
        val intent = Intent(context, ChooseIngredientsActivity::class.java)
        ContextCompat.startActivity(context, intent, null)
    }
}

Я просто пытаюсь println или запустить Toast, но ничего не происходит.

Я не понимаю, почему?Буду признателен за вашу помощь.

Ответы [ 3 ]

0 голосов
/ 29 июня 2019

Я переместил слушателей во внутренний класс, код для полного рекламного объявления ниже.Тем не менее onLongClicListener не отвечает.

класс RecipiesDisplayAdapter (val context: Context, val displayItems: List): RecyclerView.Adapter () {

var runningTotal:Double=0.00

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

}

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

override fun onBindViewHolder(holder: MyViewHolder, position: Int) {

    val ingredientdisplay=displayItems[position]
    holder.setData(ingredientdisplay,position)
    runningTotal=runningTotal+holder.itemView.tvcost.text.toString().toDouble()
    println ("running total $runningTotal")

    val intent = Intent("message_from_displayadapter")
    intent.putExtra("runningtotal", runningTotal)
    LocalBroadcastManager.getInstance(context).sendBroadcast(intent)

}


inner class MyViewHolder(itemView: View):RecyclerView.ViewHolder(itemView){

 private var  currentIngredientDisplay:IngredientDisplay?=null
 private var  currentPosition:Int=0


    init {

        itemView.setOnLongClickListener {
            Log.i ("clicked ", "longclick")
            context.showToast("longClicked")
             true
        }


        itemView.setOnClickListener {

            val intent = Intent(context, ChooseIngredientsActivity::class.java)
            ContextCompat.startActivity(context, intent, null)

        }

    }

   fun setData(ingredientdisplay: IngredientDisplay?, pos:Int){

       val fromrate=getfromdb(ingredientdisplay!!.unitPurchased)
       val torate =getfromdb(ingredientdisplay!!.unitPerRecipe)

       val minunitcost= ingredientdisplay!!.costPurchased/ingredientdisplay!!.quantityPurchased/fromrate
       val costperrecipe=minunitcost*ingredientdisplay!!.quantityPerRecipe*torate
       val s = String.format( "%.2f", costperrecipe);

       val pdu=ingredientdisplay!!.quantityPerRecipe.toString()+" "+ingredientdisplay!!.unitPerRecipe


       ingredientdisplay?.let {

           itemView.tvIngredientName.text = ingredientdisplay!!.ingredientName
           itemView.tvcost.text = s
           itemView.tvqty.text = pdu
       }
       this.currentPosition=pos
       this.currentIngredientDisplay=ingredientdisplay

   }

    fun getfromdb (unit:String) :Double{

        var sendback:String=""

        context.database.use {
            select("Units", "convertionrate")
                .`whereSimple`("unitname = ?", unit)

                .exec {


                    parseList(DoubleParser).forEach{

                        println("result $it")

                        val resu= it.toString()

                        sendback=resu
                    }
                }

        }

        return sendback.toDouble()
    }

}

}

Я не могу понять, почему!

0 голосов
/ 29 июня 2019

Проблема решена.Я сделал ошибку новичка.Я добавил все onclicklistener к моим адаптерам.Потом позже начали добавлять к ним длинные клик-слистеры.Хотите верьте, хотите нет.Я устанавливал это в неправильном адаптере.Приносим извинения за проблемы, но ваши ответы, где полезно.

0 голосов
/ 28 июня 2019

Во-первых, не помещайте ваш onClicklistiner в onBindViewHolder, это не очень хорошая практика, используйте обновление вашего класса адаптера, как этот, также OnLongclicklistiner работает нормально

class NewsAdapter (val context: Context, private val arrayList: ArrayList 
<NewsModel>):
RecyclerView.Adapter <NewsAdapter.Holder> () {

companion object {
   // val TAG: String = OperationAdapter::class.java.simpleName
}

override fun onCreateViewHolder (parent: ViewGroup, viewType: Int): Holder {
    return Holder (LayoutInflater.from (parent.context ).inflate (R.layout.newsitemlist , parent, false))
}

override fun getItemCount (): Int = arrayList. size

override fun onBindViewHolder (holder: Holder, position: Int) {

    val mynews= arrayList[position]
    holder.setData(mynews, position)

}

inner class Holder (itemView: View): RecyclerView.ViewHolder (itemView) {
    private var currentnews: NewsModel? = null
    private var currentPosition: Int = 0


    init {
        //The click listener

        itemView.cardview.setOnClickListener {

            val i = Intent(context,NewsReaderActivity::class.java)
            i.putExtra("body",currentnews!!.body)
            i.putExtra("title",currentnews!!.title)
            context.startActivity(i)

        }

        itemView.cardview.setOnLongClickListener{
            Toast.makeText(context,"Long Clicked",Toast.LENGTH_SHORT).show()
            true
        }


        //the end of the init
    }

    //getting data from model and bind it into View
    fun setData(news: NewsModel?, position: Int) {
        news?.let {
            itemView.newstitle.text = news.title
            itemView.body.text = news.body
            itemView.txtdate.text = news.ndate

        }

        this.currentnews = news
        this.currentPosition = position
          }
       }

  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...