当前位置: 代码迷 >> java >> 以编程方式在卡片项目内设置textview属性会导致随机卡片修改
  详细解决方案

以编程方式在卡片项目内设置textview属性会导致随机卡片修改

热度:43   发布时间:2023-07-31 11:11:20.0

我的目标是以编程方式更改某些Cardview中Textview项目的文本大小,这些项目包含在recyclerview中。 我成功地做到了这一点,具有不寻常的副作用。 然后会发生的是,尽管已经成功修改了正确的cardviews'textview的属性,但现在修改了不应被修改的随机卡。 然而,随着用户滚动越来越多的Recyclerview,两个方向,越来越多的卡被修改。 最终,从一些随机卡(除了我的请求卡)开始,导致所有调用被修改。

一个更好的例子:假设我有5张卡片,我想在包含50张卡片的Recyclerview中将文字大小更改为其他内容。 现在,这些卡片以及其他一些随机卡片现在都有大文字。 其余的仍然很小。 当用户向上和向下滚动时,越来越多的卡被设置为具有大文本,直到所有卡都具有大文本。

我的代码是如何工作的,我有一个类ListAdapter ,它扩展了RecyclerView.Adapter<ListAdapter.VersionViewHolder> 由于我从数据库中收集对象,因此我使用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);
    }

}

我在子类GradesListAdapter中设置了ActivitiesListActivitiesSubListActivitiesSubList2ActivitiesIDActivitiesTag ,扩展了ListAdapter

应该注意的是ActivitiesTag Arraylist。 当我希望将值添加为大时,我只需将任何非空值插入到arraylist中。 否则,我添加一个空字符串。 因此,为了它很大,它必须成功地满足标准。 (另一方面,有没有办法改进这种方法?)在测试中,似乎只有位置正确的卡被设置得很大,但是它也会影响未标记的卡。

这是VersionViewHolder类:

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

我该怎么做才能消除这种意想不到的副作用? 我相信我拥有其他人需要的所有数据来帮助调试这个,但是如果我错过了什么,请说出来; 我还是StackOverflow的新手。

谢谢你的阅读。

在你的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子句,则由于此视图会一次又一次地重复使用,因此文本大小不会重置为正常。 因此,您必须手动重置文本大小。

  相关解决方案