gpt4 book ai didi

android - 如何将 livedata 和 viewmodel 与 viewholder 作为 Lifecycle Owner 一起使用?

转载 作者:行者123 更新时间:2023-12-03 10:11:17 25 4
gpt4 key购买 nike

我有一个垂直滚动的 recyclerview (verticalRV)。
此 recyclerview(horizo​​ntalRV) 中的每个项目都是一个 Horizo​​ntal recyclerview。
在verticalRV itemViewHodler 内部,我试图从viewmodel 中获取数据并观察任何变化并相应地更新horizo​​ntalRV 适配器。
但是观察者是onChanged方法没有被调用。
我已经实现了 LifecycleOwner 接口(interface)来使用 livedata 管理 View 持有者的生命周期,并相应地从verticalRV的适配器中设置状态

public class VeritcalRVHolderItem implements LifecycleOwner {
private static final String TAG = LDFeedListAdapterHolder.class.getSimpleName();
private final FragmentActivity activity;
private final RvHorizontalListAdapter adapter;
private RecyclerView rvHorizontalList;


public VeritcalRVHolderItem(Context context, View itemView, FragmentActivity activity) {
super(context, itemView);
this.activity = activity;
rvHorizontalList = itemView.findViewById(R.id.rvHorizontalList);
LinearLayoutManager layout = new LinearLayoutManager(getContext(), LinearLayout.HORIZONTAL, false);
rvHorizontalList.setLayoutManager(layout);
adapter = new RvHorizontalListAdapter(this.activity);
rvHorizontalList.setAdapter(adapter);
LDViewModel LDViewModel = ViewModelProviders.of(activity).get(LDViewModel.class);
LDViewModel.getTopicsForFeed().observe(this, new Observer<List<Topic>>() {
@Override
public void onChanged(List<Topic> topics) {
//adding live discussion model at first position
adapter.updateLiveList(topics);
adapter.notifyItemChanged(0);
Log.d(TAG, "discussion model calls");
}
});
}

private LifecycleRegistry lifecycleRegistry;

public void onAppear() {
lifecycleRegistry.markState(Lifecycle.State.CREATED);
}

public void onDisappear() {
lifecycleRegistry.markState(Lifecycle.State.DESTROYED);
}

@NonNull
@Override
public Lifecycle getLifecycle() {
return lifecycleRegistry;
}

}
请让我知道我在这里缺少什么。

最佳答案

有两种方法可以解决这个问题,一种是 Shyak 的答案,它设法观察适配器外部的变化,并通过支持列表的数据的变化来通知变化。这实际上是尊重回收者 View 和适配器的模式。
但有时,我们希望在 recylerview 上观察并显示来自模型的一些数据,以及一些外部事件和/或数据。与其将所有这些信息组合在包含聚合数据的新模型上,不如直接在适配器本身上观察一些更改可能会很方便。
在这种情况下,您可以将观察者添加到 ViewHolder 并以这种方式对更改使用react:

  • 在适配器类的构造函数中传递 LiveData:

  • class MyAdapter(private var data: LiveData<Int>) : RecyclerView.Adapter<MyViewHolder>() {
  • 在 viewHolder 创建时添加观察者:

  • override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
    val holder = MyViewHolder(
    LayoutInflater.from(parent.context).inflate(
    R.layout.my_layout, parent,
    false
    )
    )

    data.observe(holder.itemView.context as LifecycleOwner, Observer {
    // action to be performed by the observer
    })

    return holder
    }
  • 当 viewHolder 与模型元素相关联时,为 viewHolder 设置正确的视觉状态

  • override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
    if (data.value!! >= 0 && data.value == position) {
    holder.setSelected(true) // or whatever is visually necessary
    } else {
    holder.setSelected(false) // or whatever is visually necessary
    }
    }
    注意事项: holder.itemView.context as LifecycleOwner这基本上意味着 recyclerview 位于作为生命周期所有者的 fragment 内。
    这种方法很有效,因为 ViewHolder 被重用,所以我们不必为列表的各种元素创建新的观察者。

    关于android - 如何将 livedata 和 viewmodel 与 viewholder 作为 Lifecycle Owner 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54825613/

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