当前位置: 首页 > 知识库问答 >
问题:

在回收器视图网格布局管理器中创建总线布局时出现间距问题

澹台聪
2023-03-14

我正在使用Recolyer视图和GirdLayout管理器创建总线布局

我的问题是间距问题,我正在根据行、列填充数据

我想在第3行和第2列的项目旁边的卧铺座位在第2行第0列,如图所示,我怎样才能移除那个空间,项目应该根据它的上项容纳。

 customGridAdapter = new CustomGridViewAdapter(getActivity(), busSeatModel, false, fareCategory, BusSeatLayout.this);
                        RtlGridLayoutManager gridLayoutManager = new RtlGridLayoutManager(getActivity(), busSeatModel.getMaxLowerColumn());
                        seatLayout.setLayoutManager(gridLayoutManager);
                        seatLayout.setAdapter(customGridAdapter);
public class CustomGridViewAdapter extends RecyclerView.Adapter<CustomGridViewAdapter.MyViewHolder> {

Context context;
BusSeatModel busSeatModel;
HashMap<Integer, HashMap<Integer, BusSeatItemModel>> data = new HashMap<>();
LayoutInflater inflater;
boolean upper;
HashMap<Integer, BusSeatItemModel> seatLowerModels;
BusSeatItemModel lowerModel;
int maxColumn = 0;
int maxRow = 0;
BusSeatLayout busSeatLayout;
int fare;

public CustomGridViewAdapter(Context context, BusSeatModel busSeatModel, boolean upper, int fare, BusSeatLayout busSeatLayout) {
    this.context = context;
    this.busSeatModel = busSeatModel;
    inflater = LayoutInflater.from(context);
    this.fare = fare;
    this.busSeatLayout = busSeatLayout;
    this.upper = upper;
    if (upper) {
        data = busSeatModel.getBusSeatUpperModels();
        maxColumn = busSeatModel.getMaxUpperColumn();
        maxRow = busSeatModel.getMaxUpperRow();
    } else {
        data = busSeatModel.getBusSeatLowerModels();
        maxColumn = busSeatModel.getMaxLowerColumn();
        maxRow = busSeatModel.getMaxLowerRow();
    }
}


@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View view = inflater.inflate(R.layout.seatrow_grid, parent, false);

    MyViewHolder myViewHolder = new MyViewHolder(view);

    return myViewHolder;
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    try {

        int row = GetRow(position);
        int column = GetCol(position);

        Log.d(" Row Column  ", "" + row + "  " + column);

        seatLowerModels = new HashMap<>();

        if (data.containsKey(row)) {
            seatLowerModels = data.get(row);
            if (seatLowerModels.containsKey(column)) {
                lowerModel = seatLowerModels.get(column);
                Log.v(" same fare ", " model fare " + lowerModel.getBaseFare() + " category selected " + fare);
                if (fare == -1) {
                    Log.v("  fare  is all ", "++++    ");

                    holder.imageItem.setImageResource(lowerModel.getDrawableName(false));

                } else {
                    Log.v("  fare  is not all ", "");
                    if (lowerModel.getBaseFare() == fare) {
                        Log.v("  fare  is same ", "");
                        holder.imageItem.setImageResource(lowerModel.getDrawableName(false));
                    } else {
                        Log.v("  fare  is diff ", "");
                        holder.imageItem.setImageResource(lowerModel.getDrawableName(true));
                    }
                }
                holder.imageItem.setVisibility(View.VISIBLE);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}


private int GetCol(int pos) {
    int col = pos % (maxColumn);
    return col;
}

private int GetRow(int pos) {
    int row = pos / (maxColumn);
    return row;
}

@Override
public int getItemCount() {
    return maxColumn * maxRow;
}


public class MyViewHolder extends RecyclerView.ViewHolder {

    ImageView imageItem;


    public MyViewHolder(View itemView) {
        super(itemView);


        imageItem = (ImageView) itemView.findViewById(R.id.item_image);}
}

这是回收视图

<RelativeLayout
            android:id="@+id/rlRecycler"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#ffffff"
            android:gravity="center">

            <android.support.v7.widget.RecyclerView
                android:id="@+id/rvFareCategory"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:background="#ffffff"
                android:paddingBottom="6dip"
                android:paddingTop="8dip"></android.support.v7.widget.RecyclerView>
        </RelativeLayout>

和座椅布局xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<ImageView
    android:id="@+id/item_image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@null"
    android:padding="4dp"
    android:visibility="invisible"></ImageView>

</RelativeLayout>

共有1个答案

严昊昊
2023-03-14

当然,问题产生于这样一个事实:你的元素没有相同的高度。您需要为元素分配不同的行跨度。我建议为较高的元素(左边的元素)分配行跨度2和较小的元素的行跨度1。

我认为您可以通过一个技巧来实现,例如将网格布局管理器设置为水平方向,并使用GridLayoutManager.setSpanSizeLookup(..)来控制跨度(由于您的网格布局管理器现在是水平的,所以跨度将作用于行)。这可能需要您重新处理从备份数组获取元素的逻辑。另一种选择恐怕是(据我所知)实现您自己的自定义布局管理器。

 类似资料:
  • 我正在使用管理器用于回收器视图 现在,我想删除列和行之间的默认间距。类似于这张图片,但只有2列。

  • 我在带有网格布局管理器的回收器视图中有一个卡片视图。我想删除卡片之间的空间,但也要保留卡片的特定宽度。 这是我的布局活动: 这是我的名片:

  • 根据Building a RecolyerView LayoutManager文章,我已经为RecolyerView创建了自己的自定义布局管理器,但是由于现有的一些文档,我无法找到从布局管理器中强制RecolyView重建动画的方法(就像使用notifyItemInserted或notifyItemDeleted时的动画一样)。这些动画由recyclerView及其项目动画师控制,开发人员只能控制

  • 当点击fab时,snack bar出现,为此我必须使用协调器布局将fab水平移动到snack bar上方。但现在回收器视图的前几个项目是不可见的。它只从项目3开始。能否有人帮助解决这一点和什么改变要做。提前谢谢!!

  • 我需要Android TV的自定义键盘,就像下面图像中的这个。布局有一个带有网格布局管理器的回收器视图来自定义行和列。 但是当我运行应用程序时,布局在最后一行没有显示正确的按钮宽度。“空格”按钮的量程应为4,“移位”按钮2和“归零”按钮3。

  • 我一直在尝试使用此处的少量指导来实现带有RecyclerView的CollapsingToolbar:http://android-developers.blogspot.co.uk/2015/05/android-design-support-library.html 和这里的项目:https://github.com/chrisbanes/cheesesquare,我目前有以下布局: 来源如下