java - 为 eche RecyclerView 项目设置自定义字体

标签 java android fonts android-fonts

我使用 RecyclerViewCardView,并且我想向 RecyclerView 项目之一内的 TextView 添加自定义字体。

  1. 我应该在适配器的哪个位置设置字体?
  2. 另外我该如何设置字体?

例如:在item 1中设置Durwent.ttf,在item 2中设置“Fenwick.ttf”。

这是我的adapter.java:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    public List<RecyclerItem> listItems;
    private Context mContext;

    public MyAdapter(List<RecyclerItem> listItems, Context mContext) {
        this.listItems = listItems;
        this.mContext = mContext;
    }

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

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

        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final int position = holder.getAdapterPosition();
//                if (position == 0) {

                    Toast.makeText(mContext, listItems.get(position).getTitle(),Toast.LENGTH_SHORT).show();

/*
                }
                if (position == 1) {

                    Toast.makeText(mContext,"Android",Toast.LENGTH_SHORT).show();

                }
*/

            }
        });
        return holder;
    }
    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {

        final RecyclerItem itemList = listItems.get(position);
        holder.txtTitle.setText(itemList.getTitle());
        holder.txtDescription.setText(itemList.getDescription());
        holder.txtOptionDigit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Display option menu
                PopupMenu popupMenu = new PopupMenu(mContext, holder.txtOptionDigit);
                popupMenu.inflate(R.menu.option_menu);
                popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        switch (item.getItemId()) {
                            case R.id.mnu_item_save:
                                Toast.makeText(mContext, "Saved " + listItems.get(position).getTitle(), Toast.LENGTH_SHORT).show();
                                break;
                            case R.id.mnu_item_delete:
                                //Delete item
                                Toast.makeText(mContext, "Deleted " + listItems.get(position).getTitle(), Toast.LENGTH_SHORT).show();
                                listItems.remove(position);
                                notifyDataSetChanged();
                                break;
                            default:
                                break;
                        }
                        return false;
                    }
                });
                popupMenu.show();
            }
        });
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder{

        public TextView txtTitle;
        public TextView txtDescription;
        public TextView txtOptionDigit;
        public ViewHolder(View itemView) {
            super(itemView);
            txtTitle = (TextView) itemView.findViewById(R.id.txtTitle);
            txtDescription = (TextView) itemView.findViewById(R.id.txtDescription);
            txtOptionDigit = (TextView) itemView.findViewById(R.id.txtOptionDigit);
        }
    }
}

最佳答案

Android Docs about Fonts

按照 Android 文档中的描述设置 font-family。

<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android">
<font
    android:fontStyle="normal"
    android:fontWeight="400"
    android:font="@font/lobster_regular" />
<font
    android:fontStyle="italic"
    android:fontWeight="400"
    android:font="@font/lobster_italic" />
</font-family>

将 font-family 应用于您的 TextView,

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:fontFamily="@font/lobster"/>

创建具有两个不同项目的回收器 View ,例如, FontViewHolder(在此 CardView 中包括启用字体的 TextView)和 NormalViewHolder,并且根据条件,您可以使用特定的 ViewHolder。例如,

public class YourAdapater extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

  private static final int FONT_ITEM_TYPE = 0x01;
  private static final int DEFAULT_ITEM_TYPE = 0x02;

  private List<RecyclerItem> listItems;

  public YourAdapater(List<RecyclerItem> listItems) {
    this.listItems = listItems;
  }

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

  @Override
  public int getItemViewType(int position) {
    if (position == 0) {
      return FONT_ITEM_TYPE; // constant say 0x01
    }
    return DEFAULT_ITEM_TYPE; // constant say 0x02
  }

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

    final LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    if (viewType == FONT_ITEM_TYPE) {
      // inflate and return FontViewHolder
      final View view = inflater.inflate(R.layout.recycler_item_font, parent, false);
      return new FontViewHolder(view);
    } else {
      // inflate and return NormalViewHolder
      final View view = inflater.inflate(R.layout.recycler_item_normal, parent, false);
      return new NormalViewHolder(view);
    }
  }

  @Override
  public void onBindViewHolder(ViewHolder holder, int position) {
    if (position == 0) {
      FontViewHolder vh = (FontViewHolder) holder;
      vh.bind(listItems.get(position));
    } else {
      NormalViewHolder vh = (NormalViewHolder) holder;
      vh.bind(listItems.get(position));
    }
  }

  public static class NormalViewHolder extends RecyclerView.ViewHolder {

    public TextView txtTitle;
    public TextView txtDescription;
    public TextView txtOptionDigit;

    private RecyclerItem item;

    public NormalViewHolder(View itemView) {
      super(itemView);

      txtTitle = (TextView) itemView.findViewById(R.id.txtTitle);
      txtDescription = (TextView) itemView.findViewById(R.id.txtDescription);
      txtOptionDigit = (TextView) itemView.findViewById(R.id.txtOptionDigit);

      itemView.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
          // click action on item
          if (item != null) {
            Toast.makeText(itemView.getContext(), item.getTitle(), Toast.LENGTH_SHORT).show();
          }
        }
      });
    }

    public void bind(RecyclerItem item) {
      this.item = item;
      // do data binding
      txtTitle.setText(item.getTitle());
      txtDescription.setText(item.getDescription());
    }
  }

  public static class FontViewHolder extends RecyclerView.ViewHolder {

    public FontViewHolder(View itemView) {
      super(itemView);

      itemView.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
          // click action on item
        }
      });
    }

    public void bind(RecyclerItem data) {
      // do data binding
    }
  }
} 

通过这种方式,您可以在将来重新使用您的字体系列并根据您的上下文扩展功能。

关于java - 为 eche RecyclerView 项目设置自定义字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48347874/

相关文章:

android - Google Play 中付费应用的深层链接促销代码

java - 这段代码 fragment 是什么意思

html - 相当于 <字体大小 ="+0"> 的 CSS

android改变listview的字体和颜色

java - Struts.xml Action 配置

java - 查找子字符串出现的总数

java - Java 中的优先级队列 - 检索特定元素

java - 为什么消费者会降低生产者的绩效

Android 应用暂停恢复

jsp - glyphicons-halflings-regular.woff2 未加载 404 错误