Ich verwende dieses Tutorial, um eine lokale Suche nach RecyclerView
hinzuzufügen, in der Daten vom Webservice kommen. Problem ist, wenn ich etwas suche, nur die ersten beiden Einträge anzeigen. Und das passiert jedes Mal, wenn ich nach etwas suche. was auch immer ich eintrage nur die ersten beiden Items werden angezeigt. Aber wenn ich SearchView
lösche, zeigt die Gesamtliste wieder an, welche korrekt ist. Aber warum filtert die eigentliche Suche nicht das richtige Element?Recyclerview mit Searchview-Filter funktioniert nicht
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;
}
}
}
}
Das ist es. Danke vielmals. Ich änderte die Arraylist von 'arrayList' zu' mFilteredList' und es funktionierte wie ein Zauber. – CodeAssasins
Modell model = arrayList.get (Position); Modell model = mFilteredList .get (Position); –
Akzeptiere meine Antwort, wenn es dir geholfen hat –