Фильтруемый не работает должным образом в Recyclerview - PullRequest
0 голосов
/ 02 июня 2018

Итак, я попытался реализовать фильтруемый поиск в моем приложении. Предполагается, что фильтрация должна начаться в момент ввода.Но этого никогда не происходит.И вместо того, чтобы показывать нужные элементы, он просто сохраняет те же элементы и удаляет их снизу вверх в соответствии с количеством найденных элементов.Например, если адаптер имеет 4 элемента,

Банановый яблочный апельсин Лимонный

Строка поиска "e" будет отображаться: Банановый яблочный апельсин

, поскольку 3 элемента содержат«e», и он покажет первые 3. Адаптер ниже:

public class MenuListAdapter extends RecyclerView.Adapter<MenuListAdapter.ViewHolder> implements Filterable {
private static final String LOG_TAG = MenuListAdapter.class.getSimpleName();
private LayoutInflater mLayoutInflater;
private int mResourceId;
private ArrayList<Items> items;
private ArrayList<Items> itemsCopy;
private Context context;
private ClickListener clickListener;
private ItemsDAO itemsDAO;
private TextView category_description;

public MenuListAdapter(Context context, ArrayList<Items> items, LayoutInflater inflater, int resourceId, TextView category_description) {
    this.items = new ArrayList<>();
    itemsCopy = new ArrayList<>();
    this.items.addAll(items);
    itemsCopy.addAll(items);
    notifyItemInserted(items.size());
    this.context = context;
    mLayoutInflater = inflater;
    mResourceId = resourceId;
    this.category_description = category_description;
}

/**
 * Provide a reference to the type of views that you are using (custom ViewHolder)
 */
public class ViewHolder extends RecyclerView.ViewHolder {
    ImageView image;
    TextView title;
    TextView price;

    ViewHolder(View v) {
        super(v);

        title = v.findViewById(R.id.menu_title);
        image = v.findViewById(R.id.image);
        price = v.findViewById(R.id.menu_price);
        itemsDAO = new ItemsDAO(v.getContext());

        //Swipe languages
        if(Languages.getLocale(context).equals("en")) {
            title.setTypeface(AppUtils.getTypeface(context, AppUtils.FONT_REGULAR));
            price.setTypeface(AppUtils.getTypeface(context, AppUtils.FONT_MEDIUM));
            category_description.setTypeface(AppUtils.getTypeface(context, AppUtils.FONT_MEDIUM));
        }
        else {
            title.setTypeface(AppUtils.getTypeface(context, AppUtils.AR_FONT_LIGHT));
            price.setTypeface(AppUtils.getTypeface(context, AppUtils.FONT_MEDIUM));
            category_description.setTypeface(AppUtils.getTypeface(context, AppUtils.AR_FONT_MEDIUM));
        }

        v.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                if (clickListener != null) {
                    clickListener.itemClicked(v, getAdapterPosition(), items.get(getAdapterPosition()).getId(), false);
                    Log.d(LOG_TAG, "Element " + getAdapterPosition() + " clicked.");
                }
            }
        });

        v.setOnLongClickListener(new View.OnLongClickListener(){
            @Override
            public boolean onLongClick(View v) {
                if (clickListener != null) {
                    clickListener.itemClicked(v, getAdapterPosition(), items.get(getAdapterPosition()).getId(), true);

                }

                return true;
            }
        });

    }
}

// Create new view (invoked by the layout manager)
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
    View view = mLayoutInflater.inflate(mResourceId, viewGroup, false);
    return new ViewHolder(view);
}

// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, final int position) {
    //    Log.d(LOG_TAG, "Element " + position + " set.");

    final Items menuItems = items.get(position);

    category_description.setText(itemsDAO.getCategoryDescription(menuItems.getCategory_code()+ 9000));
    // Get element from MenuItems object at this position and replace the contents of the view
    // with that element
    //IMAGE STATIC HERE
    Bitmap decodedByte = BitmapFactory.decodeByteArray(Base64.decode(menuItems.getImage(), Base64.DEFAULT), 0, Base64.decode(menuItems.getImage(), Base64.DEFAULT).length);
    viewHolder.image.setImageBitmap(decodedByte);
    viewHolder.image.setTag(menuItems.getId());
    //Swipe languages
    if(Languages.getLocale(context).equals("en")) {
        viewHolder.title.setText(menuItems.getName());
    }
    else {
        viewHolder.title.setText(menuItems.getName2());
    }

    viewHolder.price.setText(Localization.getLocalize(context) + " " + Double.parseDouble(String.valueOf(menuItems.getPrice())));
}

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

public void setClickListener(ClickListener clickListener){
    this.clickListener = clickListener;

}


// An interface to Define click listener for the ViewHolder's View from any where.
public interface ClickListener{
    void itemClicked(View view, int position, int id, boolean isLongClick);
}

@Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {
            items.clear();
            String charString = charSequence.toString();
            if (charString.isEmpty()) {
                items.addAll(itemsCopy);
            } else {
                charString = charString.toLowerCase();
                int counter = 0;
                for(Items item: itemsCopy){
                    if(item.getName().toLowerCase().contains(charString)){
                        items.add(item);
                    }
                    else
                    {
                        notifyItemRemoved(counter);
                    }
                    counter++;
                }
            }

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

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
            items = (ArrayList<Items>) filterResults.values;

            // refresh the list with filtered data
            notifyDataSetChanged();
        }
    };
}}

Код searchView во фрагменте

