1

I have a recyclerview with some data and I have a searchview, and filter is working just fine. But un-filtering not working. I can't get the whole data in the recyclerview after un-filter. No data is showing. I have to re-open the activity to get data. I tried to used two data sets. But i have no idea where to use them.

My Fragment.

public class YourDealerListFragment extends Fragment {
    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";
    private static final String STATE_DEALER_LIST = "state_dealer_list";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;
    private VollySingleton vollySingleton;
    private RequestQueue requestQueue;
    private RecyclerView recyclerView;
    private DealerListAdapter dlAdapter;
    private HashMap<String, String> hashMap;
    private ArrayList<SuggestGetSet> dealerList = new ArrayList<>();
    private ArrayList<SuggestGetSet> filteredDealerList = new ArrayList<>();
    private String repNo;
    private StaggeredGridLayoutManager staggeredGridLayoutManager;
    private GridMenuFragment mGridMenuFragment;
    private Toolbar toolbar;
    private ItemSorter itemSorter;
    private Button sortButton;
    private SearchView searchView;
    private ProgressView progressView;
    public static List<String> disChannel;


    public YourDealerListFragment() {
        // Required empty public constructor
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment YourDealerListFragment.
     */
    // TODO: Rename and change types and number of parameters
    public static YourDealerListFragment newInstance(String param1, String param2) {
        YourDealerListFragment fragment = new YourDealerListFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
        vollySingleton = VollySingleton.getsInstance();
        requestQueue = vollySingleton.getmRequestQueue();


    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_your_dealer_list, container, false);
        recyclerView = (RecyclerView) view.findViewById(R.id.dealerListRecyclerView);
        progressView = (ProgressView) view.findViewById(R.id.pViewew);
        itemSorter = new ItemSorter();
        dlAdapter = new DealerListAdapter();
        disChannel = new ArrayList<String>();

        repNo = UserLogIn.getRepNo();

        if (savedInstanceState != null) {
            dealerList = savedInstanceState.getParcelableArrayList(STATE_DEALER_LIST);
            dlAdapter.setDealertList(dealerList);
        } else {
            getJsonRequest();
        }

        final FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.frame_layout);
        frameLayout.getBackground().setAlpha(0);
        final FloatingActionsMenu fabMenu = (FloatingActionsMenu) view.findViewById(R.id.fab_menu);
        final FloatingActionButton fabName = (FloatingActionButton) view.findViewById(R.id.fab_name);
        final FloatingActionButton fabCollection = (FloatingActionButton) view.findViewById(R.id.fab_collection);

