android开发 AutoCompleteTextView自定义适配器

实现如下效果:

 

思路: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>








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值