使用带有RecyclerView的GridLayoutManager时,单元格没有达到所需的高度

时间:2018-05-27 11:21:42

标签: java android android-recyclerview picasso gridlayoutmanager

我创建了RecyclerView(在片段中),我在其中使用GridLayoutManager动态添加项目。在RecyclerView的每个单元格中,我使用Picasso从服务器加载图像。 现在的问题是,当第一次加载图像时,RecyclerView单元格会出现奇怪的高度,如下所示:

enter image description here

但是当我更改标签并再次进入主页标签时,一切都是我想要的方式,如下所示:

enter image description here

我需要的是,让细胞在添加到回收者视图时获得所需的宽度和高度。为此,我尝试过:

  1. 获取屏幕宽度并设置单元格'高度和宽度=屏幕尺寸/ 2.
  2. RecyclerView的宽度并制作单元格'宽度和高度等于它的一半。
  3. 我正在为适配器的onCreateViewHolder方法中的单元格分配维度。
  4. 但无论如何,我需要更改标签(再次加载片段)以使单元格具有所需的高度。

    我已将布局文件中单元格的宽度和高度指定为换行内容,因为我希望它们根据屏幕大小进行设置。我不想硬编码任何价值。

    我做错了什么?我错过了什么吗?

    详细说明,代码如下:

    单元格布局文件:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/category_item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:background="@android:color/darker_gray"
        android:orientation="vertical"
        android:weightSum="1">
    
        <ImageView
            android:id="@+id/categoryImage"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_marginLeft="40dp"
            android:layout_marginRight="40dp"
            android:layout_marginTop="0dp"
            android:layout_weight="0.8"
            android:src="@drawable/icon" />
    
        <TextView
            android:id="@+id/categoryName"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_marginBottom="5dp"
            android:layout_marginTop="0dp"
            android:layout_weight="0.2"
            android:text="ORAL CARE"
            android:textAlignment="center"
            android:textColor="@android:color/black"
            android:textSize="15dp" />
    
    </LinearLayout> 
    
    片段布局文件中的

    RecyclerView

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerViewCategories"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView11" />
    

    RecyclerView适配器:

    public class CategoryRecyclerViewAdapter extends RecyclerView.Adapter<CategoryRecyclerViewAdapter.ViewHolder> {
        private List<MedicineCategoryDataModel> categoryData = new ArrayList<MedicineCategoryDataModel>();
        private LayoutInflater layoutInflater;
        private ItemClickListener itemClickListener;
        private Context context;
        private int itemWidth;
    
        public CategoryRecyclerViewAdapter(Context context, List<MedicineCategoryDataModel> data, int width) {
            this.layoutInflater = LayoutInflater.from(context);
            this.categoryData = data;
            this.context = context;
        }
    
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = layoutInflater.inflate(R.layout.layout_category_item, parent, false);
    //        this is the point where I was trying to set cell's width and height. 
            return new ViewHolder(view);
        }
    
        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            String categoryName = categoryData.get(position).categoryName;
            holder.textViewCategoryName.setText(categoryName);
            String iconUrl = categoryData.get(position).iconUrl;
            EPClientLayer.getInstance().getImageHandler().loadImage(context,iconUrl, holder.imageViewCategoryIcon);
        }
    
        @Override
        public int getItemCount() {
            return categoryData.size();
        }
    
        public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
            TextView textViewCategoryName;
            ImageView imageViewCategoryIcon;
    
            ViewHolder(View itemView) {
                super(itemView);
                textViewCategoryName = (TextView) itemView.findViewById(R.id.categoryName);
                imageViewCategoryIcon = (ImageView) itemView.findViewById(R.id.categoryImage);
                itemView.setOnClickListener(this);
            }
    
            @Override
            public void onClick(View view) {
                if (itemClickListener != null) itemClickListener.onItemClick(view, getAdapterPosition());
            }
        }
    
        public String getItem(int id) {
            return categoryData.get(id).categoryName;
        }
    
        public void setClickListener(ItemClickListener itemClickListener) {
            this.itemClickListener = itemClickListener;
        }
    
        public interface ItemClickListener {
            void onItemClick(View view, int position);
        }
    }
    

2 个答案:

答案 0 :(得分:0)

我认为您需要将单元格项height的{​​{1}}设置为ImageView,而不是在提取wrap_content时提供高度0dp。我想建议您实现这样的单元格项目。

weightSum

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/category_item" android:layout_width="match_parent" android:layout_height="260dp" android:background="@android:color/darker_gray"> <ImageView android:id="@+id/categoryImage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:src="@drawable/icon" /> <TextView android:id="@+id/categoryName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/categoryImage" android:layout_centerHorizontal="true" android:layout_marginTop="16dp" android:text="ORAL CARE" android:textColor="@android:color/black" android:textSize="15sp" /> </RelativeLayout> 将高度和宽度设置为RecyclerView

match_parent

你不想硬编码任何高度,这很好。但是,我认为您可能会考虑对单元格项目<android.support.v7.widget.RecyclerView android:id="@+id/recyclerViewCategories" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="8dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView11" /> 的优化高度进行硬编码,以在所有屏幕尺寸中获得所需的行为。

答案 1 :(得分:0)

将SquareImageView设为:

>>> uc2, ic2 = merge_unique(ua, ia, ub, ib)
>>> np.all(uc2 == uc)
True
>>> np.all(ic2 == ic)
True

在recyclerView项目中使用上面的imageView以使用Piccasa加载图像。

在xml中使用recyclelerView:

uacc, iacc = np.unique(subarr1, return_inverse=True)
ui, ii = np.unique(subarr2, return_inverse=True)
uacc, iacc = merge_unique(uacc, iacc, ui, ii)
ui, ii = np.unique(subarr3, return_inverse=True)
uacc, iacc = merge_unique(uacc, iacc, ui, ii)
ui, ii = np.unique(subarr4, return_inverse=True)
uacc, iacc = merge_unique(uacc, iacc, ui, ii)
................................ (etc.)

让我知道这是否可以解决您的问题