Android Databinding无法立即在RecyclerView中更新UI

时间:2019-02-18 14:40:26

标签: android-recyclerview viewmodel android-databinding

我有一个recyclerView,每个列表项视图都包含两个视图-

  • 文本视图,使用数据绑定lib和
  • 显示POJO中的一些文本
  • 单击该按钮时,会从viewmodel调用方法。

viewmodel直接将文本更改为POJO。除了需要刷新“回收者”视图以显示更改之外,所有其他事情都可以正常工作。

我的POJO

public class Post{
private String title;
...getter and setter
}

回收商Adatper就是这样。

public class MyRecyclerAdapter extends RecyclerView.Adapter<PostRecyclerAdapter.MyViewHolder> {

private List<Post> posts;
...
class MyViewHolder extends RecyclerView.ViewHolder {
    private final ViewDataBinding binding;

    public MyViewHolder(ViewDataBinding binding) {
        super(binding.getRoot());
        this.binding = binding;
    }

    void bindView(int position) {
        Post post = posts.get(position);
        binding.setVariable(BR.post, post);
        binding.setVariable(BR.viewModel, myViewModel);
        binding.executePendingBindings();

    }
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    ViewDataBinding binding = DataBindingUtil.inflate(inflater, R.layout.post_list_item, parent, false);
    return new MyViewHolder(binding);
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    holder.bindView(position);
}
...
}

post_list_item.xml

<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
    <variable
        name="post"
        type="....Post" />
    <variable
        name="viewModel"
        type="....MyViewModel"/>
</data>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@{post.title}" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClickListener="@{()->viewModel.onButtonClicked(post)}"
/>
    </LinearLayout>

和viewModel具有此方法。

public class MyViewModel extends ViewModel {
 public void onButtonClicked(Post post) {
post.setTitle("some text");
}

我认为有一种方法可以在POJO中的数据更改时立即更改UI。但是现在我需要从屏幕上绘制回收者视图或旋转屏幕。

1 个答案:

答案 0 :(得分:-1)

更新适配器类中的回收站视图UI。它解决了我的问题。