Nachrüstanruf in einem Adapter in Android
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
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)
}
}
}
})
}
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.