2017-10-20 27 views
0

Il y a plus de 2 000 éléments sur ma listview et peu importe quel élément je recherche, après avoir appuyé sur une lettre, listView devient vide comme si il n'y avait pas d'articles pertinents.Essayer de filtrer un ListView avec un SearchView. Aucun élément n'est affiché quel que soit le mot que j'entre, même si des éléments pertinents existent sur le ListView

Je suppose que c'est parce que j'utilise la mise en page simple_list_item_2 qui est fournie par Android Studio. Il a deux champs textView dessus et c'est pourquoi le filtrage peut être foiré. C'est juste une supposition de la mienne cependant.

est ici l'adaptateur et listview:

  adapter = new ArrayAdapter(ViewExistingCustomersActivity.this, android.R.layout.simple_list_item_2, android.R.id.text1, customers) { 
       @Override 
       public View getView(int position, View convertView, ViewGroup parent) { 
        View view = super.getView(position, convertView, parent); 
        TextView text1 = (TextView) view.findViewById(android.R.id.text1); 
        TextView text2 = (TextView) view.findViewById(android.R.id.text2); 

        text1.setText(customers.get(position).getDefinition()); 
        text2.setText(customers.get(position).getAddress1() + " Bakiye: " + customers.get(position).getBalance()); 
        return view; 
       } 
      }; 

customersListView.setAdapter(adapter); 

      // Dokunulan ListView elemanının detaylarını gösterecek ekranı çağıran kod. 
      customersListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
        Intent viewCustomerDetailsIntent = new Intent(ViewExistingCustomersActivity.this, CurrentStatementActivity.class); 
        viewCustomerDetailsIntent.putExtra("customer", customers.get(i)); 
        viewCustomerDetailsIntent.putExtra("user", user); 
        startActivity(viewCustomerDetailsIntent); 
       } 
      }); 

Et voici le SearchView:

customersSearchView.setOnQueryTextListener(new OnQueryTextListener() { 
      @Override 
      public boolean onQueryTextSubmit(String query) { 
       return false; 
      } 

      @Override 
      public boolean onQueryTextChange(String newText) { 
       adapter.getFilter().filter(newText); 
       return false; 
      } 
     }); 
+2

double possible de [Comment filtrer un RecyclerView avec un SearchView] (https: // stackoverflow. com/questions/30398247/how-to-filter-a-recyclview-avec-une-searchview) –

Répondre

1

Si vous utilisez un ContentProvider pour récupérer votre liste de données, puis la ligne suivante dans onQueryTextChange() ne fonctionnera pas :

adapter.getFilter().filter(newText); 

Si vous utilisez un CursorLoader (avec le ContentProvider), vous devez filtrer les données en utilisant les LoaderManager callbacks, ne pas utiliser l'adaptateur directement. Vous auriez besoin de changer votre méthode onQueryTextChange() à quelque chose comme ceci:

private String cursorFilter; 

@Override 
public boolean onQueryTextChange(String newText) { 
    cursorFilter = !TextUtils.isEmpty(newText) ? newText : null; 
    getLoaderManager().restartLoader(0, null, this); 
    return true; 
} 

@Override 
public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    Uri baseUri; 
    if (cursorFilter != null) { 
     // Filter the data with the cursorFilter 
     baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 
             Uri.encode(cursorFilter)); 
    } else { 
     baseUri = MyContentProvider.CONTENT_URI; 
    } 

    ... 
} 

Voir ici pour un exemple: http://android-er.blogspot.co.uk/2013/02/query-contacts-database-using-loader.html

0

Vous peut mettre en œuvre le modèle custumer toString pour retourner la chaîne que vous voulez filtrer avec.

le modèle que vous avez (la sur cette reuturn en customers.get (position))

public class Custumer { 
    //The rest as is 
    @Override public String toString() { 
     return getDefinition(); 
    } 
} 
+0

pouvez-vous éléborer? –