2017-06-20 1 views
0

J'essaie d'implémenter le SearchView dans la barre d'outils. Lorsque j'essaie de faire une recherche dans ma liste, la liste d'origine est toujours retournée et non la nouvelle liste en essayant de faire la recherche.SearchView.OnQueryTextListner toujours retourner la liste d'origine

Lorsque je débogue, il commence à afficher la nouvelle liste avec la quantité correcte d'éléments à l'intérieur de celui-ci, mais quand c'est fait, il retourne juste la taille de la liste d'origine.

Lors du débogage, il passe dans publicResults mais ne met pas à jour l'adaptateur. Je ne sais pas pourquoi il obtient la nouvelle liste, mais ne remplace pas l'ancienne.

activité qui implémente l'SearchView

public class LoadsActivity extends AppCompatActivity implements SearchView.OnQueryTextListener{ 

    @Inject 
    Lazy<IMyLoadsRetroService> retroService; 

    @Inject 
    IUser user; 

    public LoadsActivity() { 
     Injector.INSTANCE.getViewComponent(this).inject(this); 
    } 


    public static void startLoadsActivity(Context context) { 
     Intent loadsIntent = new Intent(context, LoadsActivity.class); 
     context.startActivity(loadsIntent); 
    } 

    @BindView(R.id.recyclerView) 
    RecyclerView recyclerView; 
    @BindView(R.id.loadProgressBar) 
    ProgressBar loadProgressBar; 
    @BindView(R.id.fab) 
    FloatingActionButton fab; 

    LoadAdapter loadAdapter; 
    private List<IMyLoadSummary> myLoadSummaryList = new ArrayList<>(); 

    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_loads); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     ButterKnife.bind(this); 

     recyclerView.setLayoutManager(new LinearLayoutManager(this)); 
     loadAdapter = new LoadAdapter(this, myLoadSummaryList); 
     recyclerView.setAdapter(loadAdapter); 

     loadProgressBar.setVisibility(View.VISIBLE); 

     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       MainActivity.startLoadsActivity(LoadsActivity.this); 
      } 
     }); 


     retroService.get().getMyLoads().subscribeOn(Schedulers.io()).observeOn(rx.android.schedulers.AndroidSchedulers.mainThread()) 
       .subscribe(new Subscriber<List<MyLoadSummary>>() { 
        @Override 
        public void onCompleted() { 
         loadProgressBar.setVisibility(View.GONE); 
        } 

        @Override 
        public void onError(Throwable e) { 
         Toaster.s(LoadsActivity.this, e.getMessage()); 
        } 

        @Override 
        public void onNext(List<MyLoadSummary> myLoadSummaries) { 
         loadAdapter.setLoadData(myLoadSummaries); 
        } 
       }); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 

     SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
     final MenuItem searchItem = menu.findItem(R.id.action_search); 
     final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); 

     searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 
     searchView.setOnQueryTextListener(this); 
     return true; 
    } 



    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_search) { 


      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    public void onBackPressed() { 
     //leaving blank to disable back button 
    } 


    @Override 
    public boolean onQueryTextSubmit(String query) { 
     return false; 
    } 

    @Override 
    public boolean onQueryTextChange(String newText) { 
     loadAdapter.getFilter().filter(newText); 
     return true; 
    } 
} 

adaptateur avec le filtre

public class LoadAdapter extends RecyclerView.Adapter<LoadAdapter.ViewHolder> implements Filterable { 

    private Context mContext; 
    private List<? extends IMyLoadSummary> originalList; 
    private List<? extends IMyLoadSummary> filteredList; 

    public LoadAdapter(Context context, List<IMyLoadSummary> list) { 
     this.mContext = context; 
     this.originalList = list; 
     this.filteredList = list; 

     getFilter(); 
    } 

    public void setLoadData(List<? extends IMyLoadSummary> mLoadData) { 
     originalList = mLoadData; 
     notifyDataSetChanged(); 
    } 

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

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     Gson gson = GsonFactory.getDefault(); 
     String jsonListString = gson.toJson(originalList.get(position)); 
     holder.loadsTextView.setText(jsonListString); 
    } 

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

    @Override 
    public Filter getFilter() { 
     return new Filter() { 
      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 
       FilterResults filteredResults = new FilterResults(); 
       if (constraint != null && constraint.length() > 0) { 
        ArrayList<IMyLoadSummary> tempList = new ArrayList<>(); 

        //search content for any number...hopefully 
        for (IMyLoadSummary myLoadSummary : originalList) { 
         if (Integer.toString(myLoadSummary.getNumber()).contains(constraint.toString())) { 
          tempList.add(myLoadSummary); 
         } 
        } 
        filteredResults.count = tempList.size(); 
        filteredResults.values = tempList; 
       } else { 
        filteredResults.count = originalList.size(); 
        filteredResults.values = originalList; 
       } 

       return filteredResults; 
      } 

      @Override 
      protected void publishResults(CharSequence constraint, FilterResults results) { 
       filteredList = (List<? extends IMyLoadSummary>) results.values; 
       notifyDataSetChanged(); 
      } 
     }; 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder { 

     public TextView loadsTextView; 

     public ViewHolder(View itemView) { 
      super(itemView); 

      loadsTextView = (TextView) itemView.findViewById(R.id.loadJSONText); 
     } 
    } 
} 

Répondre

0

ce que je veux suggérer est de sauvegarder simplement les données dans android sqlite puis exécutez le select * from nom_table where nom comme '% string% "'; interroger et l'afficher dans listview .hope il vous aide c'est un moyen simple de faire la recherche et le plus rapide aussi