        fabName.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                onSortByName();
                fabMenu.collapse();
            }
        });

        fabMenu.setOnFloatingActionsMenuUpdateListener(new FloatingActionsMenu.OnFloatingActionsMenuUpdateListener() {
            @Override
            public void onMenuExpanded() {
                frameLayout.getBackground().setAlpha(240);
                frameLayout.setOnTouchListener(new View.OnTouchListener() {
                    @Override
                    public boolean onTouch(View v, MotionEvent event) {
                        fabMenu.collapse();
                        return true;
                    }
                });
            }

            @Override
            public void onMenuCollapsed() {
                frameLayout.getBackground().setAlpha(0);
                frameLayout.setOnTouchListener(null);
            }
        });

        searchView = (SearchView) view.findViewById(R.id.dealerNameSearchView);
        searchView.setOnQueryTextListener(listener);

        //custom context menu
        mGridMenuFragment = GridMenuFragment.newInstance(R.drawable.background);
        setupGridMenu();


        mGridMenuFragment.setOnClickMenuListener(new GridMenuFragment.OnClickMenuListener() {
            @Override
            public void onClickMenu(GridMenu gridMenu, int position) {
                switch (position) {
                    case 0:
                        Intent intent = new Intent(getActivity(), SelectItem.class);
                        getActivity().finish();
                        startActivity(intent);
                        getActivity();
                        break;
                }
            }
        });

        //dealers' recycler view item click
        recyclerView.addOnItemTouchListener(new NavigationDrawerFragment.RecycleTouchListner(getActivity(), recyclerView, new NavigationDrawerFragment.ClickListener() {
            @Override
            public void onClick(View view, int position) {
                FragmentTransaction tx = getActivity().getSupportFragmentManager().beginTransaction();
                tx.replace(R.id.main_frame, mGridMenuFragment);
                tx.addToBackStack(null);
                tx.commit();

            }
        }));


        return view;
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {

        super.onViewCreated(view, savedInstanceState);
        setHasOptionsMenu(true);

        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        staggeredGridLayoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(staggeredGridLayoutManager);

        final ArrayList<SuggestGetSet> filteredModelList = new ArrayList<>();

        for (SuggestGetSet movie : filteredModelList) {
            filteredModelList.add(movie);
        }

        dlAdapter = new DealerListAdapter(filteredModelList, getActivity());
        recyclerView.setAdapter(dlAdapter);

    }

    //search dealer from search view
    SearchView.OnQueryTextListener listener = new SearchView.OnQueryTextListener() {

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

        }

        @Override
        public boolean onQueryTextChange(String s) {
            final ArrayList<SuggestGetSet> filteredModelList = filter(dealerList, s);
            dlAdapter.animateTo(filteredModelList);
            recyclerView.scrollToPosition(0);
            return true;
        }
    };

    private ArrayList<SuggestGetSet> filter(ArrayList<SuggestGetSet> models, String query) {
        query = query.toLowerCase();

        final ArrayList<SuggestGetSet> filteredModelList = new ArrayList<>();
        for (SuggestGetSet model : models) {
            final String text = model.getName().toLowerCase();
            if (text.contains(query)) {
                filteredModelList.add(model);
            }
        }
        return filteredModelList;
    }

    //custom context menu data
    private void setupGridMenu() {
        List<GridMenu> menus = new ArrayList<>();
        menus.add(new GridMenu("Order", R.drawable.nnn));
        menus.add(new GridMenu("Banking", R.drawable.n));
        menus.add(new GridMenu("Credit Note", R.drawable.nn));
        menus.add(new GridMenu("Cheques", R.drawable.nnnn));
        menus.add(new GridMenu("Invoice Dispatch", R.drawable.nnnnn));
        menus.add(new GridMenu("Goods Return", R.drawable.nnnnnn));

        mGridMenuFragment.setupMenu(menus);
    }


    private void getJsonRequest() {
        progressView.start();

        final SQLiteHandler sqLiteHandler = new SQLiteHandler(getActivity().getApplicationContext());
        Cursor cr = sqLiteHandler.getData(sqLiteHandler);
        cr.moveToFirst();

        do {
            repNo = cr.getString(0);
        } while (cr.moveToNext());
        cr.close();

        CustomJsonObjectRequest request = new CustomJsonObjectRequest(Request.Method.POST, AppConfig.URL_JSON_DEALER_LIST, hashMap, new Response.Listener<JSONObject>() {


            @Override
            public void onResponse(JSONObject response) {
                progressView.stop();

                try {
                    JSONObject jsonObject = new JSONObject(String.valueOf(response));
                    if (jsonObject.names().get(0).equals("feed")) {
                        dealerList = parseJsonResponse(response);
                        dlAdapter.setDealertList(dealerList);

                        JSONArray arrayAchSum = response.getJSONArray("feedd");
                        for (int i = 0; i < arrayAchSum.length(); i++) {
                            JSONObject obj3 = arrayAchSum.getJSONObject(i);
                            String a = obj3.getString("dis_channel");
                            disChannel.add(a);
                        }
                    } else {
                        Toast.makeText(getActivity(), "No Dealers Available", Toast.LENGTH_SHORT).show();
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                /*dealerList = parseJsonResponse(response);
                dlAdapter.setDealertList(dealerList);*/
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        }) {
            protected Map<String, String> getParams() throws AuthFailureError {
                hashMap = new HashMap<String, String>();
                hashMap.put("repNo", repNo);
                return hashMap;
            }
        };
        requestQueue.add(request);
        request.setRetryPolicy(new DefaultRetryPolicy(15 * 1000, 0,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    }

    private ArrayList<SuggestGetSet> parseJsonResponse(JSONObject response) {
        ArrayList<SuggestGetSet> groupList = new ArrayList<>();
        if (response != null || response.length() > 0) {

            try {

                JSONArray arrayDelaers = response.getJSONArray(KEY_FEED_NAME);

                for (int i = 0; i < arrayDelaers.length(); i++) {
                    JSONObject currentObject = arrayDelaers.getJSONObject(i);
                    String rep = currentObject.getString(KEY_REP_ID);
                    String name = currentObject.getString(KEY_REP_NAME);
                    String dealerId = currentObject.getString(KEY_DEALER_ID);

                    SuggestGetSet delaers = new SuggestGetSet();
                    delaers.setId(rep);
                    delaers.setName(name);
                    delaers.setDealerId(dealerId);

                    groupList.add(delaers);

                }
                //Toast.makeText(getApplicationContext(), productList.toString(), Toast.LENGTH_LONG).show();

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

        return groupList;
    }

    public void onSortByName() {
        itemSorter.sortItemByName(dealerList);
        dlAdapter.notifyDataSetChanged();

    }

    public static interface ClickListener {
        public void onClick(View view, int position);

        //public void onLongClick(View view, int position);

    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putParcelableArrayList(STATE_DEALER_LIST, dealerList);
    }
}

My Adapter class.

public class DealerListAdapter extends RecyclerView.Adapter<DealerListAdapter.ViewHolderDealerList> {
    private LayoutInflater layoutInflater;
    public Context mcontext;
    private List<SuggestGetSet> dealerArrayList;
    private List<SuggestGetSet> originalDealerArrayList;
    Typeface type;
    private static String selectedRepId, selectedDealerId, selectedDealerName;

    public DealerListAdapter() {
    }

    public DealerListAdapter(Context context) {

        layoutInflater = LayoutInflater.from(context);
        type = Typeface.createFromAsset(context.getAssets(), "helvr.ttf");
    }

    public static String getDealerName() {
        return selectedDealerName;
    }

    public static String getDealerID() {
        return selectedDealerId;
    }

    public static String getRepID() {
        return selectedRepId;
    }

    public DealerListAdapter(ArrayList<SuggestGetSet> dList, Context context) {
        this.mcontext = context;
        layoutInflater = LayoutInflater.from(context);
        dealerArrayList = new ArrayList<>(dList);
        originalDealerArrayList = new ArrayList<>(dList);
        type = Typeface.createFromAsset(context.getAssets(), "helvr.ttf");
    }

    public void setDealertList(ArrayList<SuggestGetSet> dealerAList) {
        this.dealerArrayList = dealerAList;
        originalDealerArrayList = new ArrayList<>(dealerAList);
        notifyItemRangeChanged(0, dealerArrayList.size());
    }

    @Override
    public ViewHolderDealerList onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = layoutInflater.inflate(R.layout.custom_dealer_list_layout, parent, false);
        ViewHolderDealerList viewHolderDealerList = new ViewHolderDealerList(view);
        return viewHolderDealerList;
    }

    @Override
    public void onBindViewHolder(ViewHolderDealerList holder, int position) {
        final SuggestGetSet model = dealerArrayList.get(position);
        holder.bind(model);

        final int pos = position;

        holder.dealerName.setText(dealerArrayList.get(position).getName());
        holder.dealerName.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                selectedDealerId = dealerArrayList.get(pos).getDealerId();
                selectedRepId = dealerArrayList.get(pos).getId();
                selectedDealerName = dealerArrayList.get(pos).getName();

                Toast.makeText(layoutInflater.getContext(), dealerArrayList.get(pos).getName() + " / " + dealerArrayList.get(pos).getDealerId() + " / " + dealerArrayList.get(pos).getId(), Toast.LENGTH_LONG).show();
            }
        });


    }

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

    public void setModels(ArrayList<SuggestGetSet> models) {
        dealerArrayList = new ArrayList<>(models);
    }

    static class ViewHolderDealerList extends RecyclerView.ViewHolder {
        private TextView dealerName, dealerId;

        public ViewHolderDealerList(View itemView) {
            super(itemView);
            dealerName = (TextView) itemView.findViewById(R.id.yourDelaerName);
            //dealerId = (TextView) itemView.findViewById(R.id.txtDelaerCollection);
        }

        public void bind(SuggestGetSet model) {
            dealerName.setText(model.getName());
        }

    }

    //search animations
    public SuggestGetSet removeItem(int position) {
        final SuggestGetSet model = dealerArrayList.remove(position);
        notifyItemRemoved(position);
        return model;
    }

    public void addItem(int position, SuggestGetSet model) {
        dealerArrayList.add(position, model);
        notifyItemInserted(position);
    }

    public void moveItem(int fromPosition, int toPosition) {
        final SuggestGetSet model = dealerArrayList.remove(fromPosition);
        dealerArrayList.add(toPosition, model);
        notifyItemMoved(fromPosition, toPosition);
    }

    public void animateTo(ArrayList<SuggestGetSet> models) {
        applyAndAnimateRemovals(models);
        applyAndAnimateAdditions(models);
        applyAndAnimateMovedItems(models);
    }

    private void applyAndAnimateMovedItems(ArrayList<SuggestGetSet> models) {
        for (int toPosition = dealerArrayList.size() - 1; toPosition >= 0; toPosition--) {
            final SuggestGetSet model = dealerArrayList.get(toPosition);
            final int fromPosition = models.indexOf(model);
            if (fromPosition >= 0 && fromPosition != toPosition) {
                moveItem(fromPosition, toPosition);
            }
        }
        notifyDataSetChanged();
    }

    private void applyAndAnimateAdditions(ArrayList<SuggestGetSet> models) {
        for (int i = 0, count = dealerArrayList.size(); i < count; i++) {
            final SuggestGetSet model = dealerArrayList.get(i);
            if (!models.contains(model)) {
                addItem(i, model);
            }
        }
        notifyDataSetChanged();
    }

    private void applyAndAnimateRemovals(ArrayList<SuggestGetSet> models) {
        for (int i = dealerArrayList.size() - 1; i >= 0; i--) {
            final SuggestGetSet model = dealerArrayList.get(i);
            if (!models.contains(model)) {
                removeItem(i);
            }
        }
        notifyDataSetChanged();

    }

}
  • 2
    http://www.tutorialsbuzz.com/2015/11/Android-Filter-RecyclerView-Using-SearchView-In-ToolBar.html – Pavya Apr 18 '16 at 12:09
  • I don't know how to thank you. It worked. Great stuff. Thank you very much. –  Apr 18 '16 at 12:23
  • can u help me with this? http://stackoverflow.com/questions/36712678/nullpointerexception-occure-when-clicking-the-navigationdrawer-item?noredirect=1#comment61011672_36712678 –  Apr 19 '16 at 09:54
  • Thanks @Pavya your post saved my time. Keep Posting... – Ketan Ramani Jan 26 '18 at 06:14

1 Answers1

0

Just Modify your function and Add check for null or "" . it will work fine

private ArrayList<SuggestGetSet> filter(ArrayList<SuggestGetSet> models, String query) {

        if(TextUtils.isEmpty(query)){
           return models;
        }
        query = query.toLowerCase();

        final ArrayList<SuggestGetSet> filteredModelList = new ArrayList<>();
        for (SuggestGetSet model : models) {
            final String text = model.getName().toLowerCase();
            if (text.contains(query)) {
                filteredModelList.add(model);
            }
        }
        return filteredModelList;
    }
N J
  • 25,967
  • 13
  • 73
  • 94
  • http://stackoverflow.com/questions/30398247/how-to-filter-a-recyclerview-with-a-searchviewhere also same issue has occurred. they suggest to keep a duplicate data set. i don't know how to use that. –  Apr 18 '16 at 11:46
  • 1
    This didn't work for my code. But thank you for your valuable response. –  Apr 18 '16 at 12:24