Android - как динамически менять высоту Recyclerview?

У меня возникла проблема с изменением высоты ресайклеров на основе его общих элементов. Я попытался использовать Layout Param следующим образом:

        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);

Но это не сработало. Как мне это сделать? Пожалуйста, помогите мне!

Ответ 1

Вы должны использовать LayoutParams родительского представления в setLayoutParams (params).

Например:

<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);

Ответ 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);
            }
        }
    });

}

Ответ 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"/>

Adapter:

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;