'Android search view won't work in fragment
When I try to search for members in the search view nothing shows up. Everything just vanishes.
all_members
public class all_members extends Fragment {
ProgressDialog pg;
RecyclerView recyclerView;
AllMembersCustomAdapter myAdapter;
RecyclerView.LayoutManager layoutManager;
ArrayList<AllMembersRecyclerRepresent> members;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
OnBackPressedCallback callback = new OnBackPressedCallback(true) {
@Override
public void handleOnBackPressed() {
FragmentTransaction fr = getActivity().getSupportFragmentManager().beginTransaction();
fr.replace(R.id.fragment_container,new Home());
fr.commit();
}
};
requireActivity().getOnBackPressedDispatcher().addCallback(callback);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//this line is very important the bwlo line will set the search view
setHasOptionsMenu(true);
return inflater.inflate(R.layout.all_member, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
pg=new ProgressDialog(getContext());
pg.setTitle("Please wait...");
pg.setMessage("Loading all members");
pg.setCanceledOnTouchOutside(false);
pg.show();
setHasOptionsMenu(true);
super.onViewCreated(view, savedInstanceState);
recyclerView=getActivity().findViewById(R.id.r_view_member);
recyclerView.setHasFixedSize(true);
layoutManager = new LinearLayoutManager(getContext());
members = new ArrayList<>();
getvolley();
Log.d("mem",members.toString());
recyclerView.setLayoutManager(layoutManager);
myAdapter = new AllMembersCustomAdapter(members);
recyclerView.setAdapter(myAdapter);
}
public void getvolley(){
//volley and get all members list
String url="";
RequestQueue queue = Volley.newRequestQueue(getActivity());
JsonArrayRequest requestUrl=new JsonArrayRequest(Request.Method.POST, url, null,new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
for(int i=0;i< response.length();i++){
try {
JSONObject jsonObject = response.getJSONObject(i);
AllMembersRecyclerRepresent ar= new AllMembersRecyclerRepresent();
ar.setName( jsonObject.getString("name"));
ar.setSurname( jsonObject.getString("surname"));
ar.setPh_no( jsonObject.getString("ph_no"));
String id=( jsonObject.getString("member_id"));
String email=( jsonObject.getString("email"));
String is_active=( jsonObject.getString("is_active"));
String dob=( jsonObject.getString("date_of_birth"));
String medical_history=( jsonObject.getString("medical_history"));
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
LocalDate date = org.joda.time.LocalDate.parse(dob, formatter);
ar.setDOB(String.valueOf(date));
Log.d("date:",String.valueOf(date));
ar.setId(id);
ar.setDOB(String.valueOf(date));
ar.setEmail(email);
ar.setIs_active(is_active);
ar.setMedical_history(medical_history);
ar.setIs_active(is_active);
members.add(ar);
} catch (JSONException e) {
e.printStackTrace();
}
myAdapter.notifyDataSetChanged();
}
pg.cancel();
Toast.makeText(getContext(), "Total Members: "+myAdapter.getItemCount(), Toast.LENGTH_LONG).show();
Toast.makeText(getContext(), "Total Members: "+myAdapter.getItemCount(), Toast.LENGTH_LONG).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getContext(), error+"Something went wrong.\nPlease check your internet connection", Toast.LENGTH_LONG).show();
pg.cancel();
}
});
MySingleton.getInstance(getActivity()).addRequestQueue(requestUrl);
}
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
inflater.inflate(R.menu.menuu,menu);
MenuItem item = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) item.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
myAdapter.getFilter().filter(newText);
return false;
}
});
super.onCreateOptionsMenu(menu, inflater);
}
AdapterCode
public class AllMembersCustomAdapter extends RecyclerView.Adapter<AllMembersCustomAdapter.ViewHolder> implements Filterable {
private final ArrayList<AllMembersRecyclerRepresent> members;
//member's list without being filtered
private final ArrayList<AllMembersRecyclerRepresent>allMembers;
public AllMembersCustomAdapter(ArrayList<AllMembersRecyclerRepresent> list){
members=list;
allMembers=new ArrayList<>(list);
}
public class ViewHolder extends RecyclerView.ViewHolder{
TextView name,surname,ph_no,dob;
ImageView status;
public ViewHolder(@NonNull View itemView) {
super(itemView);
name=itemView.findViewById(R.id.nameR);
surname=itemView.findViewById(R.id.surnameR);
ph_no=itemView.findViewById(R.id.ph_noR);
dob=itemView.findViewById(R.id.dob_r);
status=itemView.findViewById(R.id.statusR);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//this returns the position of the item clicked
int position= getAdapterPosition();
//members.get(position).getName() this return the data in the array list
// Toast.makeText(view.getContext(), "position clicked is "+String.valueOf(
// members.get(position).getName()), Toast.LENGTH_SHORT).show();
String name= members.get(position).getName();
String surname = members.get(position).getSurname();
String ph_no = members.get(position).getPh_no();
String id = members.get(position).getId();
String email = members.get(position).getEmail();
String is_active = members.get(position).getIs_active();
String dob = members.get(position).getDOB();
String medical_history = members.get(position).getMedical_history();
Intent i = new Intent(view.getContext(), memberInfo.class);
i.putExtra("name",name);
i.putExtra("surname",surname);
i.putExtra("ph_no",ph_no);
i.putExtra("id",id);
i.putExtra("email",email);
i.putExtra("is_active",is_active);
i.putExtra("dob",dob);
i.putExtra("medical",medical_history);
view.getContext().startActivity(i);
}
});
}
}
@NonNull
@Override
public AllMembersCustomAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.all_members_recycler,parent,false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull AllMembersCustomAdapter.ViewHolder holder, int position) {
holder.itemView.setTag(members.get(position));
holder.name.setText(members.get(position).getName());
holder.ph_no.setText(members.get(position).getPh_no());
holder.surname.setText(members.get(position).getSurname());
holder.dob.setText(members.get(position).getId());
//setting image
//volley to see if the member is Active or not
if(members.get(position).getIs_active()=="true"){
holder.status.setImageResource(R.drawable.active);
}else{
holder.status.setImageResource(R.drawable.inactive);
}
}
@Override
public int getItemCount() {
return members.size();
}
@Override
public Filter getFilter() {
return filter;
}
Filter filter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
ArrayList<AllMembersRecyclerRepresent> filteredList = new ArrayList<>();
if(charSequence==null || charSequence.length()==0){
//if empty show all movies
filteredList.addAll(allMembers);
}else{
String filterPattern = charSequence.toString().toLowerCase().trim();
for(AllMembersRecyclerRepresent mem:allMembers){
if(mem.getName().toLowerCase().contains(filterPattern)){
filteredList.add(mem);
}
}
}
FilterResults filterResults = new FilterResults();
filterResults.values=filteredList;
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
members.clear();
members.addAll((ArrayList) filterResults.values);
notifyDataSetChanged();
}
};
}
When I click on search the list just becomes blank.
menu
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/action_search"
android:title="SEARCH"
android:icon="@drawable/search"
app:showAsAction="always|collapseActionView"
app:actionViewClass="androidx.appcompat.widget.SearchView"
/>
</menu>
I even tried the same on another activity but still it doesn't work. What am I doing wrong here. The data in the recycler view is being fetched by the server but it won't filter out when clicked on search.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
