2017-09-11 3 views
0

J'ai cette application qui récupère des données d'une base de données MySql et les analyse dans un recyclerView. J'ai un editText et je veux être en mesure de filtrer les éléments recyclerView tout en tapant.Filtrer un RecyclerView avec un EditText

Voici mon MainActivity (SearchAvtivity):

public class SearchActivity extends AppCompatActivity { 
 
    private static final String TAG = "Search Activity"; 
 
    private Context mContext = SearchActivity.this; 
 
    private static final int ACTIVITY_NUM = 1; 
 

 
    String urlAddress = "myDatabaseAddressGoesHere.PHP"; 
 

 

 
    @Override 
 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
 
     super.onCreate(savedInstanceState); 
 
     setContentView(R.layout.activity_search); 
 
     Log.d(TAG, "onCreate: started"); 
 
     setupBottomNavigationView(); 
 
     final RecyclerView rv = (RecyclerView) findViewById(R.id.SearchRv); 
 
     rv.setLayoutManager(new LinearLayoutManager(this)); 
 
     rv.setItemAnimator(new DefaultItemAnimator()); 
 
     Downloader dl = new Downloader(SearchActivity.this,urlAddress,rv); 
 
     dl.execute(); 
 
    } 
 
      
 
      
 

 
    /** 
 
    * Setup Bottom Navigation View 
 
    */ 
 

 
    private void setupBottomNavigationView(){ 
 
     Log.d(TAG, "setupBottomNavigationView: Setting up Bottom Navigation View"); 
 
     BottomNavigationViewEx bottomNavigationViewEx = (BottomNavigationViewEx)findViewById(R.id.bottom_nav_bar); 
 
     BottomNavigationViewHelper.setupBottomNavigationView(bottomNavigationViewEx); 
 
     BottomNavigationViewHelper.enableNavigation(mContext,bottomNavigationViewEx); 
 
     Menu menu = bottomNavigationViewEx.getMenu(); 
 
     MenuItem menuItem = menu.getItem(ACTIVITY_NUM); 
 
     menuItem.setChecked(true); 
 

 
    } 
 
}

et voici le MyAdapter:

public class MyAdapter extends RecyclerView.Adapter<MyHolder> { 
 

 
    Context c; 
 
    ArrayList<SpaceCraft> spaceCrafts; 
 
    List<MyHolder> displayedList; 
 

 
    public MyAdapter(Context c, ArrayList<SpaceCraft> spaceCrafts) { 
 
     this.c = c; 
 
     this.spaceCrafts = spaceCrafts; 
 
    } 
 

 
    @Override 
 
    public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.search_adapter_vertical,parent,false); 
 
     return new MyHolder(v); 
 
    } 
 

 
    @Override 
 
    public void onBindViewHolder(MyHolder holder, int position) { 
 
     holder.nameTv.setText(spaceCrafts.get(position).getName()); 
 
     holder.addressTv.setText(spaceCrafts.get(position).getAddress()); 
 
     holder.phoneTv.setText(spaceCrafts.get(position).getPhone()); 
 
     holder.emailTv.setText(spaceCrafts.get(position).getEmail()); 
 

 
    } 
 

 
    @Override 
 
    public int getItemCount() { 
 
     return spaceCrafts.size(); 
 
    } 
 
}

Ido ne sait pas si vous avez besoin de voir les vlasses: downloader, parser, connecteur ou support. Je vous en prie, dites-moi s'il vous plaît.

+0

double possible de [Android - Mise en œuvre filtre de recherche à un RecyclerView] (https://stackoverflow.com/questions/40754174/android-implementing-search-filter-to-a-recyclerview) – Raghavendra

Répondre

-1

Vous pouvez le faire avec un TextWatcher sur votre editText et à l'intérieur, filtrer votre liste.

Exemple:

((EditText) findViewById(R.id.your_edit_text)).addTextChangedListener(new TextWatcher() { 
    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
    } 

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

    @Override 
    public void afterTextChanged(Editable s) { 
     String text = s.toString(); 
     ArrayList<String> yourCopyList = new ArrayList<>(yourList) 
     yourList.clear(); 
     if (text.isEmpty()) { 
      addAllYourDataToList(); 
     } else { 
      text = text.toLowerCase(); 
      for (int i = 0; i<yourCopyList.size(); i++) { 
       // Adapt the if for your usage 
       if (yourCopyList.get(i).getName().toLowerCase().contains(text)) { 
        yourList.add("the string"); 
       } 
      } 
     } 
     adapter.notifyDataSetChanged(); 
    } 
}); 

Dans cet exemple, vous supprimez toutes les données de votre liste et d'ajouter que les données correspondantes sur votre filtre texte

+0

où dois-je ajouter cette textWatcher ? – abe

+0

c'est votre editText ((EditText) findViewById (R.id.your_edit_text)) et ajoutez-y un addTextChangedListener() cette méthode prend un textwatcher sur l'argument. Je suppose que votre editText est dans votre activité donc mettez ce code en activité – Vodet

+0

Je l'ai fait comme vous l'avez dit, mais dans la dernière partie de la partie "yourList.add (" la chaîne) "J'ai l'erreur: ajouter (***** ********* SpaceCract) dans ArrayList ne peut pas être appliqué à (java.lang.string) – abe

0

Vous devriez utiliser un TextWatcher() Pour RecyclerView.