【问题标题】:Different viewtypes in recyclerview with GridLayoutManager带有 GridLayoutManager 的 recyclerview 中的不同视图类型
【发布时间】:2019-04-08 05:46:32
【问题描述】:

我知道很多人以前问过这个问题,事实上我也曾开发过一个聊天应用程序,它使用recyclerview 来显示聊天,我使用view types 根据发件人选择消息布局,但我觉得这个问题不同。

我有一个Recyclerview,它正在显示带有GridLayoutManager 的内容 heres an image to show that,在我的图片中,我有 3 件物品; A、B、C,我想让C适合宽度,我真的不确定这是否可以通过视图类型来实现,下面是我的适配器代码

适配器:

public class StoreDisplayItemAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {


private Context context;
private ArrayList<StoreDisplayProduct> products;
private Interfaces.OnItemClickedListener onItemClickedListener;


public StoreDisplayItemAdapter(Context context, ArrayList<StoreDisplayProduct> products, Interfaces.OnItemClickedListener onItemClickedListener) {
    this.context = context;
    this.products = products;
    this.onItemClickedListener = onItemClickedListener;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    return new ItemViewHolder(inflater.inflate(R.layout.store_display_item, parent, false));
}

public StoreDisplayProduct getProductsItem(int pos) {
    return products.get(pos);
}

public void setProducts(ArrayList<StoreDisplayProduct> products) {
    this.products = products;
    notifyDataSetChanged();
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    StoreDisplayProduct product = getProductsItem(position);
    ItemViewHolder viewHolder = (ItemViewHolder) holder;
    viewHolder.txtProductType.setText(product.getProductTypeDisplayName());
    viewHolder.txtName.setText(product.getName());
    viewHolder.img.post(() -> Picasso.with(context)
            .load(product.getDisplayImage().getFullSize())
            .fit()
            .transform(new RoundedCornersTransformation(10,10))
            .placeholder(R.color.asbestos)
            .centerCrop()
            .into(viewHolder.img));

}


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


public class ItemViewHolder extends RecyclerView.ViewHolder {

    @BindView(R.id.txtProductType)
    TextView txtProductType;
    @BindView(R.id.img)
    SquareImageView img;
    @BindView(R.id.txtName)
    TextView txtName;
    public ItemViewHolder(View itemView) {
        super(itemView);
        ButterKnife.bind(this, itemView);

        itemView.setOnClickListener(v -> {
            onItemClickedListener.onItemClicked(v, getAdapterPosition());
        });
    }
}


}

以及我如何使用适配器

    recyclerStoreDisplayProducts.setAdapter(storeDisplayItemAdapter);
    recyclerStoreDisplayProducts.setLayoutManager(new GridLayoutManager(getContext(), 2));
    recyclerStoreDisplayProducts.setHasFixedSize(true);
    recyclerStoreDisplayProducts.setNestedScrollingEnabled(true);

【问题讨论】:

  • 寻找staggeredgridlayoutmanager。或者你可以试试This
  • 太棒了,链接解决了我的问题,请把它放在答案部分,以便我批准。

标签: android android-recyclerview gridlayoutmanager


【解决方案1】:

您可以使用跨度计数,如

GridLayoutManager layoutManager = new GridLayoutManager(this, 4);
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
    @Override
    public int getSpanSize(int position) {
        if (position<3)
            return 1;
        else
            return 2;
    }
});

【讨论】:

    【解决方案2】:

    您可以根据您的问题@Aubry 使用交错网格布局管理器,

    //you need to add the code for creating a staggered layout manager
    recyclerStoreDisplayProducts.setAdapter(storeDisplayItemAdapter);
    StaggeredGridLayoutManager staggeredGridLayoutManager = new 
    StaggeredGridLayoutManager(mNoOfColumns,StaggeredGridLayoutManager.HORIZONTAL); 
    recyclerStoreDisplayProducts.setHasFixedSize(true);
    recyclerStoreDisplayProducts.setNestedScrollingEnabled(true);
    recyclerStoreDisplayProducts.setLayoutManager(staggeredGridLayoutManager);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多