gpt4 book ai didi

android - Android 应用程序中的数据绑定(bind)和 RecyclerView

转载 作者:太空宇宙 更新时间:2023-11-03 13:14:53 26 4
gpt4 key购买 nike

我想知道如何使 DatabindingRecyclerView 协同工作。我有一个定义如下的适配器类:

public class RestaurantRecyclerViewAdapter extends RecyclerView.Adapter<RestaurantRecyclerViewAdapter.BindingHolder> {

private RestaurantsListViewModel mDataContext;

public RestaurantRecyclerViewAdapter(RestaurantsListViewModel vm) {
mDataContext = vm;
}


@Override
public BindingHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_restaurant_list_item, parent, false);
BindingHolder holder = new BindingHolder(v);

return holder;
}

@Override
public void onBindViewHolder(final BindingHolder holder, int position) {
final RestaurantListItemViewModel restaurant = mDataContext.getRestaurant(position);

holder.getBinding().setVariable(BR.restaurant, restaurant);
holder.getBinding().executePendingBindings();
}

@Override
public int getItemCount() {
return mDataContext.getRestaurantsCount();
}

public class BindingHolder extends RecyclerView.ViewHolder {

private ViewDataBinding binding;

public BindingHolder(View rowView) {
super(rowView);
binding = DataBindingUtil.bind(rowView);
}

public ViewDataBinding getBinding() {
return binding;
}

}

}

如果 RestaurantListViewModel 更新了一些新餐厅,我希望 RecyclerView 重新呈现这些新对象。我怎样才能做到这一点?

编辑:

@Vladimirs 方法似乎很明智,但是我在实现 onBindViewHolder 方法时遇到了问题:

public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
final RestaurantListItemViewModel restaurant = restaurants.get(position);

holder.getBinding().setVariable(BR.restaurant, restaurant);
holder.getBinding().executePendingBindings();
}

现在没有 getBinding 方法。

最佳答案

您可以先创建适配器

public class RecyclerViewAdapters {

@BindingAdapter("items")
public static void setItems(RecyclerView view, List<Object> items) {
RecyclerView.Adapter<?> adapter = view.getAdapter();
if (adapter instanceof RestaurantRecyclerViewAdapter) {
// tell RestaurantRecyclerViewAdapter to set new list of items
} else {
throw new IllegalArgumentException("RecyclerView.Adapter is not RestaurantRecyclerViewAdapter");
}
}
}

然后在 View 模型中

public final ObservableList<Object> items = new ObservableArrayList<>();

最后是xml布局

<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:items="@{viewModel.items}"
app:layoutManager="LinearLayoutManager"/>

很简单的方法,不考虑项目的部分变化,你可以多看看ObservableListOnListChangedCallback

UPD作为 OnListChangedCallback 的后续,我认为可能可以使用适配器来实现类似的东西,以对列表的确切更改使用react。

public class ObservableListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
ObservableList<Object> list;

ObservableList.OnListChangedCallback<ObservableList<Object>> callback = new ObservableList.OnListChangedCallback<ObservableList<Object>>() {
@Override
public void onChanged(ObservableList<Object> sender) {
notifyDataSetChanged();
}

@Override
public void onItemRangeChanged(ObservableList<Object> sender, int positionStart, int itemCount) {
notifyItemRangeChanged(positionStart, itemCount);
}

@Override
public void onItemRangeInserted(ObservableList<Object> sender, int positionStart, int itemCount) {
notifyItemRangeInserted(positionStart, itemCount);
}

@Override
public void onItemRangeMoved(ObservableList<Object> sender, int fromPosition, int toPosition, int itemCount) {
notifyItemRangeRemoved(fromPosition, itemCount);
notifyItemRangeInserted(toPosition, itemCount);
}

@Override
public void onItemRangeRemoved(ObservableList<Object> sender, int positionStart, int itemCount) {
notifyItemRangeRemoved(positionStart, itemCount);
}
};

public ObservableListAdapter(@NonNull ObservableList<Object> list) {
this.list = list;
this.list.addOnListChangedCallback(callback);
}

@Override
public int getItemCount() {
return list.size();
}

@Override
public long getItemId(int position) {
return position;
}
}

关于android - Android 应用程序中的数据绑定(bind)和 RecyclerView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37864782/

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