android - 在recyclerview中自动更改项目高度
问题描述
我在垂直回收器视图中使用水平回收器视图。在启动我的应用程序时,垂直recyclerview的item高度根据高度最高的textview进行拉伸(如图所示)。当我滚动到最后一项时,这个高度发生了变化。但是,当我滚动回第一项时,此高度尚未重置。
如何根据水平 recyclervew 中 textview 内容的高度设置垂直 recyclerview 高度。
下面是我的图片和代码
对不起我的英语不好。
VerticalRecyclerviewAdapter
@NonNull
@Override
public MenuViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_food_menu, null, false);
RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
view.setLayoutParams(lp);
return new MenuViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MenuViewHolder menuViewHolder, int i) {
Category category = menuArrayList.get(i).getCategory();
ArrayList<MenuItem> menuItemArrayList = (ArrayList<MenuItem>) menuArrayList.get(i).getMenuItems();
String headerMenu;
//Set text by language
if (LanguageUtils.getCurrentLanguage().getCode().equals(context.getString(R.string.language_japanese_code))) {
headerMenu = category.getNameJp();
} else {
headerMenu = category.getNameEn();
}
menuViewHolder.txtHeaderMenu.setText(context.getResources().getString(R.string.character_title_category) +" "+ headerMenu);
ItemRecyclerViewAdapter itemRecyclerViewAdapter = new ItemRecyclerViewAdapter(context, menuItemArrayList,this.mListener);
menuViewHolder.recyclerListFood.setHasFixedSize(true);
menuViewHolder.recyclerListFood.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false));
menuViewHolder.recyclerListFood.setAdapter(itemRecyclerViewAdapter);
}
@Override
public int getItemCount() {
return menuArrayList.size();
}
public class MenuViewHolder extends RecyclerView.ViewHolder {
protected TextView txtHeaderMenu;
protected RecyclerView recyclerListFood;
public MenuViewHolder(@NonNull View itemView) {
super(itemView);
this.txtHeaderMenu = itemView.findViewById(R.id.txtHeaderMenu);
this.recyclerListFood = itemView.findViewById(R.id.recyclerListFood);
}
}
HorizontalRecyclerviewAdapter
@NonNull
@Override
public FoodRecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_food, null);
DisplayMetrics displaymetrics = new DisplayMetrics();
((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
//if you need three fix imageview in width
return new ItemRecyclerViewAdapter.FoodRecyclerViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull FoodRecyclerViewHolder itemRecyclerViewHolder, int i) {
MenuItem menuItem = this.menuItem.get(i);
final Item item = menuItem.getItem();
String name;
String price = Utils.priceAndTaxToString(item.getPrice(), item.getTax());
String tax = Utils.getTaxToString(item.getTax());
//Set text with language
if (LanguageUtils.getCurrentLanguage().getCode().equals(context.getString(R.string.language_japanese_code))) {
name = item.getNameJp();
} else {
name = item.getNameEn();
}
itemRecyclerViewHolder.txtItemName.setText(name);
itemRecyclerViewHolder.txtItemPrice.setText(Utils.increaseFontSizeForPath(price,tax,0.75f));
String imgPath = item.getImg();
try {
RequestOptions options = new RequestOptions()
.fitCenter()
.placeholder(R.drawable.ic_no_image)
.error(R.drawable.ic_no_image)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.priority(Priority.HIGH);
Glide.with(context)
.load(FileUtil.getUrlImgFile(context, imgPath))
.apply(options)
.into(itemRecyclerViewHolder.imItem);
} catch (Exception e) {
itemRecyclerViewHolder.imItem.setImageResource(R.drawable.ic_no_image);
}
itemRecyclerViewHolder.onItemClickListener(new FoodRecyclerViewHolder.OnItemClickListener() {
@Override
public void onClick(View view, int position) {
OrderDialog orderDialog = new OrderDialog(context, item, mListener);
orderDialog.show();
}
});
}
@Override
public int getItemCount() {
return menuItem.size();
}
public static class FoodRecyclerViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
protected ImageView imItem;
protected TextView txtItemName;
protected TextView txtItemPrice;
private OnItemClickListener onItemClickListener;
public FoodRecyclerViewHolder(@NonNull View itemView) {
super(itemView);
this.txtItemName = itemView.findViewById(R.id.txtItemName);
this.txtItemPrice = itemView.findViewById(R.id.txtItemPrice);
this.imItem = itemView.findViewById(R.id.imItem);
itemView.setOnClickListener(this);
}
public void onItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
@Override
public void onClick(View v) {
onItemClickListener.onClick(v, getAdapterPosition());
}
public interface OnItemClickListener {
void onClick(View view, int position);
}
}
解决方案
无效 setHasFixedSize(布尔 hasFixedSize)。如果 RecyclerView 可以提前知道 RecyclerView 的大小不受适配器内容的影响,则 RecyclerView 可以进行多种优化。RecyclerView 仍然可以根据其他因素(例如其父级的大小)更改其大小,但此大小计算不能取决于其子级的大小或其适配器的内容(适配器中的项目数除外)。如果您使用的 RecyclerView 属于此类,请将其设置为 true。它将允许 RecyclerView 在其适配器内容更改时避免使整个布局无效。
所以你应该RecyclerView.setHasFixedSize(false);
在你的情况下使用。你的代码应该是menuViewHolder.recyclerListFood.setHasFixedSize(false);
推荐阅读
- html - 使用 HTML 和 CSS,是否可以创建如下所示的行
- performance - Powershell使用公共属性合并两个数组的最快方法?
- homebrew - gcloud init 错误:gcloud 崩溃(AttributeError):“凭据”对象没有属性“quota_project_id”
- google-chrome - chrome 浏览器中的网站审核显示不同设备的不同结果
- sublimetext3 - Sublime 3 高亮问题
- vue.js - 如何使用 Vue 检测浏览器后退按钮?
- sql - Azure Synapse - 检索插入的行标识值
- react-native - 活动指示器不包含 React-Native 上的标头
- python - Python Tkinter,如何同步多个闪烁的小部件?
- python - 如果使用 jinja 匹配,则从列表创建列表