使用recyclerview从筛选列表中选择错误的项目

时间:2017-03-22 11:25:10

标签: android android-edittext android-recyclerview recycler-adapter recyclerview-layout

我有一个RecyclerView& EditText上。我可以从RecyclerView&中选择项目。得到正确的项目,除非它没有被过滤。 在输入EditText时,RecyclerView列表被过滤&当我从列表中选择任何项目时,它会显示实际的列表项而不是选择的项目。

片段类:

    public class RegionListFragment extends DialogFragment implements View.OnClickListener,
            OnRecylerViewClickable {

        private RecyclerView regionRecyclerView;
        private ArrayList<RegionDetail> regionDetailArrayList = new ArrayList<>();
        private GenericRegionListAdapter genericRegionListAdapter;
        private Context context = this.getActivity();
        private RecyclerView.LayoutManager mLayoutManager;
        private View view;
        private EditText editTextSearchView;
        private DatabaseHandler spcl_databaseHandler;

        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            view = inflater.inflate(R.layout.spinner_fragment_list_screen, container, false);

databaseHandler = new DatabaseHandler(getActivity());
            regionDetailArrayList = (ArrayList<RegionDetail>) spcl_databaseHandler.getAllRegionDetails();

            editTextSearchView = (EditText) view.findViewById( R.id.search);
            editTextSearchView.setHint(getString(R.string.region_search_hint));
            mLayoutManager = new LinearLayoutManager(context);
            regionRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView_Locations);
            regionRecyclerView.setLayoutManager(mLayoutManager);
            relativeLayoutBottom = (RelativeLayout) view.findViewById(R.id.rlBottom);

             genericRegionListAdapter = new GenericRegionListAdapter(context, regionDetailArrayList, this, false);
            regionRecyclerView.setAdapter(genericRegionListAdapter);

            addTextListener();

            return view;
        }

        public void addTextListener(){
            editTextSearchView.addTextChangedListener(new TextWatcher() {
                public void afterTextChanged(Editable s) {}
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
                public void onTextChanged(CharSequence query, int start, int before, int count) {
                    genericRegionListAdapter.getFilter().filter(query.toString());
                }
            });
        }

        @Override
        public void onClick(View view) {
        }

        @Override
        public void onRecyclerItemClicked(int position, String itemName, String itemID) {
    Log.v("Region Name", " : " + regionDetailArrayList.get(position).getRegionName());
        }
    }

适配器类:

public class GenericRegionListAdapter extends RecyclerView.Adapter<GenericRegionListAdapter.DataObjectHolder>
        implements Filterable {

    private ArrayList<RegionDetail> originalArrayList;
    private ArrayList<RegionDetail> filterArrayList;
    private GenericRegionListAdapter.ValueFilter valueFilter;
    private OnRecylerViewClickable onRecylerViewClickable;
    private Context mContext = null;

    @Override
    public GenericRegionListAdapter.DataObjectHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.sd_custom_cardview_for_walk_list_item, parent, false);

        GenericRegionListAdapter.DataObjectHolder dataObjectHolder = new GenericRegionListAdapter.DataObjectHolder(view);
        return dataObjectHolder;
    }

    @Override
    public Filter getFilter() {
        if (valueFilter == null) {
            valueFilter = new GenericRegionListAdapter.ValueFilter();
        }
        return valueFilter;
    }

    public class DataObjectHolder extends RecyclerView.ViewHolder{
        TextView textViewWalkName;

        public DataObjectHolder(View itemView) {
            super(itemView);

            mContext = itemView.getContext();
            textViewWalkName = (TextView) itemView.findViewById(R.id.textView_Walk_Name);
        }

    }

    public GenericRegionListAdapter(Context context, ArrayList<RegionDetail> detailsArrayList,
                                  OnRecylerViewClickable onRecylerViewClickable, boolean doShowCheckbox) {
        mContext = context;
        this.originalArrayList = detailsArrayList;
        this.filterArrayList = detailsArrayList;
        this.onRecylerViewClickable = onRecylerViewClickable;
    }

    @Override
    public void onBindViewHolder(final GenericRegionListAdapter.DataObjectHolder holder, final int position) {
        holder.textViewWalkName.setText(originalArrayList.get(position).getRegionName());
        holder.textViewWalkName.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                onRecylerViewClickable.onRecyclerItemClicked(position, originalArrayList.get(position).getRegionName(), originalArrayList.get(position).getRegionID());
            }
        });
    }

    // method to access in activity after updating selection
    public ArrayList<RegionDetail> getRegionList() {
        return originalArrayList;
    }
    @Override
    public int getItemCount() {
        return originalArrayList.size();
    }

    private class ValueFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();

            if (constraint != null && constraint.length() > 0) {
                ArrayList<RegionDetail> filterList = new ArrayList<RegionDetail>();
                for (int i = 0; i < filterArrayList.size(); i++) {
                    if ((filterArrayList.get(i).getRegionName().toUpperCase())
                            .contains(constraint.toString().toUpperCase())) {
                        RegionDetail listItem = new RegionDetail();
                        listItem.setRegionID(filterArrayList.get(i).getRegionID());
                        listItem.setRegionName(filterArrayList.get(i).getRegionName());
                        filterList.add(listItem);
                    }
                }
                results.count = filterList.size();
                results.values = filterList;
            } else {
                results.count = filterArrayList.size();
                results.values = filterArrayList;
            }
            return results;

        }

        @Override
        protected void publishResults(CharSequence constraint,
                                      FilterResults results) {
            originalArrayList = (ArrayList<RegionDetail>) results.values;
            notifyDataSetChanged();
            Log.v("Size", " : " + originalArrayList.size());
            if (originalArrayList.size() == 0) {
                new GlobalToast().showToastMessage(mContext, mContext.getResources().getString(R.string.no_records_found));
            }
        }
    }
}

请帮帮我。

1 个答案:

答案 0 :(得分:0)

请使用此代码段

private class ItemFilter extends Filter {
        String filterString;
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {

            filterString = constraint.toString().toLowerCase();

            FilterResults results = new FilterResults();

                int count = filterArrayList.size();
               ArrayList<RegionDetail> filterList = new ArrayList<RegionDetail>();
                String filterableString;
                for (int i = 0; i < count; i++) {

                   RegionDetail listItem = new RegionDetail();
                    listItem.setRegionID(filterArrayList.get(i).getRegionID());
                    listItem.setRegionName(filterArrayList.get(i).getRegionName());
                    filterList.add(listItem);
                }
                results.values =filterList;
                results.count = filterList.size();

                return results;

        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {

               originalArrayList = (ArrayList<RegionDetail>) results.values;
                notifyDataSetChanged();

        }
    }

我希望此代码能够正确过滤您的列表,并在右键单击列表项。