Nachrüstanruf in einem Adapter in Android

Oct 23 2020

Ich führe einen Nachrüstungsaufruf in einem Adapter durch. Ich habe ihn erfolgreich implementiert und er gibt mir auch die gewünschte Ausgabe, aber ist es eine gute Praxis, dies unter Adapter durchzuführen?

Meine App ist -> Produktverkaufs-App -> in meinem Warenkorb -> ich zeige die Produktliste an, die der Benutzer kaufen möchte -> dafür ist ein Adapter erforderlich -> dort führe ich einen Wisch zum Löschen durch -> Nachrüstaufruf über die holder.delete.setonclicklistener {...}Schaltfläche delete ( ) ausführen

Mein Code ist ->

        holder.tvDelete.setOnClickListener(View.OnClickListener { view ->
        progressDialog.show()

        val token: String = SharedPrefManager.getInstance(context).user.access_token.toString()
        RetrofitClient.instance.deletecart(token, id.toString())
            .enqueue(object : Callback<DeleteResponse> {
                override fun onFailure(call: Call<DeleteResponse>, t: Throwable) {

                    Log.d("res", "" + t)


                }

                override fun onResponse(
                    call: Call<DeleteResponse>,
                    response: Response<DeleteResponse>
                ) {
                    var res = response
                    progressDialog.dismiss()
                    (context as Activity).finish()

                    if (res.body()?.status == 200) {
                        Toast.makeText(
                            context,
                            res.body()?.message,
                            Toast.LENGTH_LONG
                        ).show()
                        progress()

                        mItemManger.removeShownLayouts(holder.swipelayout)
                        notifyItemChanged(position)
                        notifyItemRemoved(position)
                        dataList?.removeAt(position)
                        notifyItemRangeChanged(position, dataList?.size!!)
                        mItemManger.closeAllItems()


                    } else {
                        try {
                            val jObjError =
                                JSONObject(response.errorBody()!!.string())
                            Toast.makeText(
                                context,
                                jObjError.getString("message") + jObjError.getString("user_msg"),
                                Toast.LENGTH_LONG
                            ).show()
                        } catch (e: Exception) {
                            Toast.makeText(context, e.message, Toast.LENGTH_LONG).show()
                            Log.e("errorrr", e.message)
                        }
                    }
                }
            })

        mItemManger.bindView(holder.itemView, position)

    })

Der obige Code funktioniert

Ich habe auch diese -> Daten von On-Click-Funktion meines Recycler-Adapters übergeben

Diesen Link habe ich ausgeführt, aber in Aktivität bekomme ich in Aktivität keinen Zugriff auf diesen Code

    mItemManger.removeShownLayouts(holder.swipelayout)
                        notifyItemChanged(position)
                        notifyItemRemoved(position)
                        dataList?.removeAt(position)
                        notifyItemRangeChanged(position, dataList?.size!!)
                        mItemManger.closeAllItems()

bedürfen der Klärung

brauche Hilfe danke

Bearbeiten: - Ich folgte dem obigen Link hier ist mein Code

Schnittstelle

interface OnItemClick {
fun onItemClicked(position: Int)

 }

Aktivität

class AddToCart:BaseClassActivity(), OnItemClick{
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.add_to_cart)
    getWindow().setExitTransition(null)
    getWindow().setEnterTransition(null)
    var mActionBarToolbar = findViewById<androidx.appcompat.widget.Toolbar>(R.id.toolbartable);
    setSupportActionBar(mActionBarToolbar);
    // add back arrow to toolbar
  setEnabledTitle()

    mActionBarToolbar.setNavigationOnClickListener(View.OnClickListener {
        onBackPressed()
    })
    placeorder.setOnClickListener {
        val intent:Intent=Intent(applicationContext, AddressActivity::class.java)
        startActivity(intent)
    }
   loadCart()
  }

   fun loadCart(){

  val model = ViewModelProvider(this)[CartViewModel::class.java]

  model.CartList?.observe(this, object : Observer<CartResponse> {
      override fun onChanged(t: CartResponse?) {

          generateDataList(t?.data?.toMutableList())
          totalamount.setText(t?.total.toString())
      }
  })
  }

