如何解决在适配器中观察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 举报,一经查实,本站将立刻删除。