case R.id.action_search: {
            android.support.v7.widget.SearchView searchView = (android.support.v7.widget.SearchView) item.getActionView();
            searchView.setOnQueryTextListener(
                    new android.support.v7.widget.SearchView.OnQueryTextListener() {
                        @Override
                        public boolean onQueryTextSubmit(String query) {
                            menuListAdapter.getFilter().filter(query);
                            return false;
                        }

                        @Override
                        public boolean onQueryTextChange(String query) {
                            menuListAdapter.getFilter().filter(query);
                            return false;
                        }
                    }
            );

            return true;
        }

Вот что происходит, при вводе ничего не меняется:

while type

После отправки поиска, вот что происходит, 3 элемента содержат «ca», поэтому отображаются только первые 3 элемента:

enter image description here

И когда я нажимаю на первый элемент, он передает правильный идентификатор и переходит к правильному отфильтрованному элементу, который содержит «ca».

enter image description here

Это для pskink

public class MenuListAdapter extends MatchableRVArrayAdapter<Items, MenuListAdapter.ViewHolder> {
private static final String LOG_TAG = MenuListAdapter.class.getSimpleName();
private ClickListener clickListener;
private ItemsDAO itemsDAO;
private TextView category_description;

public MenuListAdapter(Context context, int resource, List<Items> objects, TextView category_description) {
    super(context, resource, objects);
    this.category_description = category_description;

}

/**
 * Provide a reference to the type of views that you are using (custom ViewHolder)
 */
public class ViewHolder extends RecyclerView.ViewHolder {
    ImageView image;
    TextView title;
    TextView price;

    ViewHolder(View v) {
        super(v);

        title = v.findViewById(R.id.menu_title);
        image = v.findViewById(R.id.image);
        price = v.findViewById(R.id.menu_price);
        itemsDAO = new ItemsDAO(v.getContext());

        //Swipe languages
        if(Languages.getLocale(getContext()).equals("en")) {
            title.setTypeface(AppUtils.getTypeface(getContext(), AppUtils.FONT_REGULAR));
            price.setTypeface(AppUtils.getTypeface(getContext(), AppUtils.FONT_MEDIUM));
            category_description.setTypeface(AppUtils.getTypeface(getContext(), AppUtils.FONT_MEDIUM));
        }
        else {
            title.setTypeface(AppUtils.getTypeface(getContext(), AppUtils.AR_FONT_LIGHT));
            price.setTypeface(AppUtils.getTypeface(getContext(), AppUtils.AR_FONT_MEDIUM));
            category_description.setTypeface(AppUtils.getTypeface(getContext(), AppUtils.AR_FONT_MEDIUM));
        }

        v.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                if (clickListener != null) {
                    clickListener.itemClicked(v, getAdapterPosition(), getAdapterPosition(), false);
                    Log.d(LOG_TAG, "Element " + getAdapterPosition() + " clicked.");
                }
            }
        });

        v.setOnLongClickListener(new View.OnLongClickListener(){
            @Override
            public boolean onLongClick(View v) {
                if (clickListener != null) {
                    clickListener.itemClicked(v, getAdapterPosition(), getAdapterPosition(), true);

                }

                return true;
            }
        });

    }
}


@Override
protected ViewHolder onCreateHolder(View view) {
    return new ViewHolder(view);
}

@Override
protected void onBindHolder(Items item, ViewHolder holder, int position) {
    category_description.setText(itemsDAO.getCategoryDescription(item.getCategory_code()+ 9000));
    // Get element from MenuItems object at this position and replace the contents of the view
    // with that element
    //IMAGE STATIC HERE
    Bitmap decodedByte = BitmapFactory.decodeByteArray(Base64.decode(item.getImage(), Base64.DEFAULT), 0, Base64.decode(item.getImage(), Base64.DEFAULT).length);
    holder.image.setImageBitmap(decodedByte);
    holder.image.setTag(item.getId());
    //Swipe languages
    if(Languages.getLocale(getContext()).equals("en")) {
        holder.title.setText(item.getName());
    }
    else {
        holder.title.setText(item.getName2());
    }

    holder.price.setText(Localization.getLocalize(getContext()) + " " + Double.parseDouble(String.valueOf(item.getPrice())));

}

public void setClickListener(ClickListener clickListener){
    this.clickListener = clickListener;

}


// An interface to Define click listener for the ViewHolder's View from any where.
public interface ClickListener{
    void itemClicked(View view, int position, int id, boolean isLongClick);
}

@Override
protected boolean matches(Items value, CharSequence constraint, CharSequence lowerCaseConstraint) {
    return super.matches(value, constraint, lowerCaseConstraint);
}}

И все же, когда я начинаю печатать, ничего не меняется:

while type

После отправки поиска, это то, что происходит, есть 3 элемента, содержащие «ca», поэтому он показывает только первые 3 элемента:

enter image description here

И когда я нажимаю на первый элемент, он передает правильный идентификатор и переходит к правильному отфильтрованному элементу, который содержит «ca».

enter image description here

1 Ответ

0 голосов
/ 03 июня 2018

Я обнаружил, что реализация AlphaInAnimationAdapter вызывает проблему, мне просто нужно было удалить

alphaAdapter = new AlphaInAnimationAdapter(menuListAdapter);
            mRecyclerView.setAdapter(new ScaleInAnimationAdapter(alphaAdapter));

из моего кода, и теперь он работает безупречно с классом адаптера Pskink.Спасибо Pskink за вашу помощь!

...