有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

eche RecyclerView项的java Set自定义字体

我使用了RecyclerViewCardView,我想在其中一个RecyclerView项中的TextView中添加一个自定义字体

  1. 我应该在适配器中的何处设置字体
  2. 另外,我如何准确设置字体

例如:设置durgent。ttf在{}和{}中的“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);
        }
    }
}

共 (3) 个答案

  1. # 1 楼答案

    Android Docs about Fonts

    按照Android文档中的描述设置字体系列

    <?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>
    

    将字体系列应用于文本视图

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

    创建包含两个不同项目的recycler视图,例如, FontViewHolder(在此CardView中包括启用字体的文本视图)&;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
        }
      }
    } 
    

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

  2. # 2 楼答案

    试试这个:

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    
        MyHolder myHolder = (MyHolder)holder;
        Current current = currentList.get(position);
        myHolder.textDescription.setText(current.getDescription());
        myHolder.textTitle.setText(current.getTitle());
        myHolder.textSource.setText(current.getRelease_date());
        myHolder.textType.setText(current.getContent_type());
    
    
        Typeface font1 = Typeface.createFromAsset(context.getAssets(), "myFirstFont.ttf");
        Typeface font2 = Typeface.createFromAsset(context.getAssets(), "mySecondFont.ttf");
       if(position % 2 ==0 )
       {
           myHolder.textDescription.setTypeface(font1);
    
       }else
           myHolder.textDescription.setTypeface(font2);
    
    
    }
    
  3. # 3 楼答案

    @M.bala7请按照以下步骤在不同位置设置不同字体

    1-首先创建资产文件夹 右键单击应用程序>;新>;文件夹>;资产文件夹>;选择main>;点击ok

    enter image description here 2-将字体放入资产文件夹

    enter image description here 然后在代码中

     @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {
    
       Typeface font1= Typeface.createFromAsset(context.getAssets(), "Durwent.ttf");
     Typeface font2= Typeface.createFromAsset(context.getAssets(), "Fenwick.ttf");
    }
    
     // you can apply font position wise 
    
      if (position == 0) {
            //set font 1 
             textView.setTypeface(font1);
        } 
     if (position == 1){
           //set font 2 
             textView.setTypeface(font2);
        }
    
           or        -
    
       if (position % 2 == 0) {
            //set font 1 
             textView.setTypeface(font1);
        } else {
           //set font 2 
             textView.setTypeface(font2);
        }
     }