微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在适配器中观察livedata的问题-Android

如何解决在适配器中观察livedata的问题-Android

我会给您一些有关我的应用程序的提示,也许可以帮助解决我的问题。

我有一个经过改造的Api,我将获得此数据。之后,将所有数据插入roomdatabase中。

在带有recyclerview的主屏幕上,我将显示所有此产品(数据)。

在此产品的每个附近,我都有一个按钮用于将产品发送到购物车片段。还具有一个值(textview),用于保存每个按钮的按下状态,以显示有多少物品进入购物车片段。

我使用upsert(transaction)插入产品或将产品更新为购物车片段。

之后,使用obvserver livedata来显示发送到购物车的产品的金额值。

首先,我需要一种在主屏幕而不是适配器/中实现观察实时数据的方法,而且我的upsert查询是否正确?有时,当点击产品按钮时,其他产品的价值也会发生变化。

这是我的代码

道:

    // this is for Maintable

    @Query("SELECT * FROM main")
    fun getalldata(): LiveData<List<Roomtable>>

// cart Table

    @Query("SELECT * FROM Cart")
    fun getAllFromCart(): LiveData<List<CartTable>>


    @Query("SELECT * FROM Cart WHERE id  = :int")
    fun GetAllFromCart(int: Int): LiveData<List<CartTable>>


    @Insert(onConflict = OnConflictStrategy.IGnorE)
    fun insertToCart(model: CartTable): Long


    @Query("UPDATE cart SET amount = amount+1 WHERE id = :int")
    fun updateCart(int: Int)


    @Transaction
    fun upsert(model: CartTable) {
        val id = insertToCart(model)

        if (id == -1L) {

            model.id?.let {

                updateCart(it)

            }

MainAdapter:


class RecyclerAdapterMain(


    private val product: List<Roomtable>,val context: Context,private val viewlifecyclerOwner: LifecycleOwner

) :

    RecyclerView.Adapter<RecyclerAdapterMain.ViewHolder>() {


    val viewmodel: viewmodelRoom by lazy {

        viewmodelProvider.AndroidviewmodelFactory(Application()).create(viewmodelRoom::class.java)

    }


    inner class ViewHolder(itemview: View) :
        RecyclerView.ViewHolder(itemview) {


        val title: TextView = itemview.product_txt

        val price: TextView = itemview.price_product

        val imageproduct: ImageView = itemview.product_image

        val btn_add_product: Button = itemview.btn_add_product

        var amount_value: TextView = itemview.amount_value
    


    }

    override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): ViewHolder {


        val layoutview =
            LayoutInflater.from(parent.context).inflate(R.layout.product_items,parent,false)
        return ViewHolder(layoutview)

    }

    override fun getItemCount(): Int = product.size


    override fun onBindViewHolder(holder: ViewHolder,position: Int) {


        var products = product[position]

        holder.title.text = products.title
        holder.price.text = products.price
        Picasso.get().load(products.image).into(holder.imageproduct)



        holder.btn_add_product.setonClickListener {

            products.amount++

            viewmodel.upsert(
                CartTable(
                    holder.adapterPosition,products.title,products.price,products.image,products.amount
                )
            )


            viewmodel.GetallFromCart(holder.adapterPosition).observe(viewlifecyclerOwner,Observer {

                if (it != null) {

                    for (item in it) {

                        holder.amount_value.text = item.amount.toString()

                    }

                }

            })

        }

主要活动:


class HomeActivity : AppCompatActivity(){


    val viewmodel: viewmodelRoom by lazy {

        viewmodelProvider(this).get(viewmodelRoom::class.java)


    }



    @RequiresApi(Build.VERSION_CODES.M)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.home_activity)


        loadProduct()


    @RequiresApi(Build.VERSION_CODES.M)
    private fun loadProduct() {

        swipeRefreshMain.isRefreshing = true

        if (hasNetworkAvilable(applicationContext)) {

            viewmodel.setup()
            viewmodel.products.observe(this,Observer {

                loadrecycler(it)

            })

        } else {

            Toast.makeText(
                applicationContext,"برای بروز رسانی محصولات اینترنت خود را روشن کنید",Toast.LENGTH_LONG
            ).show()
            viewmodel.getalldata().observe(this,Observer {

                if (!it.isNullOrEmpty()) {

                    loadrecycler(it)


                } else {


                    val builder = AlertDialog.Builder(this)
                        .setView(R.layout.customalertdialog)
                        .setPositiveButton("Ok",null)
                        .create()
                        .show()

                    val constraint = Constraints.Builder()
                        .setrequiredNetworkType(NetworkType.CONNECTED)
                        .build()
                    val workmanager: WorkManager = WorkManager.getInstance(this)
                    val workRequest = OneTimeWorkRequest.Builder(UploadWorkerClass::class.java)
                        .setConstraints(constraint)
                        .build()
                    workmanager.enqueue(workRequest)


                }

            })


        }
    }

    fun loadrecycler(product: List<Roomtable>) {


        val swipeRefreshLayout: SwipeRefreshLayout = findViewById(R.id.swipeRefreshMain)
        val recycler: RecyclerView = findViewById(R.id.recycler_main)

        recycler.apply {


            layoutManager = GridLayoutManager(this@HomeActivity,2)

            adapter = RecyclerAdapterMain(
                product,this@HomeActivity,this@HomeActivity )


            Handler(Looper.getMainLooper()).postDelayed({

                swipeRefreshLayout.isRefreshing = false

            },randomInRange(1,3) * 1000.toLong())

        }
    }

}



    
















版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。