J'utilise ce tutoriel pour ajouter une recherche locale pour RecyclerView
dans laquelle les données proviennent de webservice. Le problème est quand je cherche quelque chose, seulement les deux premiers éléments montre. Et cela arrive à chaque fois que je cherche quelque chose. peu importe ce que je saisis, seuls les deux premiers éléments sont affichés. Mais quand j'efface SearchView
la liste totale montre encore ce qui est correct. Mais pourquoi la recherche actuelle ne filtre pas le bon article?Recyclage avec filtre Searchview ne fonctionne pas
public class ProductsByCategoryActivity extends AppCompatActivity implements SearchView.OnQueryTextListener {
private RecyclerView recycler;
private ProductsByCatAdapter adapter;
private ArrayList<Model> arrayList = new ArrayList<Model>();
private StaggeredGridLayoutManager gridmanager;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_productbycategory);
searchview = (SearchView) findViewById(R.id.searchview);
cd = new ConnectionDetector(ProductsByCategoryActivity.this);
recycler = (RecyclerView) findViewById(R.id.recycler);
adapter = new ProductsByCatAdapter(ProductsByCategoryActivity.this, arrayList);
recycler.setHasFixedSize(true);
gridmanager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
gridmanager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS);
recycler.setLayoutManager(gridmanager);
recycler.setItemAnimator(null);
recycler.setAdapter(adapter);
searchview.setIconifiedByDefault(false);
searchview.setOnQueryTextListener(this);
searchview.setSubmitButtonEnabled(true);
searchview.setQueryHint("Search Here");
String URL = Utility.PRODBYEVERYTHING;
prepareData(URL);
}
private void prepareData(final String URL) {
if (arrayList != null) arrayList.clear();
StringRequest stringRequest = new StringRequest(Request.Method.GET, URL,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
System.out.println("sammy_ProductsByCategoryActivity_response " + response);
try {
JSONObject jObj = new JSONObject(response);
if (jObj.getInt("ACK") == 1) {
JSONArray jsonArray = jObj.getJSONArray("all_products");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject main = jsonArray.getJSONObject(i);
Model home = new Model();
home.setTitle(main.getString("name"));
home.setImage(main.getString("image"));
home.setPrdid(main.getString("product_id"));
home.setUserid(main.getString("user_id"));
arrayList.add(home);
}
}
adapter.notifyDataSetChanged();
} catch (JSONException e) {
System.out.println("sammy_JSONError " + e);
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
if (error instanceof TimeoutError) {
Toast.makeText(ProductsByCategoryActivity.this, getString(R.string.tooslow), Toast.LENGTH_LONG).show();
} else if (error instanceof NoConnectionError) {
Toast.makeText(ProductsByCategoryActivity.this, getString(R.string.nointernet), Toast.LENGTH_LONG).show();
} else if (error instanceof AuthFailureError) {
System.out.println("sammy_AuthFailureError " + error);
} else if (error instanceof ServerError) {
System.out.println("sammy_ServerError " + error);
} else if (error instanceof NetworkError) {
System.out.println("sammy_NetworkError " + error);
} else if (error instanceof ParseError) {
System.out.println("sammy_ParseError " + error);
}
}
});
RequestQueue requestQueue = Volley.newRequestQueue(ProductsByCategoryActivity.this);
requestQueue.add(stringRequest);
stringRequest.setRetryPolicy(new DefaultRetryPolicy(
10000,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
adapter.getFilter().filter(newText);
return true;
}
}
public class ProductsByCatAdapter extends RecyclerView.Adapter<ProductsByCatAdapter.MyViewHolder> implements Filterable {
private List<Model> arrayList;
private List<Model> mFilteredList;
private Context context;
private SharedPref pref;
public ProductsByCatAdapter(Context context, List<Model> arrayList) {
this.arrayList = arrayList;
this.mFilteredList = arrayList;
this.context = context;
pref = new SharedPref(context);
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.rowlayout, parent, false);
return new MyViewHolder(itemView);
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String charString = charSequence.toString();
if (charString.isEmpty()) {
mFilteredList = arrayList;
} else {
ArrayList<Model> filteredList = new ArrayList<>();
for (Model item : arrayList) {
if (item.getTitle().toLowerCase().contains(charString)) {
filteredList.add(item);
}
}
mFilteredList = filteredList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = mFilteredList;
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
mFilteredList = (ArrayList<Model>) filterResults.values;
notifyDataSetChanged();
}
};
}
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
Model model = arrayList.get(position);
holder.name.setText(model.getTitle());
if (!TextUtils.isEmpty(model.getImage()))
Glide.with(context).load(model.getImage()).placeholder(R.drawable.defaultplaceholder).into(holder.image);
}
@Override
public int getItemCount() {
return mFilteredList.size();
}
class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView name;
ImageView image;
RelativeLayout relativeLayout;
MyViewHolder(View view) {
super(view);
name = (TextView) view.findViewById(R.id.titletxt);
image = (ImageView) view.findViewById(R.id.image);
relativeLayout = (RelativeLayout) view.findViewById(R.id.RL);
relativeLayout.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.RL:
int pos = getAdapterPosition();
String prdid = arrayList.get(pos).getPrdid();
String userid = arrayList.get(pos).getUserid();
System.out.println("sammy_ProductsByCatAdapter_prdid " + prdid);
System.out.println("sammy_ProductsByCatAdapter_userid " + userid);
if (userid.equals(pref.getString(Utility.USERID))) {
Intent intent = new Intent(context, MyProductDetailsActivity.class);
intent.putExtra("prdid", prdid);
context.startActivity(intent);
} else {
Intent intent = new Intent(context, OtherProductDetailsActivity.class);
intent.putExtra("prdid", prdid);
context.startActivity(intent);
}
break;
}
}
}
}
Voilà. Merci beaucoup. J'ai changé l'arraylist de 'arrayList' à' mFilteredList' et cela a fonctionné comme un charme. – CodeAssasins
Modèle model = arrayList.get (position); Modèle de modèle = mFilteredList .get (position); –
Accepter ma réponse si cela vous a aidé –