2017-09-13 6 views
1

私の問題は、私のリストビュー項目でフィルタリング可能な検索ビューを実装していることです。それはうまく動作しますが、検索が実行され、searchViewが空の場合、前の項目は取得できません。私はnotifyDataSetChangedを試しましたが、それは私のためには機能しませんでした。私は何をしますか?リストビューを更新していますandroid

.... 
private ListView mListNotes; 
NoteListAdapter na; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mListNotes = (ListView) findViewById(R.id.main_listview); 
     mListNotes.setTextFilterEnabled(true); 

    } 
    @Override 
    protected void onResume() { 
     super.onResume(); 
     //load data into the listview and display 
     mListNotes.setAdapter(na); 
    } 

    @Override 
    public boolean onQueryTextChange(String query) { 
     if (!query.equals("")) { 
      na.getFilter().filter(query); // filter listView items when text is inputted. 

     } else { 
     na.notifyDataSetChanged();   // what do i put here to refresh my list view after search? 

     } 
     return false; 
    } 
} 

// ListView Adapter 


class NoteListAdapter extends ArrayAdapter<Note> implements Filterable{ 
    List<Note> objects; 
    private List<Note> mStringFilterList; 
    Filter filter; 
    private static final int WRAP_CONTENT_LENGTH = 5; 
    public NoteListAdapter(Context context, int resource, List<Note> objects) { 
     super(context, resource, objects); 
     this.objects = objects; 
     this.mStringFilterList = objects; 

    } 

    @Override 
    public int getCount() { 
     return objects.size(); 
    } 

    @Nullable 
    @Override 
    public Note getItem(int position) { 
     return objects.get(position); 
    } 

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


    @Override 
    public Filter getFilter() { 
     filter = new Filter() { 
      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 
       ArrayList<Note> tempList= new ArrayList<>(); 
       FilterResults results = new FilterResults(); 
       if (constraint != null && objects != null) { 
        for(Note singleNote : objects) { 
         if(singleNote.getTitle().contains(constraint)) 
          tempList.add(singleNote); 
        } 
        results.values = tempList; 
        results.count = tempList.size(); 
       } 

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

      } 
     }; 
     return filter; 

     } 


    } 


} 
+0

。 –

+0

na.getFilter()。clearFilter(); clearFilter()を定義します。 –

+0

clearFilter()にfilterList = originalListとnotifyDataSetChanged()が含まれています。 –

答えて

0

読むコメントこのクラス

class NoteListAdapter extends ArrayAdapter<Note> implements Filterable 
{ 
List<Note> objects; 
private List<Note> mStringFilterList; 
Filter filter; 
private static final int WRAP_CONTENT_LENGTH = 5; 
public NoteListAdapter(Context context, int resource, List<Note> objects) { 
    super(context, resource, objects); 
    this.objects = objects; 
    this.mStringFilterList = objects; 

} 

@Override 
    public int getCount() { 
    return mStringFilterList.size(); // change this line 
    } 

@Nullable 
@Override 
public Note getItem(int position) { 
    return mStringFilterList.get(position); // change this line 
} 

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


@Override 
public Filter getFilter() { 
    filter = new Filter() { 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      ArrayList<Note> tempList= new ArrayList<>(); 
      FilterResults results = new FilterResults(); 
      if (constraint != null && constraint.length() > 0 && objects != null) { 
       for(Note singleNote : objects) { 
        if(singleNote.getTitle().contains(constraint)) 
         tempList.add(singleNote); 
       } 
       results.values = tempList; 
       results.count = tempList.size(); 
      } 

      // add else block. 
      else 
      { 
      results.values = objects; 
       results.count = objects.size(); 
      } 

      return results; 
     } 
     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      mStringFilterList = (ArrayList<Note>) results.values; // change this line 
      notifyDataSetChanged(); 

     } 
    }; 
    return filter; 

    } 


} 
+0

あなたは私の日を救った。ありがとうございました! – Benfight

0

フィルタリングされたデータで元のデータを置き換えています。以下のコードを使用します。

class NoteListAdapter extends ArrayAdapter<Note> implements Filterable { 
     List<Note> objects; 
     private List<Note> originalList = new ArrayList<>(); 
     Filter filter; 
     private static final int WRAP_CONTENT_LENGTH = 5; 

     public NoteListAdapter(Context context, int resource, List<Note> objects) { 
      super(context, resource, objects); 
      this.objects = objects; 
      this.originalList.addAll(objects); 
     } 

     @Override 
     public int getCount() { 
      return objects.size(); 
     } 

     @Nullable 
     @Override 
     public Note getItem(int position) { 
      return objects.get(position); 
     } 

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


     @Override 
     public Filter getFilter() { 
      filter = new Filter() { 
       @Override 
       protected FilterResults performFiltering(CharSequence constraint) { 
        ArrayList<Note> tempList = new ArrayList<>(); 
        FilterResults results = new FilterResults(); 
        if (objects != null) { 
         if(constraint != null && !constraint.equals("")) { 
          for (Note singleNote : objects) { 
           if (singleNote.getTitle().contains(constraint)) 
            tempList.add(singleNote); 
          } 
          results.values = tempList; 
          results.count = tempList.size(); 
         }else { 
          tempList.clear(); 
          tempList.addAll(originalList); 
          results.values = tempList; 
          results.count = tempList.size(); 
         } 
        } 

        return results; 
       } 

       @Override 
       protected void publishResults(CharSequence constraint, FilterResults results) { 
        objects = (ArrayList<Note>) results.values; 
        notifyDataSetChanged(); 
       } 
      }; 
      return filter; 
     } 
    } 

はそれが役に立てば幸い:)あなたは、フィルタのコードを投稿していないコードが で全体のアダプタクラスを変更したり、交換する必要が

+0

plsは私のコードを確認します。私はアダプタクラスを追加しました – Benfight

+0

答えを更新しました。試してみてください@Benfight –

+0

これらの3行のコードtempList.clear(); tempList.addAll(originalList); results.values = tempList;単一行のresults.values = originalListで置き換えることができます。フィルタが呼び出されるたびに常に新しい空のテンプレートオブジェクトが作成されます。 –

関連する問題