以编程方式设置卡片项目内的 textview 属性会导致随机卡片修改
Programmatically setting textview properties inside a card item leads to random card modifications
我的目标是以编程方式更改某些 Cardview 中 Textview 项目的文本大小,这些 Cardview 包含在 recyclerview 中。我成功地做到了这一点,但有一个不寻常的副作用。然后发生的是,虽然正确的卡片视图的文本视图的属性已被成功修改,但现在修改了不应修改的随机卡片。然而,随着用户滚动浏览越来越多的 recyclerview,两个方向,越来越多的卡片被修改。最终,从几张随机卡片(除了我的请求卡片)开始导致所有调用都被修改。
一个更好的例子:假设我有 5 张卡片,我想在包含 50 张卡片的 recyclerview 中将文本大小更改为其他内容。现在,那些卡片以及其他一些随机卡片现在都有大文字。其余的仍然很小。随着用户上下滚动,越来越多的卡片被设置为大文本,直到所有卡片都有大文本。
我的代码是如何工作的,我有一个扩展 RecyclerView.Adapter<ListAdapter.VersionViewHolder>
的 class、ListAdapter
。由于我从数据库中收集 objects,因此我使用 arraylists 来收集我的信息,并以编程方式将它们添加进去,如图所示:
@Override
public void onBindViewHolder(VersionViewHolder versionViewHolder, int i) {
if (ActivitiesList.size() != 0)
versionViewHolder.title.setText(ActivitiesList.get(i));
if (ActivitiesSubList.size() != 0)
versionViewHolder.subTitle.setText(ActivitiesSubList.get(i));
if (ActivitiesSubList2.size() != 0)
versionViewHolder.subTitle2.setText(ActivitiesSubList2.get(i));
if (ActivitiesID.size() != 0)
versionViewHolder.id.setText(ActivitiesID.get(i));
// TODO: POST QUESTION ON STACK OVERFLOW
if (!ActivitiesTag.get(i).equals("")) {
Log.d("CardPos", Integer.toString(versionViewHolder.getAdapterPosition()));
versionViewHolder.title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 56);
}
}
我在 child class GradesListAdapter
扩展了 ListAdapter
.
需要注意的是ActivitiesTag
Arraylist。当我希望添加一个较大的值时,我只需将任何 non-empty 值插入数组列表即可。否则,我添加一个空字符串。因此,要使其变大,就必须成功满足标准。 (附带一提,有什么方法可以改进这种方法吗?)在测试中,似乎只有位置正确的卡片被设置为大,但它也会影响 non-tagged 张卡片。
这里是 VersionViewHolder
class:
class VersionViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
CardView cardItemLayout;
TextView title;
TextView subTitle;
TextView subTitle2;
TextView id;
public VersionViewHolder(View itemView) {
super(itemView);
cardItemLayout = (CardView) itemView.findViewById(R.id.grades_item);
title = (TextView) itemView.findViewById(R.id.listitem_name);
subTitle = (TextView) itemView.findViewById(R.id.listitem_subname);
subTitle2 = (TextView) itemView.findViewById(R.id.listitem_subname2);
id = (TextView) itemView.findViewById(R.id.listitem_id);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
clickListener.onItemClick(v, getAdapterPosition());
}
}
我该怎么做才能消除这种意外的副作用?我相信我拥有其他人帮助调试它所需的所有数据,但如果我遗漏了什么,请说出来;我对 Whosebug 还是很陌生。
感谢您的阅读。
在您的 onbindViewHolder 中,更改
if (!ActivitiesTag.get(i).equals("")) {
Log.d("CardPos", Integer.toString(versionViewHolder.getAdapterPosition()));
versionViewHolder.title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 56);
}
到
if (!ActivitiesTag.get(i).equals("")) {
Log.d("CardPos", Integer.toString(versionViewHolder.getAdapterPosition()));
versionViewHolder.title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 56);
}else{
versionViewHolder.title.setTextSize(TypedValue.COMPLEX_UNIT_SP,"Your Original Text Size");
}
如果您在viewholder 中只设置了一个if 子句而没有设置else 子句,由于这个视图被反复使用,您的文本大小将不会重置为正常大小。因此,您必须手动重置文字大小。
我的目标是以编程方式更改某些 Cardview 中 Textview 项目的文本大小,这些 Cardview 包含在 recyclerview 中。我成功地做到了这一点,但有一个不寻常的副作用。然后发生的是,虽然正确的卡片视图的文本视图的属性已被成功修改,但现在修改了不应修改的随机卡片。然而,随着用户滚动浏览越来越多的 recyclerview,两个方向,越来越多的卡片被修改。最终,从几张随机卡片(除了我的请求卡片)开始导致所有调用都被修改。
一个更好的例子:假设我有 5 张卡片,我想在包含 50 张卡片的 recyclerview 中将文本大小更改为其他内容。现在,那些卡片以及其他一些随机卡片现在都有大文字。其余的仍然很小。随着用户上下滚动,越来越多的卡片被设置为大文本,直到所有卡片都有大文本。
我的代码是如何工作的,我有一个扩展 RecyclerView.Adapter<ListAdapter.VersionViewHolder>
的 class、ListAdapter
。由于我从数据库中收集 objects,因此我使用 arraylists 来收集我的信息,并以编程方式将它们添加进去,如图所示:
@Override
public void onBindViewHolder(VersionViewHolder versionViewHolder, int i) {
if (ActivitiesList.size() != 0)
versionViewHolder.title.setText(ActivitiesList.get(i));
if (ActivitiesSubList.size() != 0)
versionViewHolder.subTitle.setText(ActivitiesSubList.get(i));
if (ActivitiesSubList2.size() != 0)
versionViewHolder.subTitle2.setText(ActivitiesSubList2.get(i));
if (ActivitiesID.size() != 0)
versionViewHolder.id.setText(ActivitiesID.get(i));
// TODO: POST QUESTION ON STACK OVERFLOW
if (!ActivitiesTag.get(i).equals("")) {
Log.d("CardPos", Integer.toString(versionViewHolder.getAdapterPosition()));
versionViewHolder.title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 56);
}
}
我在 child class GradesListAdapter
扩展了 ListAdapter
.
需要注意的是ActivitiesTag
Arraylist。当我希望添加一个较大的值时,我只需将任何 non-empty 值插入数组列表即可。否则,我添加一个空字符串。因此,要使其变大,就必须成功满足标准。 (附带一提,有什么方法可以改进这种方法吗?)在测试中,似乎只有位置正确的卡片被设置为大,但它也会影响 non-tagged 张卡片。
这里是 VersionViewHolder
class:
class VersionViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
CardView cardItemLayout;
TextView title;
TextView subTitle;
TextView subTitle2;
TextView id;
public VersionViewHolder(View itemView) {
super(itemView);
cardItemLayout = (CardView) itemView.findViewById(R.id.grades_item);
title = (TextView) itemView.findViewById(R.id.listitem_name);
subTitle = (TextView) itemView.findViewById(R.id.listitem_subname);
subTitle2 = (TextView) itemView.findViewById(R.id.listitem_subname2);
id = (TextView) itemView.findViewById(R.id.listitem_id);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
clickListener.onItemClick(v, getAdapterPosition());
}
}
我该怎么做才能消除这种意外的副作用?我相信我拥有其他人帮助调试它所需的所有数据,但如果我遗漏了什么,请说出来;我对 Whosebug 还是很陌生。
感谢您的阅读。
在您的 onbindViewHolder 中,更改
if (!ActivitiesTag.get(i).equals("")) {
Log.d("CardPos", Integer.toString(versionViewHolder.getAdapterPosition()));
versionViewHolder.title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 56);
}
到
if (!ActivitiesTag.get(i).equals("")) {
Log.d("CardPos", Integer.toString(versionViewHolder.getAdapterPosition()));
versionViewHolder.title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 56);
}else{
versionViewHolder.title.setTextSize(TypedValue.COMPLEX_UNIT_SP,"Your Original Text Size");
}
如果您在viewholder 中只设置了一个if 子句而没有设置else 子句,由于这个视图被反复使用,您的文本大小将不会重置为正常大小。因此,您必须手动重置文字大小。