2013-12-24 3 views
0

Таким образом, у меня есть базовое пользовательское listview с изображением и текстом для каждого элемента списка, и мне было интересно, как я буду фильтровать через listview динамически с помощью окна edittext. Я посмотрел, как это сделать, но я застрял в одном месте, где я не уверен, что делать.Фильтровать список просмотров с помощью настраиваемого макета?

My listview заполнен из sqlitedatabase, где у меня есть методы, которые извлекают все имена изображений, текст и идентификаторы из базы данных и помещают их в список. Вот мой код до сих пор, где я не совсем уверен, что я должен делать в методе

public class MainActivity extends Activity { 

ListView data; 
EditText inputSearch; 
ArrayList<String> names, images, ids; 
ArrayAdapter<String> adapter; 
MyDatabase helper; 
ImageView sprite; 
TextView name, id; 

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

    data = (ListView) findViewById(R.id.listView1); 
    helper = new MyDatabase(this); 
    helper.openDataBase(); 

    names = helper.getNameList(); 
    images = helper.getImageList(); 
    ids = helper.getIdList(); 

    adapter = new MyArrayAdapter(this); 
    data.setAdapter(adapter); 

    inputSearch = (EditText) findViewById(R.id.edit_search); 

    inputSearch.addTextChangedListener(new TextWatcher() { 

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

     @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       
     } 
    }); 

} 

private class MyArrayAdapter extends ArrayAdapter<String>{ 

    public MyArrayAdapter(Context c) { 
     super(c, R.layout.item_view,names); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     if (convertView == null){ 
      row = getLayoutInflater().inflate(R.layout.item_view, parent,false); 
     } 

     sprite = (ImageView) row.findViewById(R.id.sprite); 
     name = (TextView) row.findViewById(R.id.name); 
     id = (TextView) row.findViewById(R.id.ids); 

     name.setText(names.get(position).toString()); 
     int resID = getResources().getIdentifier(images.get(position),"drawable", getPackageName()); 
     sprite.setImageResource(resID); 
     id.setText(ids.get(position).toString()); 

     return row; 
    } 

    @Override 
    public Filter getFilter() { 
     // TODO Auto-generated method stub 
     return new Filter(){ 

      @Override 
      protected FilterResults performFiltering(CharSequence input) { 

       FilterResults results = new FilterResults(); 
       int originalLength = names.size(); 

       if (input == null || input.length() == 0){ 
        results.values = names; 
        results.count = originalLength; 
       } else { 
        ArrayList<String> newList = new ArrayList<String>(); 
        for (int i = 0; i < originalLength; i++){ 
         String str = names.get(i); 
         if (str.toLowerCase(Locale.getDefault()).contains(input)) 
          newList.add(str); 
         results.values = newList; 
         results.count = newList.size(); 
        } 
       } 
       return results; 
      } 

      @Override 
      protected void publishResults(CharSequence charSequence, 
        FilterResults results) { 

       //Not sure what to do here 

       notifyDataSetChanged(); 
      } 

     }; 
    } 

} 

ответ

0

publishResult() Должно быть довольно просто в тот момент ...

Edit:

public class FakeAdapter extends ArrayAdapter<Model> { 

     public class Model { 
      String my_string; 
      int resource_id; 
     } 

     private Activity activity; 

    /* ArrayList to hold the original values before filtering. */ 
    private ArrayList<Model> original_list; 

    /* Current Data Filter */ 
    private Filter filter; 

    public RelationshipsAdapter(Activity activity, int resource, 
      ArrayList<Model> objects) { 
     super(activity, resource, objects); 
     this.activity = activity; 
     this.original_list = objects; 
    } 

    /** 
    * Viewholder pattern to minimize findViewById calls. 
    */ 
    private static class ViewHolder { 
     TextView name; 
     ImageView image; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     Model currentmodel = getItem(position); 

     View rowView = null; 
     if(convertView == null){ 
      rowView = activity.getLayoutInflater().inflate(R.layout.my_item, parent, false); 

      final ViewHolder holder = new ViewHolder(); 
      holder.name = (TextView) rowView.findViewById(R.id.item_text); 
      holder.image = (ImageView) rowView.findViewById(R.id.item_image); 
      rowView.setTag(holder); 
     } else { 
      rowView = convertView; 
     } 

     ViewHolder holder = (ViewHolder) rowView.getTag(); 
     holder.name.setText(currentmodel.my_string); 
     holder.friendship.setImageResource(currentmodel.resource_id); 

     return rowView; 
    }; 

    /** 
    * Returns a filter to the calling activity to filter the underlying data set by name. 
    */ 
    @Override 
    public Filter getFilter(){ 
     if(filter == null){ 
      filter = new ModelFilter(); 
     } 
     return filter; 
    } 

    /** Custom Filter implementation used to filter names alphabetically on a provided prefix. */ 
    private class ModelFilter extends Filter { 

     @Override 
     protected FilterResults performFiltering(CharSequence search) { 
      FilterResults filter_results = new FilterResults(); 
      String prefix = search.toString(); 

      /* If the search is empty, display the original dataset. */ 
      if(UserInputValidation.checkText(prefix).equals(StatusCode.NULL_INPUT)){ 
       filter_results.values = original_list; 
       filter_results.count = original_list.size(); 
      } else { 
           //make a copy of the original items and use that array list 
       final ArrayList<RelationshipModel> results = new ArrayList<RelationshipModel>(original_list); 
       final ArrayList<RelationshipModel> results_holder = new ArrayList<RelationshipModel>(); 

       int count = results.size(); 
       for(int i = 0; i < count; i++){ 
        final RelationshipModel model = results.get(i); 
        final String name = (model.first_name + " " + model.last_name).toLowerCase(Locale.US); 
        if(name.contains(prefix)) 
         results_holder.add(model); 
       } 
      filter_results.values = results_holder; 
      filter_results.count = results_holder.size(); 
      } 
      return filter_results; 
     } 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, 
       FilterResults results) { 
      clear(); 
      addAll((ArrayList<RelationshipModel>) results.values); 
     } 

    } 

} 
+0

что половина исправляет это. Как мне отображать изображения, которые также фильтруются, так как вышеупомянутый код только фильтрует текст, а не изображения. Также мне нужно будет сделать еще одну копию моего массива имен, поскольку, если я просто очистите(), то addAll() до моего имени массив, я потеряю все свои исходные данные. – slim1801

+0

Сделано редактирование с более конкретной прогулкой по – Submersed

+0

»(ArrayList ) results.values« Это, кажется, дает мне ошибку. Я следил за контуром вашего метода, однако, когда я запускаю свое приложение, когда я ввожу символ в блок edittext, он выходит из строя и не дает мне такой ошибки метода. – slim1801

0

Попробуйте это, я думаю, это поможет вам.

@Override 
    protected void publishResults(CharSequence charSequence, 
         FilterResults results) { 
    if(results.count==0) 
    { 
    notifyDataSetInvalidated(); 
    }else 
    { 
    names=(ArrayList<String> names)results.values; 
    notifyDataSetChanged(); 
    } 

    } 

Благодаря

Смежные вопросы