Android中CustomArrayAdapter上的过滤器

Android中CustomArrayAdapter上的过滤器,android,android-layout,android-listview,Android,Android Layout,Android Listview,我是Android新手,我学习了一些关于在ListView上添加搜索功能的教程,但在我的例子中,它不起作用。有人能告诉我我的代码出了什么问题吗 这是我的密码: Activity.java 公共类SendMoney扩展活动{ 私人ListView联系人; 私人编辑文本搜索; 专用联系人列表适配器mAdapter; 私有字符串[]stockArr,stockArr1,stockArr2; 私人意图一; @凌驾 创建时受保护的void(Bundle savedInstanceState){ super

我是Android新手,我学习了一些关于在ListView上添加搜索功能的教程,但在我的例子中,它不起作用。有人能告诉我我的代码出了什么问题吗

这是我的密码:

Activity.java

公共类SendMoney扩展活动{
私人ListView联系人;
私人编辑文本搜索;
专用联系人列表适配器mAdapter;
私有字符串[]stockArr,stockArr1,stockArr2;
私人意图一;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u send\u money);
initObjects();
ArrayList phoneContactList=新建ArrayList();
ArrayList ContactImage=新建ArrayList();
ArrayList PhoneNumber=新的ArrayList();
ContentResolver cr=getContentResolver();
Cursor cur=cr.query(ContactsContract.Contacts.CONTENT_URI,null,null,null);
如果(cur.getCount()>0){
while(cur.moveToNext()){
字符串id=cur.getString(cur.getColumnIndex(ContactsContract.Contacts._id));
字符串名称=cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_name));
String img=cur.getString(cur.getColumnIndex(ContactsContract.Contacts.PHOTO_缩略图_URI));
if(Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)))>0{
//此内部光标用于具有多个号码的联系人。
游标pCur=cr.query(ContactsContract.commondatatypes.Phone.CONTENT_URI,null,ContactsContract.commondatatypes.Phone.CONTACT_ID+“=?”,新字符串[]{ID},null);
while(pCur.moveToNext()){
String pnumber=pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataTypes.Phone.NUMBER));
ContactImage.add(img);
电话联系人列表。添加(姓名);
电话号码。添加(pnumber);
Log.i(“联系人名单”,编号);
}
pCur.close();
}
}
Collections.sort(电话联系人列表);
int cnt=phoneContactList.size();//联系人计数
//将ArrayList转换为字符串[]开始
//联系人姓名
stockArr=新字符串[phoneContactList.size()];
stockArr=电话联系人列表。toArray(stockArr);
//联系人照片
stockArr1=新字符串[ContactImage.size()];
stockArr1=ContactImage.toArray(stockArr1);
//联系人号码
stockArr2=新字符串[PhoneNumber.size()];
stockArr2=电话号码。toArray(stockArr2);
//将ArrayList转换为字符串[]结束
mAdapter=new ContactListAdapter(getApplicationContext(),R.layout.banks\u listview\u layout,stockArr,stockArr1);
lvContacts.setAdapter(mAdapter);
}
cur.close();
lvContacts.setTextFilterEnabled(true);
lvContacts.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView适配器、视图视图、int位置、长id){
i=新意图(SendMoney.this、SendMoneyForm.class);
i、 putExtra(“联系人姓名”,stockArr[职位]);
i、 putExtra(“联系图片”,stockArr1[位置]);
i、 putExtra(“联系电话”,stockArr2[职位]);
星触觉(i);
}
});
//*****************搜索开始***********************
etSearch.addTextChangedListener(新的TextWatcher(){
@凌驾
public void onTextChanged(字符序列cs、int arg1、int arg2、int arg3){
//当用户更改文本时
mAdapter.getFilter().filter(cs.toString());
}
@凌驾
更改前的公共void(字符序列arg0、int arg1、int arg2、,
int arg3){
//TODO自动生成的方法存根
}
@凌驾
public void PostTextChanged(可编辑arg0){
//TODO自动生成的方法存根
}
});
//*****************搜索端***********************
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.send_money,menu);
返回true;
}
私有void initObjects(){
lvContacts=(ListView)findViewById(R.id.lvContacts);
etSearch=(EditText)findViewById(R.id.etSearch);
}
我的自定义阵列适配器

