RecyclerView带有SearchView错误重新过滤

时间:2016-03-08 04:51:23

标签: android filter android-recyclerview

输入过滤器工作正常但删除了一些单词后无法显示列表中的项目。重新过滤不起作用。我找不到解决方案,

这是我的Adapter类。

public class DealerListAdapter extends RecyclerView.Adapter<DealerListAdapter.ViewHolderDealerList> {
    private LayoutInflater layoutInflater;
    public Context mcontext;
    private ArrayList<SuggestGetSet> dealerArrayList = new ArrayList<>();
    Typeface type;
    private static String selectedRepId, selectedDealerId, selectedDealerName;

    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> list, Context context) {
        this.mcontext = context;
        layoutInflater = LayoutInflater.from(context);
        this.dealerArrayList = list;
        type = Typeface.createFromAsset(context.getAssets(), "helvr.ttf");
    }

    public void setDealertList(ArrayList<SuggestGetSet> dealerAList) {
        this.dealerArrayList = 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);
        //SuggestGetSet currentDealer = dealerArrayList.get(position);
        //holder.dealerName.setText(currentDealer.getName());
        //holder.dealerName.setTypeface(type);
        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();
    }
}

这是我的片段类。

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";

    // 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 String repNo;
    private StaggeredGridLayoutManager staggeredGridLayoutManager;
    private GridMenuFragment mGridMenuFragment;
    private Toolbar toolbar;


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

        getJsonRequest();

        //get data from sqlite
        final SQLiteHandler sqLiteHandler = new SQLiteHandler(getActivity().getApplicationContext());
        Cursor cr = sqLiteHandler.getData(sqLiteHandler);
        cr.moveToFirst();

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

        cr.close();


        //listview
        ListView listView = (ListView) view.findViewById(R.id.listViewChoose);


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

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

        dealerList = new ArrayList<>();

        staggeredGridLayoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(staggeredGridLayoutManager);
        dlAdapter = new DealerListAdapter(dealerList,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);
            dlAdapter.notifyDataSetChanged();
            return true;

        }
    };

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

        query = query.toLowerCase();
        if (query.equals("")) {
            dlAdapter.notifyDataSetChanged();
            return dealerList;

        }

        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() {

        CustomJsonObjectRequest request = new CustomJsonObjectRequest(Request.Method.POST, AppConfig.URL_JSON_DEALER_LIST, hashMap, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                try {
                    JSONObject jsonObject = new JSONObject(String.valueOf(response));
                    if (jsonObject.names().get(0).equals("feed")) {
                        dealerList = parseJsonResponse(response);
                        dlAdapter.setDealertList(dealerList);

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

    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 static interface ClickListener {
        public void onClick(View view, int position);

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

    }
}

这是我的SuggestGetSet类。

public class SuggestGetSet {

    String dealer_id, rep_id, dealer_name;

    public SuggestGetSet() {

    }

    public SuggestGetSet(String dealer_id, String id, String name) {
        this.dealer_id=dealer_id;
        this.rep_id=id;
        this.dealer_name=name;
        /*this.setDealerId(dealer_id);
        this.setName(name);*/
    }

    public String getId() {
        return rep_id;
    }

    public void setId(String id) {
        this.rep_id = id;
    }

    public String getDealerId() {
        return dealer_id;
    }

    public void setDealerId(String dealer_id) {
        this.dealer_id = dealer_id;
    }

    public String getName() {
        return dealer_name;
    }

    public void setName(String name) {
        this.dealer_name = name;
    }
}

1 个答案:

答案 0 :(得分:0)

原因是您在适配器中只使用了一个列表,因此一旦删除了数据,就不会再显示它。

我建议有两个清单。一个是完整列表,另一个是您显示的列表。因此,当您搜索时,您可以搜索完整列表并将相关项添加到您显示的列表中。

这也不是进行搜索的最佳方式,因为搜索是在主线程中完成的。

尝试使用Filterable。一个例子如下。

公共类YourAdapter扩展了RecyclerView.Adapter实现了Filterable {

private ArrayList<YourModel> mCompleteList, mFilteredList;
private Context context;

public RecyclerLiquorAdapter(Context context ArrayList<LiquorItem> mCompleteList) {
    this.context = context;
    this.mCompleteList = mCompleteList;
    mFilteredList = new ArrayList<>(mCompleteList);

}

@Override
public RecyclerLiquorAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  //Your createViewHolder implementation


}

@Override
public void onBindViewHolder(final RecyclerLiquorAdapter.ViewHolder holder, final int position) {   
 //Your bindview holder implementation
}


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


public class ViewHolder extends RecyclerView.ViewHolder {
   //Your view holder implementation
}



@Override
public Filter getFilter() {
    return new MyFilter(this, mCompleteList);
}

public static class MyFilter extends Filter {

    private final MyAdapter adapter;

    private final List<Model> originalList;

    private final List<Model> filteredList;

    public LiquorFilter(RecyclerLiquorAdapter adapter, List<LiquorItem> originalList) {
        this.adapter = adapter;
        this.originalList = originalList;
        this.filteredList = new ArrayList<>();
    }

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        filteredList.clear();
        FilterResults results = new FilterResults();
        // We implement here the filter logic
        if (constraint == null || constraint.length() == 0) {
            // No filter implemented we return all the list
            filteredList.addAll(originalList);
        } else {
          //Implement your filter logic here

                }
            }
        }
        results.values = filteredList;
        results.count = filteredList.size();
        return results;
    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        // Now we have to inform the adapter about the new list filtered
        adapter.mFilteredList.clear();
        adapter.mFilteredList.addAll((ArrayList<LiquorItem>) results.values);
        adapter.notifyDataSetChanged();
    }
}

通过使用此功能,您可以确保所有列表操作都在后台线程中完成,并且您的UI不受影响。