Android Spannable 在回收器视图适配器中不工作
Android Spannable not working in recycler view adapter
我有一个回收视图,想更改文本视图文本某些部分的颜色。
这是我的代码:
public class MyAdapter extends RecyclerView.Adapter<MyEarningsAdapter.ViewHolder> {
public ArrayList<WageItemDataSet> wageItemList;
private Context context;
private Spannable spanText;
private ForegroundColorSpan fcs;
private RelativeSizeSpan rss;
public MyAdapter(Context context) {
wageItemList = new ArrayList<>();
this.context = context;
fcs = new ForegroundColorSpan(Color.BLACK);
rss = new RelativeSizeSpan(0.8f);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_wage_list, parent, false));
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
WageItemDataSet item = wageItemList.get(position);
spanText = new SpannableString("Fare: "+item.totalFare);
spanText.setSpan(fcs, 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spanText.setSpan(rss, 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
holder.tvFareAmount.setText(spanText);
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView tvFareAmount;
public ViewHolder(View itemView) {
super(itemView);
tvFareAmount = (TextView) itemView.findViewById(R.id.tvFareAmount);
tvFareAmount.setTypeface(openSansRegular);
}
}
}
它不会改变颜色或文本大小。我做错了什么??
试试这个,
WageItemDataSet item = wageItemList.get(position);
String value="Fare: "+item.totalFare;
Spannable spanText = new SpannableString(value);
spanText.setSpan(new ForegroundColorSpan(Color.BLUE), 5, 13,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textview.setText(spanText);
这对我有用 -
StringBuilder captionBuilder = new StringBuilder();
captionBuilder.append(yourString);
SpannableStringBuilder commentBuilder = new SpannableStringBuilder(captionBuilder);
commentBuilder.setSpan(new ForegroundColorSpan(ContextCompat.getColor(mContext, R.color.your_color)), start, end, 0);
希望对您有所帮助。
使用以下内容来实现您的目标...
public static void spanText(Context context, AppCompatAutoCompleteTextView editText, String replaceString) {
String event = editText.getHint().toString();
int startPos = event.indexOf(replaceString);
int endPos = startPos + replaceString.length();
Spannable spanText = Spannable.Factory.getInstance().newSpannable(editText.getHint());
spanText.setSpan(new ForegroundColorSpan(ContextCompat.getColor(context, R.color.dark_yellow)), startPos, endPos, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
editText.setHint(spanText);
}
尝试使用 .append() 而不是 .settext()
holder.tvFareAmount.append(spanText)
您好,我已经实现了同样的功能并且它对我有用。您必须制作一个 class 来扩展 ClickableSpan,如下所示:
public class TextSpan extends ClickableSpan {
@Override
public void onClick(View widget) {
TextView tv = (TextView) widget;
Spanned s = (Spanned) tv.getText();
//int start = s.getSpanStart(this);
//int end = s.getSpanEnd(this);
}
}
然后在 onBindViewHolder() 方法中,您必须编写如下代码
SpannableStringBuilder builder = new SpannableStringBuilder();
builder.append("yourstring");
builder.setSpan(new TextSpan(), builder.length() -
comment.length(),builder.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
holder.tvFareAmount.setText(content);
holder.tvFareAmount.setMovementMethod(LinkMovementMethod.getInstance());
希望这能解决您的问题
我有一个回收视图,想更改文本视图文本某些部分的颜色。
这是我的代码:
public class MyAdapter extends RecyclerView.Adapter<MyEarningsAdapter.ViewHolder> {
public ArrayList<WageItemDataSet> wageItemList;
private Context context;
private Spannable spanText;
private ForegroundColorSpan fcs;
private RelativeSizeSpan rss;
public MyAdapter(Context context) {
wageItemList = new ArrayList<>();
this.context = context;
fcs = new ForegroundColorSpan(Color.BLACK);
rss = new RelativeSizeSpan(0.8f);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_wage_list, parent, false));
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
WageItemDataSet item = wageItemList.get(position);
spanText = new SpannableString("Fare: "+item.totalFare);
spanText.setSpan(fcs, 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spanText.setSpan(rss, 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
holder.tvFareAmount.setText(spanText);
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView tvFareAmount;
public ViewHolder(View itemView) {
super(itemView);
tvFareAmount = (TextView) itemView.findViewById(R.id.tvFareAmount);
tvFareAmount.setTypeface(openSansRegular);
}
}
}
它不会改变颜色或文本大小。我做错了什么??
试试这个,
WageItemDataSet item = wageItemList.get(position);
String value="Fare: "+item.totalFare;
Spannable spanText = new SpannableString(value);
spanText.setSpan(new ForegroundColorSpan(Color.BLUE), 5, 13,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textview.setText(spanText);
这对我有用 -
StringBuilder captionBuilder = new StringBuilder();
captionBuilder.append(yourString);
SpannableStringBuilder commentBuilder = new SpannableStringBuilder(captionBuilder);
commentBuilder.setSpan(new ForegroundColorSpan(ContextCompat.getColor(mContext, R.color.your_color)), start, end, 0);
希望对您有所帮助。
使用以下内容来实现您的目标...
public static void spanText(Context context, AppCompatAutoCompleteTextView editText, String replaceString) {
String event = editText.getHint().toString();
int startPos = event.indexOf(replaceString);
int endPos = startPos + replaceString.length();
Spannable spanText = Spannable.Factory.getInstance().newSpannable(editText.getHint());
spanText.setSpan(new ForegroundColorSpan(ContextCompat.getColor(context, R.color.dark_yellow)), startPos, endPos, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
editText.setHint(spanText);
}
尝试使用 .append() 而不是 .settext()
holder.tvFareAmount.append(spanText)
您好,我已经实现了同样的功能并且它对我有用。您必须制作一个 class 来扩展 ClickableSpan,如下所示:
public class TextSpan extends ClickableSpan {
@Override
public void onClick(View widget) {
TextView tv = (TextView) widget;
Spanned s = (Spanned) tv.getText();
//int start = s.getSpanStart(this);
//int end = s.getSpanEnd(this);
}
}
然后在 onBindViewHolder() 方法中,您必须编写如下代码
SpannableStringBuilder builder = new SpannableStringBuilder();
builder.append("yourstring");
builder.setSpan(new TextSpan(), builder.length() -
comment.length(),builder.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
holder.tvFareAmount.setText(content);
holder.tvFareAmount.setMovementMethod(LinkMovementMethod.getInstance());
希望这能解决您的问题