12

Я использую вид ресайклера с GirdLayout менеджером для создания макета шиныРазнос Issue при создании макета шины в ресайклере зрения GridLayout менеджера

моей проблема с шагом я Populating данных в соответствии грести столбец

Этих то, как я получаю компоновки enter image description here

Это, как я хочу, чтобы мой макет быть: enter image description here

Я хочу элемент в строке 3 и столбце 2 рядом с местом сидения в столбце строки 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);} 
} 

}

это recyclerview

<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> 
+0

Опубликуйте * XML макет * код. –

+0

@jayroider Я обновил xml-код –

+0

Являются ли эти строки добавленными динамически или используют этот * layout * сам? –

ответ

0

Проблема, конечно, связана с тем, что ваши элементы не имеют одинаковой высоты. Вам нужно назначить разные промежутки строк для элементов. Я бы предложил назначить более высокие элементы (те, что слева), диапазон строк 2 и 1 для меньших.

Я думаю, вы могли бы сделать это с помощью трюка, например, чтобы ваш менеджер компоновки сетки имел горизонтальную ориентацию и использовал GridLayoutManager.setSpanSizeLookup(..) для управления пролетом (так как ваш теперь горизонтальный, диапазон будет действовать на строки). Это потребовало бы, чтобы вы, вероятно, переработали логику получения ваших элементов из массива поддержки. Альтернативой я бы боялся (насколько я знаю) реализовать собственный менеджер макетов.

+0

извините, но я совершенно новое с GridLayout менеджером, как я могу установить размер диапазона в зависимости от ряда –

+0

Скажем, положение 0 потребности в распространяющиеся 2 ряда, а остальные только один: \t \t \t layoutManager.setSpanSizeLookup (новый GridLayoutManager.SpanSizeLookup() { \t \t \t \t @Override \t \t \t \t общественного ИНТ getSpanSize (целое положение) { \t \t \t \t \t если (позиция == 0) \t \t \t \t \t \t возвращение 2; \t \t \t \t \t возвращение 1; \t \t \t \t} \t \t \t}); –

+0

Я пробовал делать это, но никаких изменений –

0

Я предлагаю реализовать ваш макет вида ресайклера как TableLayout или GridLayout, они обеспечивают большую гибкость при определении прокрутки строк/столбцов.

Некоторые полезные ссылки:

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

+0

с помощью TableLayout или GridLayout, как я могу удалить этот интервал, я попытался использовать Table и GridLayout. Строка 3 начиналась после строки 2, я хочу несколько перекрывать строку 3 в строке 2, как показано на изображении. –

+0

Я не уверен, но, может быть, вы можете попытаться установить элементы layout_gravity в начало –

+0

Я попробовал, макет выглядел так же, как и у меня, у pic я поделился только гравитационным верхом –

Смежные вопросы