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