打开页面后第二次点击后重复添加数据回收器视图

如何解决打开页面后第二次点击后重复添加数据回收器视图

我想制作动态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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?