【问题标题】:Android - how to change Recyclerview height dynamically?Android - 如何动态更改 Recyclerview 高度?
【发布时间】:2019-09-30 05:07:12
【问题描述】:

我遇到了一个关于根据其总物品更改 Recycler 高度的问题。 我尝试过的是像这样使用布局参数:

        ViewGroup.LayoutParams params = myRecyclerView.getLayoutParams();
        params.height = itemHeight * numberOfItem;
        myRecyclerView.requestLayout();

       ViewGroup.LayoutParams params = new  RecyclerView.LayoutParams(..WRAP_CONTENT, ...WRAP_CONTENT);;
       params.height = itemHeight * numberOfItem;
       myRecyclerView..setLayoutParams(params);

但它没有用。 我该怎么做 ?请帮帮我!

【问题讨论】:

  • 是的,我忘了注意这一点。原因是我想在 scoolview 中使用多回收视图。而且,如果我将任何 recyclerview 的高度设置为 wrapcontent,它将占用整个空间,但是当我为 ex 设置固定高度(如 100dp)时它会起作用。所以,我正在寻找动态改变 recyclerview 高度的方法。
  • 事实上,我的应用程序有一个允许用户输入数据的表单,他可以通过点击“+”按钮添加任意数量的新表单。所以,我正在尝试这样一种方式,当他点击“+”按钮时,我将向 recyclerview 添加一个项目,这样我就可以通过 recyclerview 控制一切。这时候,为了节省时间,我选择了另一种方式来做,但仍然想知道如何做到这一点。也许还有很多人想知道。
  • 我被困住了,然后意识到高度是以像素为单位设置的。要在dp中设置,我们需要将高度转换为dp - (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, heightInPixels, getResources().getDisplayMetrics());

标签: android android-recyclerview


【解决方案1】:

您应该在 setLayoutParams(params) 中使用父视图的 LayoutParams。

例如:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    >
    <android.support.v7.widget.RecyclerView
        android:id="@+id/images"
        android:layout_width="wrap_content"
        android:layout_height="360dp"
        >
    </android.support.v7.widget.RecyclerView>
 </Relativelayout>

更改代码中的 LayoutParams。

  RelativeLayout.LayoutParams lp =
            new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, 500);
 recyclerView.setLayoutParams(lp);

【讨论】:

  • 我只是将 Linearlayout 更改为 Relative 然后它自动驻留。
【解决方案2】:

我试过这个。有效。可能会有所帮助。

@Override
public void onBindViewHolder(FeedListRowHolder feedListRowHolder, int i) {

    //this change height of rcv
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
     params.height =80; //height recycleviewer
     feedListRowHolder.itemView.setLayoutParams(params);

    FeedItem feedItem = feedItemList.get(i);

    Picasso.with(mContext).load(feedItem.getThumbnail())
            .error(R.drawable.placeholder)
            .placeholder(R.drawable.placeholder)
            .into(feedListRowHolder.thumbnail);

    feedListRowHolder.title.setText(Html.fromHtml(feedItem.getTitle()));
    feedListRowHolder.itemView.setActivated(selectedItems.get(i, false));

    feedListRowHolder.setClickListener(new FeedListRowHolder.ClickListener() {
        public void onClick(View v, int pos, boolean isLongClick) {
            if (isLongClick) {

                // View v at position pos is long-clicked.
                String poslx = pos + "";
                Toast.makeText(mContext, "longclick " + poslx, Toast.LENGTH_SHORT).show();

            } else {
                // View v at position pos is clicked.
                String possx = pos + "";
                Toast.makeText(mContext, "shortclick " + possx, Toast.LENGTH_SHORT).show();
                toggleSelection(pos);
            }
        }
    });

}

【讨论】:

  • 查看您的代码,您似乎试图更改回收站视图中每个项目的高度。但我想改变 recyclerview 的高度。
  • 你写 params.height = itemHeight * numberOfItem;当您知道项目数时,您可以设置 recycleviewer 的高度。但是您可能希望将项目的固定高度设置为 recycleviewer 的高度。
【解决方案3】:

如果您只是希望您的回收站视图根据项目数量自动调整大小,那么为什么不将 RecyclerView 高度设置为 wrap_content。

如果布局中有多个 ScrollView,请尝试将 RecyclerView 包装在 NestScrollView 中,并将其高度设置为 wrap_content。

代码:

<android.support.v7.widget.RecyclerView
                android:id="@+id/recyclerView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                />

【讨论】:

    【解决方案4】:

    虽然这个问题是很久以前提出的,但我想有些人可能会觉得这个答案很有帮助。

    我有一个带适配器的 RecyclerView。高度在适配器的onBindViewHolder 方法中设置:

    布局:

      <android.support.v7.widget.RecyclerView
      android:id="@+id/container"
      ...
      android:layout_width="match_parent"
      android:layout_height="wrap_content"/>
    

    适配器:

    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    
    public abstract static class ViewHolder extends RecyclerView.ViewHolder {
         public ViewHolder(View itemView) {
            super(itemView);
        }
        public abstract void setFixedHeight();
    }
    
    @Override
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
    
        return new ViewHolder(view) {
    
            @Override
            public void setFixedHeight() {
                //  magic happening here
                ViewGroup.LayoutParams parentParams = parent.getLayoutParams();
                parentParams.height =
                    ((RecyclerView) parent).computeVerticalScrollRange()
                        + parent.getPaddingTop()
                        + parent.getPaddingBottom();
                parent.setLayoutParams(parentParams);
            }
        }; 
    }
    
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.setFixedHeight();
        }
    
    // other methods here
    }
    

    设置适配器:

    recyclerView.setAdapter(new MyAdapter(...));

    注意:水平滚动使用((RecyclerView) parent).computeHorizontalScrollRange()

    【讨论】:

      【解决方案5】:

      我确信这段代码有效

      ViewGroup.LayoutParams params=recyclerview.getLayoutParams();
      params.height=100;
      recyclerview.setLayoutParams(params);
      

      您可以做的另一件事是将线性布局作为回收器视图的父级,然后动态增加父级视图的高度

      考虑下面的 XML

      <LinearLayout 
            android:id="@+id/yourLayoutId">
      
          <RecyclerView android:width="match_parent" android:height="wrap_content">
          </RecyclerView>
      
      </LinearLayout
      

      考虑下面的代码

      LinearLayout layout = (LinearLayout)findViewById(R.id.yourLayoutId);
      LinearLayout.LayoutParams lp = (LayoutParams) layout.getLayoutParams();
      lp.height = 100;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-29
        • 2014-06-02
        • 1970-01-01
        相关资源
        最近更新 更多