【发布时间】:2021-07-27 12:41:04
【问题描述】:
我有一个水平回收视图和适配器,在该图像内,然后在标题下方,然后在下方描述。现在所有元素的图像和标题长度几乎相同,但描述可能会有所不同。所有数据均来自 API。
现在我要做的是,我想设置所有 textview-description 元素的高度,其中描述长度的数量最多。
类似这个问题:How to set recycler height to highest item in recyclerView?
但我的问题是 diff,我只是在谈论 desc textview 而不是整个 recycleeview。
请注意:由于 desc 较小,可以在空白区域下方显示一个 cardview,但请确保 desc 应覆盖在具有最长字符串长度的 cardview 中。
代码:
public class RecommendationAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final int VIEW_TYPE = 1;
private final Context mContext;
private final ArrayList<Attributes> attributesArrayList;
private final Resources mResources;
private final BaseActivity baseActivity;
private final OnItemClickListener listener;
View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onViewItemClicked();
}
};
public RecommendationAdapter(Context mContext, ArrayList<BraAttributes> attributesArrayList, OnItemClickListener listener) {
this.mContext = mContext;
this.attributesArrayList = attributesArrayList;
mResources = mContext.getResources();
baseActivity = (BaseActivity) mContext;
this.listener = listener;
}
@NotNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NotNull ViewGroup parent, int viewType) {
View itemLayoutView;
if (viewType == VIEW_TYPE) {
itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.recommend_item_layout, null);
return new ChildViewHolderItem(itemLayoutView);
}
throw new RuntimeException("there is no type that matches the type " + viewType + " + make sure your using types correctly");
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewholder, int position) {
if (getItemViewType(position) == VIEW_TYPE) {
ChildViewHolderItem holder = (ChildViewHolderItem) viewholder;
final Attributes attributes = attributesArrayList.get(position);
holder.ctvTitle.setText(attributes.getName());
holder.ctvDescription.setText(attributes.getMessage());
setImage(attributes, holder);
}
}
private void findLargestString(ArrayList<attributes> attributesArrayList, CustomTextView textView) {
String res = "";
int largestString = attributesArrayList.get(0).getMessage().length();
for (int i = 0; i < attributesArrayList.size(); i++) {
if (attributesArrayList.get(i).getMessage().length() > largestString) {
largestString = attributesArrayList.get(i).getMessage().length();
res = attributesArrayList.get(i).getMessage();
}
}
LogUtils.d("Largest String: " + res);
setTextViewHeight(textView, res);
}
private void setImage(Attributes attributes, ChildViewHolderItem holder) {
if (attributes.getImage().length() > 0) {
Glide.with(holder.ivImage.getContext())
.load(IMAGE_SERVER_URL + "/medium.jpg")
.apply(new RequestOptions().error(R.drawable.default_load_image)
.placeholder(R.drawable.default_load_image))
.into(holder.ivImage);
}
}
private int getHeight(Context context, CharSequence text, int textSize, int deviceWidth, Typeface typeface, int padding) {
CustomTextView textView = new CustomTextView(context);
textView.setPadding(padding, 0, padding, 0);
textView.setTypeface(typeface);
textView.setText(text, TextView.BufferType.SPANNABLE);
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSize);
int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(deviceWidth, View.MeasureSpec.AT_MOST);
int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
textView.measure(widthMeasureSpec, heightMeasureSpec);
return textView.getMeasuredHeight();
}
private void setTextViewHeight(CustomTextView ctvDescription, String largestString) {
int deviceWidth;
WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics displayMetrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(displayMetrics);
deviceWidth = displayMetrics.widthPixels;
LogUtils.d("deviceWidth: " + deviceWidth); //1080
int padding = mContext.getResources().getDimensionPixelSize(R.dimen.dimen_15);
int height = getHeight(mContext, largestString,
mContext.getResources().getDimensionPixelSize(R.dimen.textsize_12),
deviceWidth, Typeface.DEFAULT, padding);
ctvDescription.setHeight(AppUtils.pxToDp(mContext, height));
}
@Override
public int getItemCount() {
return Math.max(attributesArrayList.size(), 0);
}
@Override
public int getItemViewType(int position) {
return VIEW_TYPE;
}
public class ChildViewHolderItem extends RecyclerView.ViewHolder {
@BindView(R.id.ivImage)
AppCompatImageView ivImage;
@BindView(R.id.ctvTitle)
CustomTextView ctvTitle;
@BindView(R.id.ctvDescription)
CustomTextView ctvDescription;
public ChildViewHolderItem(View v) {
super(v);
ButterKnife.bind(this, v);
v.setOnClickListener(onClickListener);
findLargestString(attributesArrayList, ctvDescription);
}
}
}
在上面的代码中,描述是从底部开始的!
【问题讨论】:
-
您的 Description textView 是否有最大行属性 Set ?我猜应该是因为你不能在 Recycler 视图项中显示 1000 行描述。如果是,那么您可以将
android:lines属性添加到您的TextView。 -
@ADM 我认为你没有明白我的意思。首先,没有设置最大属性,第二,我想显示完整的描述,第三,我不能给出包装内容,因为一个卡片视图会显示小而另一个卡片视图会因为描述长度而显示更大,它可能会有所不同。第 4 条描述线最多为 2-3 行。第五,我不想硬核尺寸,因为它适用于各种设备。我已经在我的问题中说过,我的问题类似于:stackoverflow.com/questions/57890199/…
-
我认为你最好设置一个默认大小并显示一些描述而不是全部。如果您添加了一个功能来调整所有视图的大小,那么您正在创建 unnessacry 运动。应该使用动作来吸引用户对重要事件的注意。
-
这种调整大小只会发生在较小的旧视图上,而不会发生在新视图上,因为它们将直接使用较大尺寸的视图,并且根本不会调整大小。我建议您至少尝试一次,如果您需要进一步的指导,请告诉我。
-
@ADM 请检查已编辑的问题,我添加了代码。
标签: android android-recyclerview adapter