gpt4 book ai didi

android - 更改RecyclerView.Adapter时刷新 fragment View

转载 作者:行者123 更新时间:2023-12-02 13:39:37 24 4
gpt4 key购买 nike

我正在遵循Shrine示例应用程序,该应用程序在Google官方代码实验室的Kotlin部分中为开发人员实现。 The applicationcodelab
最后一步,我们被要求

Modify your Shrine application to change the product images shown whena category is selected from the backdrop menu.


ProductGridFragment#onCreateView中,我在一个按钮上附加了onClick侦听器,以开始(类别列表,是按钮)。
作为测试,我只是从Adapter中首先使用的列表中弹出了一个元素。
theList = ProductEntry.initProductEntryList(resources)
adapter = StaggeredProductCardRecyclerViewAdapter( theList )

val featured = view.findViewById(R.id.featured) as Button
// set on-click listener
featured.setOnClickListener {
theList.pop(1)
adapter.notifyDataSetChanged()
它不起作用。还有其他事情可以刷新 View 吗?我在 onCreateView中看到的所有内容似乎都只是为了第一次创建该片段,我的意思是,当生成 onClick时,在我看来仅修改列表并将更改通知适配器就足够了。
我是否需要对 view对象做任何事情?
有什么提示吗?
编辑1:
我分配了一个新适配器,现在可以正常工作了,这非常好;尽管我觉得它的性能不高,但是通知数据更改并没有按预期使用
featured.setOnClickListener {
theList = ProductEntry.initProductEntryList(resources, "featured")
this.adapter = StaggeredProductCardRecyclerViewAdapter(
theList )
view.recycler_view.adapter = this.adapter
this.adapter.notifyDataSetChanged()
}

最佳答案

在Java / Kotlin中,您总是按值传递,而不是引用。因此,当您将列表传递给StaggeredProductCardRecyclerViewAdapter( theList )时,应该从适配器而不是您传递的列表中更新列表,例如:

class StaggeredProductCardRecyclerViewAdapter(private val theList: List) {

private var listOfItems = theList

fun removeItem(position: Int) {
listOfItems = listOfItems.remove(position)
notifyDatasetChanged()
}
}

val featured = view.findViewById(R.id.featured) as Button
// set on-click listener
featured.setOnClickListener {
adapter.removeItem(1)
}
编辑:
我去了代码库,您正在 StaggeredProductCardRecyclerViewAdapter内的不可变列表上进行操作。例如,如果要基于“功能”过滤列表中的项目,则应执行以下操作:
class StaggeredProductCardRecyclerViewAdapter(private val initList: List<ProductEntry>?) : RecyclerView.Adapter<StaggeredProductCardViewHolder>() {

private var productList: List<ProductEntry>? = initList

override fun getItemViewType(position: Int): Int {
return position % 3
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): StaggeredProductCardViewHolder {
var layoutId = R.layout.shr_staggered_product_card_first
if (viewType == 1) {
layoutId = R.layout.shr_staggered_product_card_second
} else if (viewType == 2) {
layoutId = R.layout.shr_staggered_product_card_third
}

val layoutView = LayoutInflater.from(parent.context).inflate(layoutId, parent, false)
return StaggeredProductCardViewHolder(layoutView)
}

override fun onBindViewHolder(holder: StaggeredProductCardViewHolder, position: Int) {
if (productList != null && position < productList.size) {
val product = productList[position]
holder.productTitle.text = product.title
holder.productPrice.text = product.price
ImageRequester.setImageFromUrl(holder.productImage, product.url)
}
}

override fun getItemCount(): Int {
return productList?.size ?: 0
}

fun replaceList(items: List<ProductEntry>?) {
productList = items
notifyDatasetChanged()
}
}
在ProductGridFragment中:
...
featured.setOnClickListener {
adapter.replaceList(ProductEntry.initProductEntryList(resources, "featured"))
}

关于android - 更改RecyclerView.Adapter时刷新 fragment View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64604729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com