Фильтрация в моем кастомном адаптере не работает - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь добавить фильтр в свой адаптер recylerview. Я следую этому уроку https://www.androidhive.info/2017/11/android-recyclerview-with-search-filter-functionality/. Но я использую текст редактирования. Вот как я установил свой текст редактирования

<EditText
    android:imeOptions="flagNoExtractUi"
    android:hint="Search"
    android:id="@+id/itemsearch"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

и вот как я настраиваю свой поиск

     itemsearch.addTextChangedListener(new TextWatcher() {
                @Override
                public void afterTextChanged(Editable arg0) {
                    String text = itemsearch.getText().toString().toLowerCase(Locale.getDefault());
                    adapter_order.getFilter().filter(text);
                    Log.d("TEXT", text);
                }

                @Override
                public void beforeTextChanged(CharSequence arg0, int arg1,
                                              int arg2, int arg3) {
                }

                @Override


 public void onTextChanged(CharSequence arg0, int arg1, int arg2,
                                      int arg3) {

                // TODO Auto-generated method stub
            }
        });

и вот мой filter() внутри моего адаптера

 @Override
    public Filter getFilter() {

         Log.d("GO", "GO FILTER");

        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) {
                String charString = charSequence.toString();
                Log.d("MYS", charString);
                if (charString.isEmpty()) {
                    listfilter = list;
                } else {
                    List<Model_item> filteredList = new ArrayList<>();
                    for (Model_item row : list) {
                        if (row.getItemName().toLowerCase().contains(charString.toLowerCase()) || row.getItemCode().contains(charSequence)) {
                            filteredList.add(row);
                        }
                    }
                    listfilter = filteredList;
                }

                FilterResults filterResults = new FilterResults();
                filterResults.values = listfilter;
                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
                listfilter = (ArrayList<Model_item>) filterResults.values;
                notifyDataSetChanged();
            }
        };
    }

но ничего не случилось. а мой Log.d внутри filter() не показывает

ОБНОВЛЕНИЕ ---

После некоторой попытки я могу отфильтровать объект, но столкнулся с проблемой Вот проблема:

По умолчанию у меня есть два предмета. Предмет A и Предмет B, затем я фильтрую, чтобы получить Предмет B. Но когда я щелкаю Пункт B, я получаю значение Предмета A

Вот мой клик.

mList.addOnItemTouchListener(new RecyclerItemClickListener(MainActivity.this, mList, new RecyclerItemClickListener.OnItemClickListener() {
    @Override
    public void onItemClick(View view, int position) {
        Model_item modelitem = itemList.get(position);
        Model_order m_order = new Model_order(modelitem.getItemCode(),modelitem.getItemName(),modelitem.getItemPrice() , "1" );
        if(contains( arrayOfOrders, modelitem.getItemCode())){

        }else{
            adapter_order.add(m_order);
        }
    }
    @Override
    public void onItemLongClick(View view, int position) {
        Log.d("long", "POS " + 1);
    }
}));

и я использую это https://gist.github.com/ashmeh6/915099545b96a536ad78a75b3b16daa6 (нашел его из SO ответа)

...