如何在Recyclerview中使用数据绑定创建2列

问题描述 投票:1回答:1

我在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" />
android android-recyclerview android-databinding
1个回答
1
投票

我发现的唯一方法是在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>
© www.soinside.com 2019 - 2024. All rights reserved.