16

バスレイアウトを作成するために GirdLayout Manager でリサイクラービューを使用しています

私の問題は、行の列に従ってデータを入力している間隔にあります

これは私がレイアウトを取得する方法です ここに画像の説明を入力

これが私のレイアウトのあり方です: ここに画像の説明を入力

写真に示されているように、行 2 列 0 の寝台席の横にある行 3 と列 2 にアイテムが必要です。そのスペースを削除するにはどうすればよいですか。アイテムはその上のアイテムに従って収容する必要があります。

 customGridAdapter = new CustomGridViewAdapter(getActivity(), busSeatModel, false, fareCategory, BusSeatLayout.this);
                        RtlGridLayoutManager gridLayoutManager = new RtlGridLayoutManager(getActivity(), busSeatModel.getMaxLowerColumn());
                        seatLayout.setLayoutManager(gridLayoutManager);
                        seatLayout.setAdapter(customGridAdapter);

これは私の customGridAdapter onBindViewHolder です

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>
4

2 に答える 2

0

リサイクラー ビュー アイテムのレイアウトをTableLayoutまたはGridLayoutとして実装することをお勧めします。行/列のスパンをより柔軟に定義できます。

いくつかの便利なリンク:

http://android-pro.blogspot.com.eg/2010/02/table-layout.html https://developer.android.com/guide/topics/ui/layout/grid.html

于 2016-09-19T09:43:35.813 に答える
0

もちろん、問題は要素の高さが同じではないという事実から発生します。要素に異なる行スパンを割り当てる必要があります。背の高い要素 (左側のもの) には、小さい要素には 2 と 1 の行スパンを割り当てることをお勧めします。

グリッドレイアウトマネージャーを水平方向に設定し、スパンを制御するために使用するようなトリックでそれを行うことができると思いますGridLayoutManager.setSpanSizeLookup(..)(現在は水平であるため、スパンは行に作用します)。これには、おそらくバッキング配列から要素を取得するロジックを作り直す必要があります。別の方法としては、(私が知る限り) 独自のカスタム レイアウト マネージャーを実装することを恐れています。

于 2016-09-12T13:09:32.053 に答える