首页 > 解决方案 > 在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);
    }
}

Horizo​​ntalRecyclerviewAdapter

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

步骤1

第2步

第三步

标签: androidandroid-recyclerview

解决方案


根据文档:https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#setHasFixedSize(boolean)

无效 setHasFixedSize(布尔 hasFixedSize)。如果 RecyclerView 可以提前知道 RecyclerView 的大小不受适配器内容的影响,则 RecyclerView 可以进行多种优化。RecyclerView 仍然可以根据其他因素(例如其父级的大小)更改其大小,但此大小计算不能取决于其子级的大小或其适配器的内容(适配器中的项目数除外)。如果您使用的 RecyclerView 属于此类,请将其设置为 true。它将允许 RecyclerView 在其适配器内容更改时避免使整个布局无效。

所以你应该RecyclerView.setHasFixedSize(false);在你的情况下使用。你的代码应该是menuViewHolder.recyclerListFood.setHasFixedSize(false);


推荐阅读