fun generateDataList(dataList: MutableList<DataCart?>?) {
    val recyclerView=findViewById<RecyclerView>(R.id.addtocartrecyleview) as? RecyclerView
    val linear:LinearLayoutManager=
        LinearLayoutManager(applicationContext, LinearLayoutManager.VERTICAL, false)
    recyclerView?.layoutManager=linear
    val adapter = CartAdapter(this@AddToCart, dataList)
    recyclerView?.adapter=adapter
    recyclerView?.addItemDecoration(DividerItemDecorator(resources.getDrawable(R.drawable.divider)))


    adapter.notifyDataSetChanged()
     adapter.setItemClick(this)
    if (dataList?.isEmpty() ?: true) {
        recyclerView?.setVisibility(View.GONE)
        totalamount.setVisibility(View.GONE)
        fl_footer.setVisibility(View.GONE)
        placeorder.setVisibility(View.GONE)
        emptytext.setVisibility(View.VISIBLE)
    } else {
        recyclerView?.setVisibility(View.VISIBLE)
        totalamount.setVisibility(View.VISIBLE)
        fl_footer.setVisibility(View.VISIBLE)
        placeorder.setVisibility(View.VISIBLE)
        emptytext.setVisibility(View.GONE)


    }
  recyclerView?.addOnScrollListener(object :
      RecyclerView.OnScrollListener() {
      override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
          super.onScrollStateChanged(recyclerView, newState)
          Log.e("RecyclerView", "onScrollStateChanged")
      }

      override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
          super.onScrolled(recyclerView, dx, dy)
      }
  })
}
override fun onBackPressed() {
    super.onBackPressed()
    val intent = Intent(this, HomeActivity::class.java)
      startActivity(intent)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return when (item.itemId) {
        android.R.id.home -> {
            NavUtils.navigateUpFromSameTask(this)

            true
        }
        else -> super.onOptionsItemSelected(item)
    }
}

override fun onResume() {
    super.onResume()
   loadCart()
}


override fun onItemClicked(position: Int) {

    val token: String = SharedPrefManager.getInstance(applicationContext).user.access_token.toString()
    RetrofitClient.instance.deletecart(token, id.toString())
        .enqueue(object : Callback<DeleteResponse> {
            override fun onFailure(call: Call<DeleteResponse>, t: Throwable) {

                Log.d("res", "" + t)


            }

            override fun onResponse(
                call: Call<DeleteResponse>,
                response: Response<DeleteResponse>
            ) {
                var res = response
                (applicationContext as Activity).finish()

                if (res.body()?.status == 200) {
                    Toast.makeText(
                        applicationContext,
                        res.body()?.message,
                        Toast.LENGTH_LONG
                    ).show()
                    val intent =
                        Intent(applicationContext, AddToCart::class.java)
                    intent.flags =
                        Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_MULTIPLE_TASK
                    applicationContext.startActivity(intent)
                    (applicationContext as Activity?)!!.overridePendingTransition(0, 0)


                } else {
                    try {
                        val jObjError =
                            JSONObject(response.errorBody()!!.string())
                        Toast.makeText(
                            applicationContext,
                            jObjError.getString("message") + jObjError.getString("user_msg"),
                            Toast.LENGTH_LONG
                        ).show()
                    } catch (e: Exception) {
                        Toast.makeText(applicationContext, e.message, Toast.LENGTH_LONG).show()
                        Log.e("errorrr", e.message)
                    }
                }
            }
        })

}
   }

Adapter:--

class CartAdapter(private val context: Context, private val dataList: MutableList<DataCart?>?) :
RecyclerSwipeAdapter<CartAdapter.CustomViewHolder>() , AdapterView.OnItemSelectedListener{ //added RecyclerSwipeAdapter and override
private var itemClick: OnItemClick? = null

inner class CustomViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
    View.OnClickListener {
    val mView: View
  val swipelayout:SwipeLayout
    val productiamge: ImageView
    val productname: TextView
    val productcategory: TextView
    val productprice: TextView
    val tvDelete:TextView
    val spin:Spinner
    init {
        mView = itemView
    productiamge= mView.findViewById(R.id.imagecart)
       productname= mView.findViewById(R.id.imagenamecart)
        productcategory= mView.findViewById(R.id.imagecategory)

     productprice =mView.findViewById(R.id.price)
        swipelayout=mView.findViewById(R.id.swipe)
        tvDelete=mView.findViewById(R.id.tvDelete)
         spin = mView.findViewById(R.id.spinner) as Spinner
        tvDelete.setClickable(true);
        tvDelete.setOnClickListener(this);

    }

    override fun onClick(v: View?) {
        if (itemClick != null) {
            itemClick!!.onItemClicked(getPosition());
        }
    }


}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomViewHolder {
    val layoutInflater = LayoutInflater.from(parent.context)
    val view: View = layoutInflater.inflate(R.layout.addtocart_item, parent, false)

    return CustomViewHolder(view)
}

override fun getSwipeLayoutResourceId(position: Int): Int {
    return R.id.swipe;

}

override fun onBindViewHolder(holder: CustomViewHolder, position: Int) {
  val  progressDialog :ProgressDialog= ProgressDialog(context);
    holder.productname.text = dataList?.get(position)?.product?.name ?: null
    holder.productcategory.text = "(" +dataList?.get(position)?.product?.product_category +")"

    holder.productprice.text = dataList?.get(position)?.product?.cost.toString()

    Glide.with(context).load(dataList?.get(position)?.product?.product_images)
        .into(holder.productiamge)

    holder.swipelayout.setShowMode(SwipeLayout.ShowMode.PullOut)
    Log.e("checkidd", dataList?.get(position)?.product?.id.toString())
    // Drag From Right

    // Drag From Right
    holder.swipelayout.addDrag(
        SwipeLayout.DragEdge.Right,
        holder.swipelayout.findViewById(R.id.bottom_wrapper)
    )
     val id =dataList?.get(position)?.product?.id

    holder.tvDelete.setOnClickListener(View.OnClickListener { view ->
        mItemManger.removeShownLayouts(holder.swipelayout)
        notifyItemChanged(position)
        notifyItemRemoved(position)
        dataList?.removeAt(position)
        notifyItemRangeChanged(position, dataList?.size!!)
        mItemManger.closeAllItems()
    })
    mItemManger.bindView(holder.itemView, position)


}
    override fun getItemCount() = dataList?.size ?: 0

override fun onNothingSelected(p0: AdapterView<*>?) {
    TODO("Not yet implemented")
}

override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {

}
fun getItemClick(): OnItemClick? {
    return itemClick
}

fun setItemClick(itemClick: OnItemClick?) {
    this.itemClick = itemClick
}

}}

