【问题标题】:Not able to create a required layout xml (Android)无法创建所需的布局 xml (Android)
【发布时间】:2018-10-13 07:24:24
【问题描述】:

我正在开发一个巴士预订应用程序。我想要如下所示的座位预订布局。

Like this

And I am getting this

每行有 4 个座位,如何在第 2 列和第 3 列之间留 1 个空白行,最后一行应显示全部 5 个座位​​。

我的布局没有被格式化为ineed。

选座活动

public class SeatSelection extends AppCompatActivity implements AdapterView.OnItemClickListener{

RecyclerView recyclerView;
RecyclerView.Adapter adapter;
ArrayList<Item> gridArray = new ArrayList<Item>();
TextView txtSeatNo;
ImageView imageView;
public Bitmap seatIcon;
public Bitmap seatSelect;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_seat_selection);

    seatIcon = BitmapFactory.decodeResource(this.getResources(), R.drawable.seat_layout_screen_nor_avl);
    seatSelect = BitmapFactory.decodeResource(this.getResources(), R.drawable.seat_layout_screen_nor_std);

    recyclerView = (RecyclerView) findViewById(R.id.recycler);
    RecyclerView.LayoutManager layoutManager = new GridLayoutManager(this, 5);
    recyclerView.setLayoutManager(layoutManager);
    adapter = new SeatAdapter();
    recyclerView.setAdapter(adapter);


}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

    Item item = gridArray.get(position);
    Bitmap seatcompare = item.getImage();
    if (seatcompare == seatIcon)
    {
        seatSelected(position);
    }
    else
    {
        seatDeselected(position);

    }
}

SeatAdapter seatAdapter;
public void seatSelected(int pos)
{
    gridArray.remove(pos);
    gridArray.add(pos, new Item(seatSelect, "Selected"));
    seatAdapter.notifyDataSetChanged();
}

public void seatDeselected(int pos)
{
    gridArray.remove(pos);
    int i = pos + 1;
    gridArray.add(pos, new Item(seatIcon, "Seat" + i));
    seatAdapter.notifyDataSetChanged();
}
public class SeatAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{

    class ViewHolderOriginal extends RecyclerView.ViewHolder{

        ImageView imageView;
        TextView textView;
        ViewHolderOriginal(View itemView) {
            super(itemView);
            imageView= (ImageView) itemView.findViewById(R.id.item_image);
            textView = (TextView) itemView.findViewById(R.id.item_text);
        }
    }

    class ViewHolderBlank extends RecyclerView.ViewHolder{
        ViewHolderBlank(View itemView) {
            super(itemView);

        }

    }
    // 0= Original view 1= Blank View
    @Override
    public int getItemViewType(int position) {
        if((getItemCount()-(position-1))<5)
            return 0;
        else
            return position % 5 == 2 ? 1 : 0;
    }

    @Override
    public int getItemCount() {
        return 60;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (viewType == 1)
            return new ViewHolderBlank(inflater.inflate(R.layout.item_blank, parent, false));
        else
            return new ViewHolderOriginal(inflater.inflate(R.layout.seatrow_grid, parent, false));
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
        if (holder instanceof ViewHolderBlank) {

        } else if (holder instanceof ViewHolderOriginal) {

        }
    }

}
}

物品

public class Item
 {
public Bitmap image;
public String title;
public boolean isSelected;


public boolean isSelected()
{
    return isSelected;
}


public void setSelected(boolean isSelected)
{
    this.isSelected = isSelected;
}


public Item(Bitmap image, String title)
{
    super();
    this.image = image;
    this.title = title;
}


public Bitmap getImage()
{
    return image;
}

public void setImage(Bitmap image)
{
    this.image = image;
}

public String getTitle()
{
    return title;
}

public void setTitle(String title)
{
    this.title = title;
}

}

【问题讨论】:

  • 如果所有公共汽车的座位对齐方式相同,只需使用四个垂直回收视图/列表视图,然后将它们对齐并制作一个单独的底部行,然后将其放置在布局的底部。希望对您有所帮助
  • 使用 GridLayout 而不是 GridView。这可能会对您有所帮助。

标签: android xml gridview layout android-recyclerview


【解决方案1】:

简单的逻辑是为中间列添加黑色值。

1) 如何为 GridLayoutManger 找到列数为 5 的中间列。

if (position % 5 == 2) {...}

条件为真,它是你的中间列。

2) 使用getItemViewType 标识添加空白视图或原始视图

@Override
    public int getItemViewType(int position) {
        return position % 5 == 2 ? 1 : 0;
    }

3) 最后一行不需要添加黑色视图,所以修改逻辑

// 0= Original view 1= Blank View
  @Override
            public int getItemViewType(int position) {
                if((getItemCount()-(position-1))<5)
                return 0;
                else
                return position % 5 == 2 ? 1 : 0;
            }

4) 在onCreateViewHolder中使用ViewType

 @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (viewType == 1)
            return new ViewHolderBlank(inflater.inflate(R.layout.item_blank, parent, false));
        else
            return new ViewHolderOriginal(inflater.inflate(R.layout.item_add_orignal, parent, false));
}

5) 检查onBindViewHolder中的viewHolder类型并执行逻辑

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    if (holder instanceof ViewHolderBlank) {

    } else if (holder instanceof ViewHolderOriginal) {

    }
}

6) 添加我们已删除的额外项目作为空白视图

 @Override
    public int getItemCount() {
        return totalItemList.size()+(totalItemList.size()/5);
    }

当你尝试访问totalItemList.get(position)时,你必须管理黑色条目,否则会导致异常

输出

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-23
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多