如何解决打开页面后第二次点击后重复添加数据回收器视图
我想制作动态recyclerview,所以当我点击“添加”按钮时,数据会增加一个数据。但是当我第二次点击时,预览数据将再次显示,之后数据将显示两次。像这样error data
但是当我最小化或返回,然后再次查看时,列表数据显示正常 对于 nomor 日志,我使用的是带有一些 cetegory 和 MVVM 模式的生成数字
这是我的代码
---活动---
class ProductListActivity : AppCompatActivity(),Coroutinescope {
companion object {
const val paramTreeId = "param_tree_id"
const val paramTreeNumber = "param_tree_number"
const val paramOrderId = "param_order_id"
const val paramOrderNum = "param_order_num"
const val paramSpeciesId = "param_species_id"
}
private lateinit var addNewLog: ImageView
private lateinit var job: Job
override val coroutineContext: CoroutineContext
get() = dispatchers.Main + job
@Inject
lateinit var viewmodelFactory: viewmodelProvider.Factory
private val vm: ProductListviewmodel by lazy {
viewmodelProviders.of(this,viewmodelFactory).get(ProductListviewmodel::class.java)
}
private var treeId = -1
private var treeNumber = ""
private var orderId = -1
private var orderNum = ""
private var speciesId = 1
private var logNumber: String? = null
private val products = mutablelistof<WoodProduct>()
private val productAdapter = object : RecyclerView.Adapter<ProductItemViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup,itemType: Int): ProductItemViewHolder {
val ui = EditViewProductUi()
val itemView = ui.createView(AnkoContext.create(parent.context,parent))
return ProductItemViewHolder(ui,itemView)
}
override fun getItemCount(): Int = products.size
override fun onBindViewHolder(holder: ProductItemViewHolder,position: Int) {
val product = products[position]
return holder.bind(product) { product ->
alert {
title = "Hapus Data Kayu"
message = "Hapus data kayu dari daftar?"
okButton {
launch {
it.dismiss()
products.removeAt(position)
vm.deleteProduct(product.copy(deleted = 1))
Log.d("data","delete= $product")
}
}
cancelButton {
it.dismiss()
}
}.show()
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
job = Job()
AndroidInjection.inject(this)
treeId = intent.getIntExtra(paramTreeId,-1)
orderId = intent.getIntExtra(paramOrderId,-1)
treeNumber = intent.getStringExtra(paramTreeNumber)
orderNum = intent.getStringExtra(paramOrderNum)
speciesId = intent.getIntExtra(paramSpeciesId,1)
coordinatorLayout {
relativeLayout {
verticalLayout {
relativeLayout {
backgroundColor = Color.WHITE
toolbar {
id = R.id.toolbar
backgroundColor =
ContextCompat.getColor(context,R.color.colorPrimaryDark)
setTitleTextColor(Color.WHITE)
menu.apply {
add("0").setActionView(linearLayout {
addNewLog = imageView(R.drawable.ic_plus) {
scaleType = ImageView.ScaleType.FIT_XY
}.lparams(dip(38),dip(38)) {
rightMargin = dip(10)
}
addNewLog.setonClickListener {
vm.productData.observe(
this@ProductListActivity,Observer(::onProductUpdate)
)
launch {
vm.loadProduct(orderId,orderNum,treeId,logNumber)
}
}
}).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS)
}
}.lparams {
alignParentTop()
width = matchParent
height = wrapContent
}
linearLayout {
id = R.id.header_log
textView("") {
typeface = regularFace
textSize = regularText
textColor = Color.BLACK
}.lparams(dip(15),dip(40)) {
verticalGravity = Gravity.CENTER
horizontalGravity = Gravity.CENTER
}
textView("") {
}.lparams(dip(30),dip(20)) {
verticalGravity = Gravity.CENTER
}
textView("Nomor Log") {
isEnabled = false
padding = dip(4)
typeface = regularFace
textSize = regularText
textColor = Color.BLACK
gravity = Gravity.CENTER
textAlignment = View.TEXT_ALIGNMENT_CENTER
}.lparams(matchParent,dip(50)) {
weight = 2f
}
textView("Diameter\n(cm)") {
padding = dip(4)
textSize = regularText
typeface = regularFace
textColor = Color.BLACK
textAlignment = View.TEXT_ALIGNMENT_CENTER
}.lparams(matchParent,dip(50)) {
weight = 3f
}
textView("Panjang\n(cm)") {
padding = dip(4)
textSize = regularText
typeface = regularFace
textColor = Color.BLACK
textAlignment = View.TEXT_ALIGNMENT_CENTER
}.lparams(matchParent,dip(50)) {
weight = 3f
}
}.lparams(matchParent,wrapContent) {
below(R.id.toolbar)
rightMargin = dip(5)
leftMargin = dip(5)
}
linearLayout {
id = R.id.line_log
backgroundColor = Color.BLACK
}.lparams(matchParent,dip(1)) {
topMargin = dip(5)
bottomMargin = dip(5)
below(R.id.header_log)
}
verticalLayout {
recyclerView {
adapter = productAdapter
layoutManager = linearlayoutmanager(context)
}.lparams(matchParent,matchParent)
}.lparams(matchParent,matchParent) {
below(R.id.line_log)
}
}.lparams(matchParent,dip(0)) {
weight = 1f
}
linearLayout {
backgroundColor = Color.WHITE
val saveButton = button {
text = "Ok"
textColor = Color.WHITE
allCaps = false
background =
ResourcesCompat.getDrawable(resources,R.drawable.save_button,null)
}.lparams(wrapContent,wrapContent) {
padding = dip(10)
}
val cancelButton = button {
text = "Batal"
allCaps = false
textColor = BUTTON_YELLOW
background = ResourcesCompat.getDrawable(
resources,R.drawable.cancel_button,null
)
}.lparams(wrapContent,wrapContent) {
padding = dip(10)
leftMargin = dip(10)
}
}.lparams(matchParent,dip(80)) {
gravity = Gravity.RIGHT
rightMargin = dip(10)
}
}.lparams(matchParent,matchParent)
}.lparams(matchParent,matchParent)
}
val toolbar = findViewById<Toolbar>(R.id.toolbar)
toolbar.title = "No. Pohon: $treeNumber"
toolbar.setNavigationIcon(R.drawable.ic_arrow_back_black_24dp)
toolbar.setNavigationOnClickListener {
onBackpressed()
}
vm.productsData.observe(this,Observer(::updateProducts))
}
private fun onProductUpdate(product: WoodProduct?) {
product ?: return
products.add(product)
launch {
vm.saveProduct(
logNumber == null,product.diameter,product.length,product.rejectStatusPetani,product.isTaken
)
}
Log.d("size","product = ${products.size - 1}")
productAdapter.notifyItemInserted(products.size - 1)
productAdapter.notifyDataSetChanged()
}
private fun updateProducts(newProducts: List<WoodProduct>?) {
newProducts ?: return
products.clear()
products.addAll(newProducts)
productAdapter.notifyDataSetChanged()
}
override fun onResume() {
super.onResume()
launch {
vm.loadProducts(treeId)
}
}}
class ProductItemViewHolder(private val ui: EditViewProductUi,itemView: View) :
RecyclerView.ViewHolder(itemView) {
@SuppressLint("SetTextI18n")
fun bind(product: WoodProduct,onDelete: (WoodProduct) -> Unit) {
ui.numberPosition.text =
String.format(itemView.context.getString(R.string.no),adapterPosition + 1)
ui.logNumberView.setText(product.logNumber)
ui.diameterView.setText(product.diameter)
ui.longView.setText(product.length)
ui.rejectStatusView.setSelection(product.rejectStatusPetani)
ui.isTakenView.setSelection(product.isTaken)
ui.deleteButton.setonClickListener {
onDelete(product)
}
}}
----viewmodel----
class ProductListviewmodel @Inject constructor(val productInteractor: WoodProductInteractor) : viewmodel() {
val productsData = mutablelivedata<List<WoodProduct>>()
val productData = mutablelivedata<WoodProduct>()
private val numberFormat = DecimalFormat("###.##")
suspend fun loadProducts(treeId: Int) {
val products = GlobalScope.async(dispatchers.IO) { productInteractor.getWoodProducts(treeId) }.await()
GlobalScope.launch(dispatchers.Main) { productsData.value = products }
Log.d("Data","Log Product = $productsData")
}
suspend fun deleteProduct(product: WoodProduct) {
GlobalScope.async(dispatchers.IO) { productInteractor.deleteWoodProduct(product) }.await()
loadProducts(product.treeId)
}
suspend fun loadProduct(orderId: Int,orderNum: String,treeId: Int,logNumber: String?) {
val product = if (logNumber != null) GlobalScope.async(dispatchers.IO) {
productInteractor.getWoodProduct(treeId,logNumber)
}.await() else {
val logSequenceNumber = GlobalScope.async(dispatchers.IO) {
productInteractor.getAllWoodProducts(orderId)
}.await().size + 1
val newLogNumber = GlobalScope.async(dispatchers.IO) {
productInteractor.createLogNumber(
treeId,logSequenceNumber
)
}.await()
WoodProduct(
null,orderId,logSequenceNumber,newLogNumber,"",1,2
)
}
GlobalScope.launch(dispatchers.Main) {
productData.value = product
Log.d("data","product=$product")
}
}
suspend fun saveProduct(
isNew : Boolean,newDiameter: String,newLength: String,newReject: Int,newAmbil: Int
) {
val newCircumference = if (newDiameter.isEmpty()) "0" else numberFormat.format(newDiameter.todouble() * 3.14)
val newProduct = productData.value?.copy(
diameter = newDiameter,length = newLength,circumference = newCircumference,rejectStatusPetani = newReject,isTaken = newAmbil
)
runBlocking(dispatchers.IO){
if (newProduct!=null){
if (isNew) {
productInteractor.saveWoodProduct(newProduct) } else {
productInteractor.updatedWoodProduct(newProduct)
}
}
}
}}
代码有问题吗?请大家帮帮我。 谢谢你
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。