公共类ContactListAdapter扩展了ArrayAdapter{
私人停车场;
私有字符串[]mStrings;
私有字符串[]mIcons;
私有int-mViewResourceId;
公共ContactListAdapter(上下文ctx、int资源、,
字符串[]选项,字符串[]图标){
超级(ctx、资源、选项);
mInflater=(LayoutInflater)ctx.getSystemService(Context.LAYOUT\u INFLATER\u SERVICE);
mStrings=选项;
mIcons=图标;
mViewResourceId=资源;
}
@凌驾
public int getCount(){
返回mStrings.length;
}
@凌驾
公共字符串getItem(int位置){
返回mStrings[位置];
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
convertView=mInflater.inflate(mViewResourceId,null);
ImageView iv=(ImageView)convertView.findViewById(R.id.ivBankIcon);
if(mIcons[位置]==null){
iv.setImageResource(R.drawable.default_图片);
}否则{
iv.s
public class SendMoney extends Activity {
    private ListView lvContacts;
    private EditText etSearch;
    private ContactListAdapter mAdapter;
    private String[] stockArr, stockArr1, stockArr2;
    private Intent i;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_send_money);

        initObjects();

        ArrayList<String> phoneContactList = new ArrayList<String>();
        ArrayList<String> ContactImage = new ArrayList<String>();
        ArrayList<String> PhoneNumber = new ArrayList<String>();

        ContentResolver cr = getContentResolver();
        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

        if (cur.getCount() > 0) {
          while (cur.moveToNext()) {
            String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
            String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            String img = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.PHOTO_THUMBNAIL_URI));

            if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
              // This inner cursor is for contacts that have multiple numbers.
              Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] { id }, null);
              while (pCur.moveToNext()) {
                String pnumber = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                ContactImage.add(img);
                phoneContactList.add(name);
                PhoneNumber.add(pnumber);

                Log.i("Contact List", pnumber);
              }
              pCur.close();
            }
          }

          Collections.sort(phoneContactList);
          int cnt = phoneContactList.size(); // Count of contacts

          // Convert ArrayList<String> to String[] START

          // Contacts Name
          stockArr = new String[phoneContactList.size()];
          stockArr = phoneContactList.toArray(stockArr);

          // Contacts Photo
          stockArr1 = new String[ContactImage.size()];
          stockArr1 = ContactImage.toArray(stockArr1);

          // Contacts Number
          stockArr2 = new String[PhoneNumber.size()];
          stockArr2 = PhoneNumber.toArray(stockArr2);

          // Convert ArrayList<String> to String[] END

          mAdapter = new ContactListAdapter(getApplicationContext(), R.layout.banks_listview_layout, stockArr, stockArr1);
          lvContacts.setAdapter(mAdapter);

        }
        cur.close();

        lvContacts.setTextFilterEnabled(true);
        lvContacts.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {             
                i = new Intent(SendMoney.this, SendMoneyForm.class);
                i.putExtra("contact_name", stockArr[position]);
                i.putExtra("contact_image", stockArr1[position]);
                i.putExtra("contact_number", stockArr2[position]);
                startActivity(i);
            }
        });


        //***************** SEARCH START ***********************

        etSearch.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
                // When user changed the Text
                mAdapter.getFilter().filter(cs.toString());
            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                    int arg3) {
                // TODO Auto-generated method stub

            }

            @Override
            public void afterTextChanged(Editable arg0) {
                // TODO Auto-generated method stub                          
            }
        });

        //***************** SEARCH END ***********************
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.send_money, menu);
        return true;
    }

    private void initObjects(){
        lvContacts = (ListView)findViewById(R.id.lvContacts);
        etSearch   = (EditText)findViewById(R.id.etSearch);
    }
public class ContactListAdapter extends ArrayAdapter<String> {
    private LayoutInflater mInflater;
    private String[] mStrings;
    private String[] mIcons;
    private int mViewResourceId;

    public ContactListAdapter(Context ctx, int resource,
            String[] option, String[] icons) {
        super(ctx, resource, option);

        mInflater = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mStrings = option;
        mIcons   = icons;    
        mViewResourceId = resource;

    }

     @Override
        public int getCount() {
            return mStrings.length;
        }

        @Override
        public String getItem(int position) {
            return mStrings[position];
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            convertView = mInflater.inflate(mViewResourceId, null);

            ImageView iv = (ImageView)convertView.findViewById(R.id.ivBankIcon);
            if(mIcons[position]==null) {
                iv.setImageResource(R.drawable.default_picture);
            } else {
                iv.setImageURI(Uri.parse(mIcons[position]));
                Log.d("LALA", mIcons[position]);
            }

            TextView tv = (TextView)convertView.findViewById(R.id.tvBankName);
            tv.setText(mStrings[position]);

            return convertView;
        }
}
    @Override
    public Filter getFilter() {
        return new Filter() {
            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                Log.d(Constants.TAG, "**** PUBLISHING RESULTS for: " + constraint);
                myData = (List<MyDataType>) results.values;
                MyCustomAdapter.this.notifyDataSetChanged();
            }

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                Log.d(Constants.TAG, "**** PERFORM FILTERING for: " + constraint);
                List<MyDataType> filteredResults = getFilteredResults(constraint);

                FilterResults results = new FilterResults();
                results.values = filteredResults;

                return results;
            }
        };
    }
 EditText search= (EditText) findViewById(R.id.search);
 search.addTextChangedListener(new TextWatcher() {

     public void onTextChanged(CharSequence s, int start, int before, int count) {
                     adapter.getFilter().filter(s);

     }

     public void beforeTextChanged(CharSequence s, int start, int count,
         int after) {

       }

       public void afterTextChanged(Editable s) {
       }
      });
  @Override
  public Filter getFilter() {
  return new Filter() {
     @Override
     protected void publishResults(CharSequence constraint, FilterResults results) {
         if (results != null && results.count >= 0) {
             //if results of search is not null set the searched results data
         } else {
            // set original values
         }

         notifyDataSetInvalidated();
     }
    @Override
     protected FilterResults performFiltering(CharSequence constraint) {
         FilterResults result = new FilterResults();
         if(condition)
            {

             ArrayList<MyDataType> foundItems = new ArrayList<MyDataType>();   
             // add items to foundItems if condition matches

             result.count = foundItems.size();//search results found return count
             result.values = foundItems;// return values
         }
         else
         {
             result.count=-1;// no search results found
         }


         return result;
     }
 };