我创建了RecyclerView
(在片段中),我在其中使用GridLayoutManager
动态添加项目。在RecyclerView
的每个单元格中,我使用Picasso从服务器加载图像。
现在的问题是,当第一次加载图像时,RecyclerView
单元格会出现奇怪的高度,如下所示:
但是当我更改标签并再次进入主页标签时,一切都是我想要的方式,如下所示:
我需要的是,让细胞在添加到回收者视图时获得所需的宽度和高度。为此,我尝试过:
RecyclerView
的宽度并制作单元格'宽度和高度等于它的一半。 onCreateViewHolder
方法中的单元格分配维度。 但无论如何,我需要更改标签(再次加载片段)以使单元格具有所需的高度。
我已将布局文件中单元格的宽度和高度指定为换行内容,因为我希望它们根据屏幕大小进行设置。我不想硬编码任何价值。
我做错了什么?我错过了什么吗?
详细说明,代码如下:
单元格布局文件:
<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);
}
}
答案 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.)
让我知道这是否可以解决您的问题