自定义arrayadaper中的自定义过滤器图标

时间:2013-08-15 15:26:22

标签: android filtering android-arrayadapter

我有自定义ArrayAdapter:

     public class CallAdapter extends ArrayAdapter<CallItem> implements Filterable{
        View view;
        ContactHolder holder = null;
       int color = 0;
       Context context; 
       int layoutResourceId;    
       public static int rowHeight = 0;
        private ViewSwitcher switcher;
        List<CallItem> contacts = null;
        Map<ContactItem, View> contactViewMap = ContactsViewMapSingletone.getInstance().getOrderViewMap();
        private ArrayList<CallItem> filtredContacts;
        private Filter filter;
       public CallAdapter(Context context,  int layoutResourceId,List<CallItem> contacts) {
           super(context, layoutResourceId, contacts);
           this.layoutResourceId = layoutResourceId;
           this.context = context;
           this.contacts = contacts;
           this.filtredContacts = new ArrayList<CallItem>();
           this.filtredContacts.addAll(contacts);
       }
       @Override
       public CallItem getItem(int arg0) {
           return contacts.get(arg0);
       }

       @Override
       public long getItemId(int arg0) {
           return arg0;
       }
       /**  *   метод для привязки элементов UI к данным конкретного контакта */
       @Override
       public View getView(int position, View convertView, ViewGroup parent) {
           View row = convertView;
           view = row;
           if(row == null)
           {
            LayoutInflater inflater = (LayoutInflater)this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
               row = inflater.inflate(R.layout.call_item, parent, false);
               holder = new ContactHolder();
               holder.contactIcon = (ImageView)row.findViewById(R.id.contactIcon);
               holder.contactName = (CustomTextView)row.findViewById(R.id.contactName);
               holder.contactNumber = (CustomTextView)row.findViewById(R.id.contactNumber);
               holder.contactDays = (CustomTextView)row.findViewById(R.id.contactDays);
               row.setTag(holder);
           }
           else
           {
               holder = (ContactHolder)row.getTag();
           }

           CallItem contact = contacts.get(position);
           try
           {

                holder.contactIcon.setBackgroundResource(contact.getIcon());
                holder.contactName.setText(contact.getName());
                holder.contactNumber.setText(contact.getDays());
           }
           catch(Exception e)
           {
                    e.printStackTrace();
           }


           return row;
       }
       @Override
       public Filter getFilter()
       {
           if (filter == null)
               filter = new CallFilter();

           return filter;
       }
       static class ContactHolder
       {
        ImageView contactIcon;
        CustomTextView contactName;
        CustomTextView contactNumber;
        CustomTextView contactDays;
       }
  @SuppressLint("DefaultLocale")
    private class CallFilter extends Filter
       {
               @Override
               protected FilterResults performFiltering(CharSequence constraint)
               {   

                   Log.i(" filtered value", constraint.toString());
                   FilterResults results = new FilterResults();
                   String prefix = constraint.toString().toLowerCase();

                   if (prefix == null || prefix.length() == 0)
                   {
                       results.values = contacts;
                       results.count = contacts.size();
                   }
                   else
                   {
                       final ArrayList<CallItem> list =  new ArrayList<CallItem>();
                       synchronized (this)
                       {
                           list.addAll(contacts);
                       }
                       filtredContacts.clear();
                       int count = list.size();
                       for (int i=0; i<count; i++)
                       {
                           final CallItem pkmn = list.get(i);
                           if(pkmn.getName().toLowerCase(Locale.getDefault()).contains(constraint))
                           {
                               Log.i("found pref",pkmn.toString() );
                               filtredContacts.add(pkmn);
                           }
                       }
                       Log.i("prefix",prefix);
                       for(int i = 0, l = filtredContacts.size(); i < l; i++)
                       {
                           Log.i("filtered list",filtredContacts.get(i).toString());
                       }
                       results.values = filtredContacts;
                       results.count = filtredContacts.size();
                   }
                   return results;
               }

               @SuppressWarnings("unchecked")
               @Override
               protected void publishResults(CharSequence constraint, FilterResults results) {
                   filtredContacts = (ArrayList<CallItem>)results.values;
                   notifyDataSetChanged();
                   clear();
                   for(int i = 0, l = filtredContacts.size(); i < l; i++)
                   {  

                       add(filtredContacts.get(i));

                   }
                   notifyDataSetChanged();
           }

    }

    }

但我需要过滤不是按名称的项目,而是按图标过滤。因此,用户选择应该过滤项目的图标,并查看带有这些项目的项目列表,顶部有此图标。我试图在performFiltering中实现这个(传递int作为参数),但它必须得到CharSequence参数。我需要实现此功能,不是像往常一样在EditText中键入值,而是在另一个Activity中获取icon int并返回到我的列表并查看已过滤的项目。对不起我的英语不好。

1 个答案:

答案 0 :(得分:0)

我不是通过使用自定义过滤器解决它,但实现可能不是那么优雅,但可行的解决方案。当我使用int值返回我的Fragment时,应该过滤适配器,我喜欢这样:

 public void onActivityResult(int requestCode, int resultCode, Intent data) 
         {
               if (requestCode==1)
             { 
                 if(resultCode == 0)
                 {
                     adapter.clear();
                     ArrayList<CallItem> filtered = new ArrayList<CallItem>();
                    int a=0;
                    for (CallItem call : adapter.getItems())
                    {
                        if (call.getIcon() == R.drawable.incoming_call)
                        {   
                            Log.i("item to filter", call.toString());
                            adapter.insert(call, a);
                            a++;
                        }
                        else 
                        {
                            filtered.add(call);
                        }
                    }
                    adapter.addAll(filtered);
                    adapter.notifyDataSetChanged();

                 }
                 else if (resultCode==1)
                 {
                     adapter.clear();
                     ArrayList<CallItem> filtered = new ArrayList<CallItem>();
                    int a=0;
                    for (CallItem call : adapter.getItems())
                    {
                        if (call.getIcon() == R.drawable.outgoing_call)
                        {   
                            Log.i("item to filter", call.toString());
                            adapter.insert(call, a);
                            a++;
                        }
                        else 
                        {
                            filtered.add(call);
                        }
                    }
                    adapter.addAll(filtered);
                    adapter.notifyDataSetChanged();
                 }
                 else if(resultCode==2)
                 {
                     adapter = new CallAdapter(getActivity(),
                               R.layout.call_item, faq.getDisplayCalls(getActivity()));
                    contancts_list.setAdapter(adapter);
                 }
             }
}

正如我所提到的,也许它不那么优雅,但对我来说可行。希望它对某人有用。