我在MVVM中使用数据绑定应用Recyclerview,架构简洁。我如何应用layoutManager来制作两列网格?
我曾用layoutManager和spancount在xml中做过列,但这样做是不行的。我看过很多教程,大家都没有完全使用recyclerview databinding。
public class StoreHomeAdapter extends RecyclerView.Adapter<StoreHomeAdapter.GenericViewHolder> {
private int layoutId;
private List<StoreHomeFields> storeNames;
private StoreHomeViewModel viewModel;
public StoreHomeAdapter(@LayoutRes int layoutId, StoreHomeViewModel viewModel) {
this.layoutId = layoutId;
this.viewModel = viewModel;
}
private int getLayoutIdForPosition(int position) {
return layoutId;
}
@Override
public int getItemCount() {
return storeNames == null ? 0 : storeNames.get(0).getResult().length;
}
public GenericViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
ViewDataBinding binding = DataBindingUtil.inflate(layoutInflater, viewType, parent, false);
return new GenericViewHolder(binding);
}
@Override
public void onBindViewHolder(@NonNull GenericViewHolder holder, int position) {
holder.bind(viewModel, position);
}
@Override
public int getItemViewType(int position) {
return getLayoutIdForPosition(position);
}
public void setStoreHomes(List<StoreHomeFields> mStoreNames) {
this.storeNames = mStoreNames;
}
class GenericViewHolder extends RecyclerView.ViewHolder {
final ViewDataBinding binding;
GenericViewHolder(ViewDataBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
void bind(StoreHomeViewModel viewModel, Integer position) {
// viewModel.fetchStoreHomeImagesAt(position);
binding.setVariable(BR.viewModel, viewModel);
binding.setVariable(BR.position, position);
binding.executePendingBindings();
}
}
下面是ViewModel类
public class StoreHomeViewModel extends ViewModel {
private StoreHomeAdapter adapter;
public void init() {
storeHomeFields = new StoreHomeModel();
adapter = new StoreHomeAdapter(R.layout.store_home_item, this);
}
public StoreHomeAdapter getAdapter() {
return adapter;
}
public ArrayAdapter getCityAdapter() {
return cityAdapter;
}
public void setStoreNamesInAdapterObj(List<StoreHomeFields> mStores) {
this.adapter.setStoreHomes(mStores);
this.adapter.notifyDataSetChanged();
}
}
这里是xml
<android.recyclerview.widget.RecyclerView
android:id="@+id/grid_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:setAdapter="@{model.getAdapter()}"
app:spanCount="2"
apps:orientation="vertical" />
我发现的唯一方法是在oncreateview中使用绑定变量实例化布局,如下所示。
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?): View? {
binding = DataBindingUtil.inflate(inflater, R.layout.yout_fragment,container,false)
binding.gridView.layoutManager = GridLayoutManager(context,2)
return binding.root
}
布局
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.activity.MainActivity"
android:padding="16dp">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/grid_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:setAdapter="@{model.getAdapter}"
android:orientation="vertical"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>