Aber ich bekomme keine gewünschte Ausgabe, hilf mir

Antworten

1 apj123 Oct 26 2020 at 13:58

Mit Hilfe des Benutzers EpicPandaForce habe ich eine Antwort auf die Problemfrage erhalten

Schnittstelle::----

interface OnItemClick {
fun DeleteItem(position: Int, id:Int)
}

Adapter::----

    private var itemClick: OnItemClick? = null
     .
    .
     .
      holder.tvDelete.setOnClickListener(View.OnClickListener { view ->
        mItemManger.removeShownLayouts(holder.swipelayout)
        notifyItemChanged(position)
        notifyItemRemoved(position)
        dataList?.removeAt(position)
        itemClick?.DeleteItem(position,id!!.toInt())

        notifyItemRangeChanged(position, dataList?.size!!)
        mItemManger.closeAllItems()
    })
    mItemManger.bindView(holder.itemView, position)


    }
    .
    .
     .
     
fun setItemClick(itemClick: OnItemClick?) {
    this.itemClick = itemClick
}

Aktivität::----

class AddToCart:BaseClassActivity(), OnItemClick{
 .
 .
  .
   onCreate(){
            adapter.setItemClick(this);
       .
       .
       .
       }
         override fun DeleteItem(position: Int, id:Int) {
    progressDialog?.show()
        viewModel.product_id.value =id.toString()
    viewModel.loaddelete()
    viewModel.Results.observe(this) { result ->
        when (result) {
            CartViewModel.Result.Missing -> {
                Toast.makeText(
                    applicationContext, "product is missing", Toast.LENGTH_LONG
                ).show()

            }


            CartViewModel.Result.Success -> {
                finish()
                val intent =
                    Intent(applicationContext, AddToCart::class.java)
                intent.flags =
                    Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_MULTIPLE_TASK
                startActivity(intent)
                overridePendingTransition(0, 0)                }
            else ->
            {
                Toast.makeText(applicationContext,"hello",Toast.LENGTH_LONG).show()
            }
        }
    }



}

Ansichtsmodell :: --------

fun loaddelete(){
    val id = product_id.value!!.toString().trim()

    val token: String = SharedPrefManager.getInstance(getApplication()).user.access_token.toString()
    RetrofitClient.instance.deletecart(token, id)
        .enqueue(object : Callback<DeleteResponse> {
            override fun onFailure(call: Call<DeleteResponse>, t: Throwable) {
                loginResultEmitter.emit(CartViewModel.Result.NetworkFailure)

                Log.d("res", "" + t)


            }

            override fun onResponse(
                call: Call<DeleteResponse>,
                response: Response<DeleteResponse>
            ) {
                var res = response


                if (res.body()?.status == 200) {
                    Toast.makeText(
                        getApplication(),
                        res.body()?.message,
                        Toast.LENGTH_LONG


                    ).show()


                    loginResultEmitter.emit(CartViewModel.Result.Success)



                } else {
                    try {
                        val jObjError =
                            JSONObject(response.errorBody()!!.string())
                        Toast.makeText(
                            getApplication(),
                            jObjError.getString("message") + jObjError.getString("user_msg"),
                            Toast.LENGTH_LONG
                        ).show()
                    } catch (e: Exception) {
                        Toast.makeText(getApplication(), e.message, Toast.LENGTH_LONG).show()
                        Log.e("errorrr", e.message)
                    }
                }
            }
        })




}
PriyankaRajput Oct 23 2020 at 07:00

Dies ist keine gute Vorgehensweise, um API-Aufrufe im Adapter durchzuführen. Sie können Rückrufe vom Adapter zur Aktivität erstellen und sollten diesen API-Code in der Aktivität selbst aufrufen. Wenn Sie einige Referenzen vom Adapter benötigen, können Sie Methoden im Adapter erstellen und diese Methoden in der Aktivität aufrufen, indem Sie das Adapterobjekt erstellen.