实现如下效果:
思路:1.用系统自带的adapter无法解决,应该是自定义adpater及过滤器,过滤的内容为六位数字;
2.数据存储,这边我选用greendao数据库;
3.红色字体突出匹配,选用html.fromHtml()网页显示文字;
贴出最后源码,供大家参考;
自定义adpater如下:
public class CourierNumAdapter extends BaseAdapter implements Filterable { private Context context; private ArrayFilter mFilter; private List<CourierMsg> mList = new ArrayList<CourierMsg>(); private List<CourierMsg> mUnfilteredData; private DeleteClickListener deleteClickListener; private AutoCompleteTextView tv; private String tempKeyString; private String mobile; public CourierNumAdapter(Context context, List<CourierMsg> mList, String mobile,AutoCompleteTextView tv) { super(); this.context = context; this.mList = mList; this.mobile = mobile; this.tv = tv; } public void setDeleteClickListener(DeleteClickListener deleteClickListener) { this.deleteClickListener = deleteClickListener; } @Override public int getCount() { return mList.size(); } @Override public Object getItem(int position) { return mList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); convertView = LayoutInflater.from(context).inflate( R.layout.list_item_courierno, null); holder.iv_icon = (ImageView) convertView.findViewById(R.id.iv_icon); holder.tv_company = (TextView) convertView .findViewById(R.id.tv_company); holder.tv_courier = (TextView) convertView .findViewById(R.id.tv_courier); holder.iv_delete = (ImageView) convertView .findViewById(R.id.iv_delete); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } CourierMsg CourierMsg = mList.get(position); Bitmap bitmap = BitmapHelper.getLoacalBitmapByAssets(context, "companyIcon/" + CourierMsg.getCompanyCode() + ".png"); if (bitmap != null) { holder.iv_icon.setImageBitmap(bitmap); } else { holder.iv_icon.setImageResource(R.drawable.app_icon); } holder.tv_company.setText(CourierMsg.getCompanyName()); // holder.tv_courier.setText(CourierMsg.getCourierFullName() + // CourierMsg.getCourierCode()); String temp1 = CourierMsg.getCourierCode(); // 使用网页来显示字体 if (tempKeyString != null) holder.tv_courier.setText(Html.fromHtml(CourierMsg .getCourierFullName()+" " + "<font color=\"red\">" + tempKeyString + "</font>" + temp1.substring(tempKeyString.length(), temp1.length()))); final int pos = position; holder.iv_delete.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // deleteClickListener.delete(pos); if (mList != null) { DBHelper.getInstance(context).deleteCourierMsg( mList.get(pos).getId()); update(); } } }); return convertView; } class ViewHolder { ImageView iv_icon; ImageView iv_delete; TextView tv_company; TextView tv_courier; } @Override public Filter getFilter() { if (mFilter == null) { mFilter = new ArrayFilter(); } return mFilter; } private class ArrayFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence prefix) { Log.e("performFiltering", "" + prefix); FilterResults results = new FilterResults(); if (mUnfilteredData == null) { mUnfilteredData = new ArrayList<CourierMsg>(mList); } if (prefix == null || prefix.length() == 0) { List<CourierMsg> list = mUnfilteredData; results.values = list; results.count = list.size(); } else { String prefixString = prefix.toString().toLowerCase(); List<CourierMsg> unfilteredValues = mUnfilteredData; int count = unfilteredValues.size(); ArrayList<CourierMsg> newValues = new ArrayList<CourierMsg>( count); for (int i = 0; i < count; i++) { CourierMsg pc = unfilteredValues.get(i); if (pc != null) { if (pc.getCourierCode() != null && pc.getCourierCode().startsWith(prefixString)) { newValues.add(pc); } // else if (pc.getEmail() != null // && pc.getEmail().startsWith(prefixString)) { // // newValues.add(pc); // } } } results.values = newValues; results.count = newValues.size(); Log.e("values", "" + results.values); } return results; } @Override protected void publishResults(CharSequence constraint, FilterResults results) { // noinspection unchecked mList = (List<CourierMsg>) results.values; if (results.count > 0) { notifyDataSetChanged(); // 这个时候输入的关键字 if (constraint != null) tempKeyString = constraint.toString(); } else { notifyDataSetInvalidated(); } } } public List<CourierMsg> getmList() { return mList; } public void update(){ mList = DBHelper.getInstance(context) .getCourierMsgbyMobile(mobile); mUnfilteredData = new ArrayList<CourierMsg>(mList); getFilter().filter(tv.getText().toString()); notifyDataSetChanged(); } public void setList(List<CourierMsg> courierMsgList) { this.mList = courierMsgList; } }布局文件:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="4dp" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:gravity="center_vertical" android:orientation="horizontal" > <com.yibao.birdstore.view.CircleImageView android:id="@+id/iv_icon" android:layout_width="50dp" android:layout_height="50dp" android:src="@drawable/app_icon" /> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="3" android:gravity="center_vertical|left" android:orientation="vertical" android:paddingLeft="12dp" > <TextView android:id="@+id/tv_company" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" android:text="快递公司" android:textAppearance="?android:attr/textAppearanceMedium" /> <TextView android:id="@+id/tv_courier" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="快递员:" android:textAppearance="?android:attr/textAppearanceMedium" /> </LinearLayout> <ImageView android:id="@+id/iv_delete" android:layout_width="40dp" android:layout_height="40dp" android:padding="2dip" android:src="@drawable/delete_icon_selector" /> </LinearLayout> </RelativeLayout>