recyclerview Android kotlin 滚动问题中的 Edittext 和 textview
Edittext and textview inside recyclerview Android kotlin scrolling issue
这是 kotlin 代码,其中我有一个由 ArrayList
个元素组成的订单车,我在这里尝试做的是默认情况下 [=] 中的数量设置为 1 13=] 并且我有按钮来增加和减少它。因此,每当我尝试使用这些按钮增加或减少值时,必须更改每行中 TextView
的总金额。但是现在一切正常,就像每当我增加或减少值时 TextView
总量连续变化但是当我向下或向上滚动时 TextView
中的值消失并设置回默认值值。
internal class KartListAdapter(private var arrayList: List<Kartdata>,
private val context: Context,
var presenter: MainContract.Presenter,
var recyclerview: RecyclerView,grandtotalTv:TextView) : RecyclerView.Adapter<KartListAdapter.MainHolder>() {
var list=arrayList
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MainHolder {
val v = LayoutInflater.from(parent.context).inflate(R.layout.kart_newrow, parent, false)
return MainHolder(v)
}
override fun onBindViewHolder(holder: MainHolder, position: Int) {
holder.bindItem(arrayList[position])
holder.itemsqty.tag = position
holder.perpriceprice.tag=position
var qtyval:Int = holder.itemsqty.text.toString().toInt()
var perqtyPrice = arrayList[position].qtyPrice
holder.btnIncrease.setOnClickListener() {
qtyval++
holder.itemsqty.text=qtyval.toString()
}
holder.btnDecrease.setOnClickListener() {
qtyval--
holder.itemsqty.text=qtyval.toString()
}
holder.itemsqty.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable) {
// Toast.makeText(context,"after text change"+s.toString(),Toast.LENGTH_LONG).show()
}
override fun beforeTextChanged(s: CharSequence, start: Int,
count: Int, after: Int) {
//Toast.makeText(context,"before text change"+s.toString(),Toast.LENGTH_LONG).show()
}
override fun onTextChanged(s: CharSequence, start: Int,
before: Int, count: Int) {
if(s.toString().trim()!="") {
if (s.toString().toInt()<1) {
val perpiecetotal=qtyval*perqtyPrice
holder.itemsqty.text="1"
holder.perpriceprice.text="OMR:"+perpiecetotal.toString()
} else {
val perpiecetotal=qtyval*perqtyPrice
Log.i("pricing-qtyval",qtyval.toString())
Log.i("pricing-perqtyprice",perqtyPrice.toString())
holder.perpriceprice.text="OMR:"+perpiecetotal.toString()
Log.i("pricing-grandtotalprice",perpiecetotal.toString())
holder.perpriceprice.tag=position
}
//Toast.makeText(context,"on text change"+s.toString(),Toast.LENGTH_LONG).show()
} else {
Toast.makeText(context,"somewhere qty is empty",Toast.LENGTH_LONG).show()
}
}
})
}
override fun getItemViewType(position: Int): Int {
return position
}
override fun getItemCount(): Int {
return arrayList.size
}
internal inner class MainHolder(view: View) : RecyclerView.ViewHolder(view) {
var menuname = itemView.findViewById<TextView>(R.id.cateegory_tv)
var qtyname = itemView.findViewById<TextView>(R.id.qty_name)
var qtyprice = itemView.findViewById<TextView>(R.id.qty_price)
var perpriceprice = itemView.findViewById<TextView>(R.id.price_calculated_tv_item)
var itemsqty = itemView.findViewById<TextView>(R.id.no_of_items_edt)
var deleteicon = itemView.findViewById<ImageView>(R.id.delete_icon)
var btnIncrease = itemView.findViewById<ImageView>(R.id.btn_increase)
var btnDecrease = itemView.findViewById<ImageView>(R.id.btn_decrease)
fun bindItem(kart: Kartdata) {
menuname.setText(kart.MenuName)
qtyname.setText(kart.qtyName)
qtyprice.setText("OMR\t"+kart.qtyPrice)
val perpiecetotal=1*kart.qtyPrice
perpriceprice.text="OMR:"+perpiecetotal.toString()
deleteicon.setOnClickListener() {
val database = KartDatabase.getInstance(context)
val repository = KartRepository(AppExecutors(), database.dapendukDAO())
Toast.makeText(context,"deleted",Toast.LENGTH_SHORT).show()
presenter.deleteitem(repository,kart.id)
presenter.getlistsize(repository)
(context as FragmentActivity).supportFragmentManager.beginTransaction()
.disallowAddToBackStack()
.replace(R.id.container, KartFragment.newInstance(), KartFragment.TAG)
.commit()
}
}
}
}
您需要在 KartListAdapter
中有一个数量数组来保存数量。值正在消失,错误显示是因为视图在 RecyclerView
中被回收。因此,您需要将每一行的状态保存在单独的 ArrayList 中,然后从那里显示数量。
因此,我想建议在您的 KartListAdapter
中有一个单独的 ArrayList
,例如 var quantityList: List<Int>
。
然后在增加或减少一个数量时,取quantityList
中的值。用零初始化此 ArrayList,大小等于传递给适配器的 arrayList
。
现在在您的 bindView
函数中,像这样在数量文本字段中设置文本。
holder.itemsqty.text = quantityList[position];
内部人士 onBindViewHolder
,在更新数量时,只需增加和减少 quantityList
中的值,然后调用 notifyDataSetChanged
进行 [=] 中所需的更改13=]。
holder.btnIncrease.setOnClickListener() {
quantityList[position] = quantityList[position] + 1;
notifyDataSetChanged();
}
holder.btnDecrease.setOnClickListener() {
if(quantityList[position] > 0) {
quantityList[position] = quantityList[position] - 1;
notifyDataSetChanged();
}
}
代码未经测试,可能由于语法错误而无法运行。但是,我认为您想到了将增加或减少的数量存储在单独的列表中,并从那里填充视图到您的 RecyclerView
。
希望对您有所帮助!
这是 kotlin 代码,其中我有一个由 ArrayList
个元素组成的订单车,我在这里尝试做的是默认情况下 [=] 中的数量设置为 1 13=] 并且我有按钮来增加和减少它。因此,每当我尝试使用这些按钮增加或减少值时,必须更改每行中 TextView
的总金额。但是现在一切正常,就像每当我增加或减少值时 TextView
总量连续变化但是当我向下或向上滚动时 TextView
中的值消失并设置回默认值值。
internal class KartListAdapter(private var arrayList: List<Kartdata>,
private val context: Context,
var presenter: MainContract.Presenter,
var recyclerview: RecyclerView,grandtotalTv:TextView) : RecyclerView.Adapter<KartListAdapter.MainHolder>() {
var list=arrayList
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MainHolder {
val v = LayoutInflater.from(parent.context).inflate(R.layout.kart_newrow, parent, false)
return MainHolder(v)
}
override fun onBindViewHolder(holder: MainHolder, position: Int) {
holder.bindItem(arrayList[position])
holder.itemsqty.tag = position
holder.perpriceprice.tag=position
var qtyval:Int = holder.itemsqty.text.toString().toInt()
var perqtyPrice = arrayList[position].qtyPrice
holder.btnIncrease.setOnClickListener() {
qtyval++
holder.itemsqty.text=qtyval.toString()
}
holder.btnDecrease.setOnClickListener() {
qtyval--
holder.itemsqty.text=qtyval.toString()
}
holder.itemsqty.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable) {
// Toast.makeText(context,"after text change"+s.toString(),Toast.LENGTH_LONG).show()
}
override fun beforeTextChanged(s: CharSequence, start: Int,
count: Int, after: Int) {
//Toast.makeText(context,"before text change"+s.toString(),Toast.LENGTH_LONG).show()
}
override fun onTextChanged(s: CharSequence, start: Int,
before: Int, count: Int) {
if(s.toString().trim()!="") {
if (s.toString().toInt()<1) {
val perpiecetotal=qtyval*perqtyPrice
holder.itemsqty.text="1"
holder.perpriceprice.text="OMR:"+perpiecetotal.toString()
} else {
val perpiecetotal=qtyval*perqtyPrice
Log.i("pricing-qtyval",qtyval.toString())
Log.i("pricing-perqtyprice",perqtyPrice.toString())
holder.perpriceprice.text="OMR:"+perpiecetotal.toString()
Log.i("pricing-grandtotalprice",perpiecetotal.toString())
holder.perpriceprice.tag=position
}
//Toast.makeText(context,"on text change"+s.toString(),Toast.LENGTH_LONG).show()
} else {
Toast.makeText(context,"somewhere qty is empty",Toast.LENGTH_LONG).show()
}
}
})
}
override fun getItemViewType(position: Int): Int {
return position
}
override fun getItemCount(): Int {
return arrayList.size
}
internal inner class MainHolder(view: View) : RecyclerView.ViewHolder(view) {
var menuname = itemView.findViewById<TextView>(R.id.cateegory_tv)
var qtyname = itemView.findViewById<TextView>(R.id.qty_name)
var qtyprice = itemView.findViewById<TextView>(R.id.qty_price)
var perpriceprice = itemView.findViewById<TextView>(R.id.price_calculated_tv_item)
var itemsqty = itemView.findViewById<TextView>(R.id.no_of_items_edt)
var deleteicon = itemView.findViewById<ImageView>(R.id.delete_icon)
var btnIncrease = itemView.findViewById<ImageView>(R.id.btn_increase)
var btnDecrease = itemView.findViewById<ImageView>(R.id.btn_decrease)
fun bindItem(kart: Kartdata) {
menuname.setText(kart.MenuName)
qtyname.setText(kart.qtyName)
qtyprice.setText("OMR\t"+kart.qtyPrice)
val perpiecetotal=1*kart.qtyPrice
perpriceprice.text="OMR:"+perpiecetotal.toString()
deleteicon.setOnClickListener() {
val database = KartDatabase.getInstance(context)
val repository = KartRepository(AppExecutors(), database.dapendukDAO())
Toast.makeText(context,"deleted",Toast.LENGTH_SHORT).show()
presenter.deleteitem(repository,kart.id)
presenter.getlistsize(repository)
(context as FragmentActivity).supportFragmentManager.beginTransaction()
.disallowAddToBackStack()
.replace(R.id.container, KartFragment.newInstance(), KartFragment.TAG)
.commit()
}
}
}
}
您需要在 KartListAdapter
中有一个数量数组来保存数量。值正在消失,错误显示是因为视图在 RecyclerView
中被回收。因此,您需要将每一行的状态保存在单独的 ArrayList 中,然后从那里显示数量。
因此,我想建议在您的 KartListAdapter
中有一个单独的 ArrayList
,例如 var quantityList: List<Int>
。
然后在增加或减少一个数量时,取quantityList
中的值。用零初始化此 ArrayList,大小等于传递给适配器的 arrayList
。
现在在您的 bindView
函数中,像这样在数量文本字段中设置文本。
holder.itemsqty.text = quantityList[position];
内部人士 onBindViewHolder
,在更新数量时,只需增加和减少 quantityList
中的值,然后调用 notifyDataSetChanged
进行 [=] 中所需的更改13=]。
holder.btnIncrease.setOnClickListener() {
quantityList[position] = quantityList[position] + 1;
notifyDataSetChanged();
}
holder.btnDecrease.setOnClickListener() {
if(quantityList[position] > 0) {
quantityList[position] = quantityList[position] - 1;
notifyDataSetChanged();
}
}
代码未经测试,可能由于语法错误而无法运行。但是,我认为您想到了将增加或减少的数量存储在单独的列表中,并从那里填充视图到您的 RecyclerView
。
希望对您有所帮助!