2015-08-03 75 views
0

如何使用EditText在自定義ArrayList中實現Filter,我使用ArrayList將JSON數據解析爲ListView。如何過濾自定義ArrayList

我想允許用戶過濾使用人名或城市記錄的EditText

public class Persons { 

    private String name; 
    private String city; 

    ....... 

    // getters and setters 

} 

PersonsAdapter.java:

public class PersonsAdapter extends BaseAdapter implements Filterable { 

ArrayList<Persons> arrayList; 
ArrayList<Persons> filteredItems; 
LayoutInflater inflater; 
int Resource; 
ViewHolder holder; 
Context context; 

private ItemFilter mFilter = new ItemFilter(); 

public PersonsAdapter(Context context, int resource, ArrayList<Persons> arrayList) { 
    this.context = context; 
    this.inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    this.Resource = resource; 
    this.arrayList = arrayList; 
    this.filteredItems = arrayList; 
} 


@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    // convert view = design 
    View view = convertView; 
    if (view == null) { 
     holder = new ViewHolder(); 
     view = inflater.inflate(Resource, null); 

     holder.textName = (TextView) view.findViewById(R.id.textName); 
     holder.textCity = (TextView) view.findViewById(R.id.textCity); 


     view.setTag(holder); 
    } 
    else 
    { 
     holder = (ViewHolder) view.getTag(); 
    } 


    holder.textName.setText(arrayList.get(position).getName()); 
    holder.textCity.setText(arrayList.get(position).getCity()); 

    return view; 

} 

static class ViewHolder { 

    TextView textName; 
    TextView textCity; 

} 

public Filter getFilter() { 
    return mFilter; 
} 

private class ItemFilter extends Filter { 
    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 
     constraint = constraint.toString().toLowerCase(); 
     FilterResults result = new FilterResults(); 
     filteredItems = new ArrayList<Persons>(); 
     if (constraint != null && constraint.toString().length() > 0) { 

      for (int i = 0, l = arrayList.size(); i < l; i++) { 
       Persons person = arrayList.get(i); 

       // here check with your property 
       if (person.getName().toLowerCase().contains(constraint)) 
        filteredItems.add(person); 
      } 
      result.count = filteredItems.size(); 
      result.values = filteredItems; 
     } else { 
      synchronized (this) { 
       result.values = arrayList; 
       result.count = arrayList.size(); 
      } 
     } 
     return result; 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    protected void publishResults(CharSequence constraint, FilterResults results) { 
     filteredItems = (ArrayList<Persons>) results.values; 
     notifyDataSetChanged(); 
    } 
} 


@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return arrayList.size(); 
} 


@Override 
public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return arrayList.get(position); 
} 


@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return position; 
} 

} 
+0

我盡力了,請不要往下投這個時候...... – Sophie

+0

你需要implrment [可篩選(http://paste.ofcode.org/U7kuLJRZzkMTMwfxd69QsH)接口。 –

+1

「_I盡我所能_」您的代碼的哪個部分試圖「使用EditText在自定義ArrayList中實現Filter」? – csmckelvey

回答

1

嘗試使用下面的代碼來解決問題,並學習正確實施Filterable接口

從您現有的代碼替換下面的行不是實例每

private ItemFilter mFilter = new ItemFilter(); 

private ItemFilter mFilter; 

private class ItemFilter extends Filter { 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults results = new FilterResults(); 

      if (constraint != null && constraint.length() > 0) { 
       ArrayList<Persons> filterList = new ArrayList<Persons>(); 
       for (int i = 0; i < filteredItems.size(); i++) { 

        Persons person = filteredItems.get(i); 
        String name = person.getName().toUpperCase(); 
        String city = person.getCity().toUpperCase(); 
        if (name.contains(constraint.toString().toUpperCase()) || city.contains(constraint.toString().toUpperCase())) { 

         filterList.add(person); 
        } 
       } 
       results.count = filterList.size(); 
       results.values = filterList; 
      } else { 
       results.count = filteredItems.size(); 
       results.values = filteredItems; 
      } 
      return results; 

     } 

     @Override 
     protected void publishResults(CharSequence constraint, 
       FilterResults results) { 
      arrayList = (ArrayList<Persons>) results.values; 
      notifyDataSetChanged(); 
     } 

    } 

public Filter getFilter() { 
    if (itemFilter == null) { 
     itemFilter = new ItemFilter(); 
    } 
    return itemFilter; 
} 

@Override 
public long getItemId(int position) { 
    return arrayList.indexOf(getItem(position)); 
}