我使用 RecyclerView
和 CardView
,并且我想向 RecyclerView
项目之一内的 TextView
添加自定义字体。
- 我应该在适配器的哪个位置设置字体?
- 另外我该如何设置字体?
例如:在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 文档中的描述设置 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/