【问题标题】:Android change TextView textSize on RecyclerView adapter from ActivityAndroid从Activity更改RecyclerView适配器上的TextView textSize
【发布时间】:2020-10-06 12:48:48
【问题描述】:

我正在尝试查找如何将我的 RecyclerView 适配器 textViewsActivity 更改,在我的活动中,我有两个小部件,例如 increment_text_sizedecrement_text_size,它们必须更改适配器文本视图,

为此,我在活动上创建了简单的监听器来管理它们:

活动:

public interface IonChangeBookContentTextSize {
    void incrementTextSize();

    void decrementTextSize();
}

public static void setIonChangeBookContentTextSize(IonChangeBookContentTextSize l) {
    ionChangeBookContentTextSize = l;
}

点击小部件后,我在适配器上使用此侦听器

活动:

@OnClick(R.id.decrement_text_size)
public void decrement_text_size(View view) {
    if (ionChangeBookContentTextSize != null) {
        ionChangeBookContentTextSize.decrementTextSize();
    }
}

@OnClick(R.id.increment_text_size)
public void increment_text_size(View view) {
    if (ionChangeBookContentTextSize != null) {
        ionChangeBookContentTextSize.incrementTextSize();
    }
}

现在在适配器中我正在使用这个监听器

public class ShowBookContentsAdapter extends RecyclerView.Adapter<ShowBookContentsAdapter.ShowBookContentsViewHolder> {
    private List<Contents> list;
    private Context        context;
    private static final int NOTE = 1;
    public static IonChangeBottomViewVisibility ionChangeBottomViewvisibility;
    private       ShowBookContentsViewHolder    holder;
    private       View                          view;

    public ShowBookContentsAdapter(List<Contents> items, Context mContext, IonChangeBottomViewVisibility mOnChangeBottomViewVisibility) {
        list = items;
        context = mContext;
        ionChangeBottomViewvisibility = mOnChangeBottomViewVisibility;
    }

    @Override
    public ShowBookContentsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        int layout = -1;
        switch (viewType) {
            case 0:
                layout = R.layout.item_book_content_paragraph;
                break;
            case 1:
                layout = R.layout.item_book_content_heading_one;
                break;
        }

        view = LayoutInflater.from(parent.getContext()).inflate(layout, parent, false);
        holder = new ShowBookContentsViewHolder(view);

        return holder;
    }

    @Override
    public void onBindViewHolder(ShowBookContentsViewHolder holder, final int position) {
        switch (list.get(position).getContentType()) {
            case 0:
                implementingHeadingParagraphView(holder, position);
                break;
            case 1:
                implementingHeadingOneView(holder, position);
                break;
        }
    }

    private void implementingHeadingParagraphView(final ShowBookContentsViewHolder holder, final int position) {
        Utils.overrideFonts(context, holder.book_content_paragraph, PersianFontType.SHABNAM);

        holder.book_content_paragraph.setText(Html.fromHtml(list.get(position).getContent()));

        ActivityShowBookContent.setIonChangeBookContentTextSize(new ActivityShowBookContent.IonChangeBookContentTextSize() {
            @Override
            public void incrementTextSize() {
                holder.book_content_paragraph.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
            }

            @Override
            public void decrementTextSize() {
                holder.book_content_paragraph.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12);
            }
        });
    }

    @Override
    public int getItemViewType(int position) {
        return list.get(position).getContentType();
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    public int getItemPosition(int itemId) {
        return itemPositions.get(itemId);
    }

    public class ShowBookContentsViewHolder extends RecyclerView.ViewHolder {
        @Nullable
        @BindView(R.id.book_content_paragraph)
        TextView book_content_paragraph;

        @Nullable
        @BindView(R.id.book_content_heading_one)
        TextView book_content_heading_one;

        public ShowBookContentsViewHolder(View view) {
            super(view);
            ButterKnife.bind(this, view);
        }
    }
}

将此监听器实现为:

ActivityShowBookContent.setIonChangeBookContentTextSize(new ActivityShowBookContent.IonChangeBookContentTextSize() {
    @Override
    public void incrementTextSize() {
        holder.book_content_paragraph.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
    }

    @Override
    public void decrementTextSize() {
        holder.book_content_paragraph.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12);
    }
});

implementingHeadingParagraphView 方法适用于当前位置,不适用于 recyclerview 适配器上的所有行,我该如何解决这个问题?

【问题讨论】:

  • 你必须在点击位置的数据模型类中保存文本大小,然后使用 NotifyItemChanged()
  • 并在实现视图时从数据模型中设置文本大小。
  • @faranjit notifyItemChanged 仅适用于当前位置而非所有适配器行
  • 好的。我不是在打电话给notifyItemChanged之后这么说的。
  • @faranjit 在 notifyItemChanged 之后更改 textSize ?

标签: android


【解决方案1】:

您不必为此目的创建侦听器。您应该在适配器中保存一个名为 textSize 的字段。然后,在您的活动中随时设置此项。

public class ShowBookContentsAdapter extends RecyclerView.Adapter<ShowBookContentsAdapter.ShowBookContentsViewHolder> {

    private int textSize;

    // constructor etc.

    @Override
    public ShowBookContentsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_book_content_paragraph, parent, false);
        final ShowBookContentsViewHolder holder new ShowBookContentsViewHolder(view);

        return holder;
    }

    @Override
    public void onBindViewHolder(ShowBookContentsViewHolder holder, final int position) {
        implementingHeadingParagraphView(holder, position);
    }

    private void implementingHeadingParagraphView(final ShowBookContentsViewHolder holder, final int position) {
        Utils.overrideFonts(context, holder.book_content_paragraph, PersianFontType.SHABNAM);

        holder.book_content_paragraph.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSize);

        holder.book_content_paragraph.setText(Html.fromHtml(list.get(position).getContent()));

    }

    public void setTextSizes(int textSize) {
        this.textSize = textSize;
        notifyDataSetChanged();
    }

    //... other adapter methods

    public class ShowBookContentsViewHolder extends RecyclerView.ViewHolder {
        @Nullable
        @BindView(R.id.book_content_paragraph)
        TextView book_content_paragraph;

        @Nullable
        @BindView(R.id.book_content_heading_one)
        TextView book_content_heading_one;

        public ShowBookContentsViewHolder(View view) {
            super(view);
            ButterKnife.bind(this, view);
        }
    }

从你的活动中调用它

showBookContentsAdapter.setTextSizes(18);

【讨论】:

    【解决方案2】:

    你必须从你的活动中调用 notifydatasetchanged

    1.首先,如果是临时的,则将字体大小保存在常量变量上,或者如果需要在应用的整个生命周期中使用共享首选项

    1. 在你的活动中创建一个方法来保存字体大小

      private void saveFontSize(boolean isFont){
       IS_LARGE_FONT= isFont;
       recyclerView.post(new Runnable(){
       adapter.notifyDataSetChanged();
       });
      }
      
    2. 在您的适配器类中,只需检查 bindholder 中的值

      if(IS_LARGE_FONT)
      {
      //set large font
      }
      else{
      // set small font
      }
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-08
      • 1970-01-01
      • 2018-06-06
      • 2015-08-10
      • 2013-01-24
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      相关资源
      最近更新 更多