gpt4 book ai didi

android - 使用 GridLayoutManager 将项目粘贴到 RecyclerView 的底部

转载 作者:行者123 更新时间:2023-12-05 00:03:00 28 4
gpt4 key购买 nike

我想要一个RecyclerView默认情况下,它确实从左到右和从上到下对其项目进行排序。但另外我想遵循如下图右侧的特殊行为。
enter image description here
我希望项目“作为一个整体”粘在底部,就好像 RecyclerView如果项目不超过RecyclerViews,它本身会调整其大小以包裹其内容。高度 - 使用拇指更好地访问搜索结果。我无法通过 LayoutManager::reverseLayout 的组合获得这种行为和 RecyclerView::layoutDirectionwrap_content对于RecyclerView并且将它粘在底部也不起作用,因为我希望整个列表区域都是可滚动的(RecyclerView 必须保持其完整大小)-有什么想法可以实现这种行为吗?

最佳答案

要实现此行为以将所有项目对齐到 RecyclerView 的底部,您需要设置标志 setStackFromEnd(true)

When stack from bottom is set to true, the list fills its contentstarting from the bottom of the view


但是 GridLayout 不支持此标志,引发异常,例如:

GridLayoutManager does not support stack from end. Consider usingreverse layout


但即使使用 setReverseLayout(true)在 GridLayoutManager 中,它从下到上和从左到右呈现项目,这不是您想要的结果,甚至可以反转列表的数据。
可能的解决方案:
  • 使用 GridLayoutManager 并仅将顶部填充添加到第一列以填充剩余的顶部区域,甚至使用虚拟的空列。
  • 使用带有 setStackFromEnd(true) 的 LinearLayout它按预期工作,其中每个项目从 RecyclerView 的底部到顶部呈现,并且每个项目行(项目 View )持有例如:4 个 View (列数),宽度相等。当然,以这种方式,列表中的每个 Item 模型必须为每列保存 4 个数据。

  • 如果您选择第二个选项,您可以为每一行准备列数据,如下面的代码 fragment :
    List<ItemModel> data = new ArrayList<>();
    int listCnt = 14;
    for(int i=0; i<listCnt; i++){
    if(i%4 == 0) {
    String dataCol1 = i < listCnt ? String.valueOf(i) : "";
    String dataCol2 = (i + 1) < listCnt ? String.valueOf(i + 1) : "";
    String dataCol3 = (i + 2) < listCnt ? String.valueOf(i + 2) : "";
    String dataCol4 = (i + 3) < listCnt ? String.valueOf(i + 3) : "";
    data.add(new ItemModel(dataCol1, dataCol2, dataCol3, dataCol4));
    }
    }

    //set LinearLayoutManager
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, RecyclerView.VERTICAL, false);
    linearLayoutManager.setStackFromEnd(true);
    recyclerView.setLayoutManager(linearLayoutManager);

    //set adapter
    RecyclerViewAdapter adapter = new RecyclerViewAdapter(data);
    recyclerView.setAdapter(adapter);
    其中 ItemModel 保存每一行的数据,例如:
    public class ItemModel {

    public String dataCol1="", dataCol2="", dataCol3="", dataCol4="";

    public ItemModel(String dataCol1, String dataCol2, String dataCol3, String dataCol4) {
    this.dataCol1 = dataCol1;
    this.dataCol2 = dataCol2;
    this.dataCol3 = dataCol3;
    this.dataCol4 = dataCol4;
    }
    }
    当然,在您的适配器中,您必须将列 Visibility 设置为 View.INVISIBLE对于那些没有任何数据和 View.VISIBLE的人对于那些拥有的人。
    适配器示例如下:
    public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{

    private List<ItemModel> mData;

    public RecyclerViewAdapter(List<ItemModel> data) {
    this.mData = data;
    }

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

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    ItemModel itemModel = mData.get(position);
    if(holder instanceof ItemViewHolder) {
    ((ItemViewHolder) holder).bind(itemModel);
    }
    }

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

    public class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    public TextView itemTextView1, itemTextView2, itemTextView3, itemTextView4;

    public ItemViewHolder(View itemView) {
    super(itemView);
    itemTextView1 = itemView.findViewById(R.id.itemTextView1);
    itemTextView2 = itemView.findViewById(R.id.itemTextView2);
    itemTextView3 = itemView.findViewById(R.id.itemTextView3);
    itemTextView4 = itemView.findViewById(R.id.itemTextView4);

    itemTextView1.setOnClickListener(this);
    itemTextView2.setOnClickListener(this);
    itemTextView3.setOnClickListener(this);
    itemTextView4.setOnClickListener(this);
    }

    public void bind(ItemModel itemModel){
    itemTextView1.setText(itemModel.dataCol1);
    itemTextView2.setText(itemModel.dataCol2);
    itemTextView3.setText(itemModel.dataCol3);
    itemTextView4.setText(itemModel.dataCol4);

    itemTextView1.setVisibility(TextUtils.isEmpty(itemModel.dataCol1) ? View.INVISIBLE : View.VISIBLE);
    itemTextView2.setVisibility(TextUtils.isEmpty(itemModel.dataCol2) ? View.INVISIBLE : View.VISIBLE);
    itemTextView3.setVisibility(TextUtils.isEmpty(itemModel.dataCol3) ? View.INVISIBLE : View.VISIBLE);
    itemTextView4.setVisibility(TextUtils.isEmpty(itemModel.dataCol4) ? View.INVISIBLE : View.VISIBLE);
    }

    @Override
    public void onClick(View v) {
    int cId = v.getId();
    if(cId == itemTextView1.getId()){
    //get col1 data
    String dataCol1 = mData.get(getAdapterPosition()).dataCol1;
    }
    else if(cId == itemTextView2.getId()){
    //get col2 data
    String dataCol2 = mData.get(getAdapterPosition()).dataCol2;
    }
    else if(cId == itemTextView3.getId()){
    //get col3 data
    String dataCol3 = mData.get(getAdapterPosition()).dataCol3;
    }
    else if(cId == itemTextView4.getId()){
    //get col4 data
    String dataCol4 = mData.get(getAdapterPosition()).dataCol4;
    }
    }
    }
    }
    列表项 R.layout.item_list_row它拥有 4 列 View ,如下所示:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:orientation="horizontal">

    <TextView
    android:id="@+id/itemTextView1"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:gravity="center"
    android:layout_weight="1"
    android:background="@android:color/holo_blue_light"
    android:textColor="@android:color/black"
    tools:text="1"/>

    <TextView
    android:id="@+id/itemTextView2"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:gravity="center"
    android:layout_weight="1"
    android:background="@android:color/holo_blue_light"
    android:textColor="@android:color/black"
    tools:text="2"/>

    <TextView
    android:id="@+id/itemTextView3"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:gravity="center"
    android:layout_weight="1"
    android:background="@android:color/holo_blue_light"
    android:textColor="@android:color/black"
    tools:text="3"/>

    <TextView
    android:id="@+id/itemTextView4"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:gravity="center"
    android:layout_weight="1"
    android:background="@android:color/holo_blue_light"
    android:textColor="@android:color/black"
    tools:text="4"/>

    </LinearLayout>
    当然,如果您有不同的跨度计数,您可以在 RecyclerView Adapter 中创建不同的 ViewHolder 类型。
    RecyclerView 高度为 match_parent 的选项 2 的结果, 300dpwrap_content分别如下所示。 RecyclerView 具有灰色背景:
    match_parent
    300dp
    wrap_content

    关于android - 使用 GridLayoutManager 将项目粘贴到 RecyclerView 的底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67764347/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com