前段时间有人问类似淘宝的高亮关键词怎么做(如下图)
今天做了一个简单的demo 实验了一下,在这里记录分享一下。
首先布局文件如下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
// 关键字
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="ni" >
</TextView>
<ListView
android:id="@+id/ls"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
</LinearLayout>
MainActivity 如下
public class MainActivity extends Activity {
private ListView lView;
private TextView tv;
private MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.demo);
lView = (ListView) findViewById(R.id.ls);
tv = (TextView) findViewById(R.id.tv);
// 数据源
ArrayList<String> strList = new ArrayList<String>(Arrays.asList(
"nicaiyicai", "woshi ni", "woburenshinia"));
adapter = new MyAdapter(this, strList, (String) tv.getText());
lView.setAdapter(adapter);
}
}
都做好了,看一下MyAdapter 的代码,最主要的逻辑都在MyAdapter 里,如下:
public class MyAdapter extends BaseAdapter {
private Context mContext; // 上下文
private ArrayList<String> strList;// 数据
private String flag; // 关键词,当然也可以改成数组 随你喜欢
public MyAdapter(Context mContext, ArrayList<String> strList, String flag) {
super();
this.mContext = mContext;
this.strList = strList;
this.flag = flag;
}
@Override
public int getCount() {
return strList != null ? strList.size() : 0;
}
@Override
public Object getItem(int position) {
return strList != null ? strList.get(position) : null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
TextView tv = new TextView(mContext);
String str = strList.get(arg0);
// 这里是关键
// 使用SpannableString 对象进行格式化
// 至于你能通过 SpannableString 进行多少种效果,如下
/** 引自官方 http://developer.android.com/reference/android/text/style/CharacterStyle.html
java.lang.Object
↳ android.text.style.CharacterStyle
Known Direct Subclasses (直接已知子类)
BackgroundColorSpan, ClickableSpan, ForegroundColorSpan, MaskFilterSpan, MetricAffectingSpan, RasterizerSpan, StrikethroughSpan, SuggestionSpan, UnderlineSpan
Known Indirect Subclasses (简介已知子类)
AbsoluteSizeSpan, DynamicDrawableSpan, ImageSpan, LocaleSpan, RelativeSizeSpan, ReplacementSpan, ScaleXSpan, StyleSpan, SubscriptSpan, SuperscriptSpan, TextAppearanceSpan, TypefaceSpan, URLSpan
*/
Class Overview
SpannableString span = new SpannableString(str);
span.setSpan(new ForegroundColorSpan(Color.rgb(255, 0, 0)),
str.indexOf(flag), str.indexOf(flag) + flag.length(),
Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
tv.setPadding(50, 50, 50, 50);
tv.setText(span);
return tv;
}
}