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;