Фильтрация предметов в утилите - PullRequest
0 голосов
/ 18 февраля 2019

Мой текст редактируется так медленно при наборе текста.Я нашел много решений, но ничто не помогает мне.Чтобы отфильтровать предметы из списка переработчиков по имени, я пишу следующий код:

private void editSearchListener() {
    editSearch.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        adapter.getFilter().filter(charSequence);
        return;

    }

    @Override
    public void afterTextChanged(Editable editable) {

    }
});
}

Класс фильтра:

public class CustomFilter extends Filter {
    private MyAdapter adapter;
    private List<Data> filterList;

    public CustomFilter(List<Data> filterList, MyAdapter adapter) {
        this.filterList = filterList;
        this.adapter = adapter;
    }

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        FilterResults results=new FilterResults();
        if(constraint != null && constraint.length() > 0) {
            constraint=constraint.toString().toUpperCase();
            List<Data> filteredPlayers = new ArrayList<>();
            for (int i=0;i<filterList.size();i++) {
                if(filterList.get(i).getName().toUpperCase().startsWith((String)constraint)) {
                    filteredPlayers.add(filterList.get(i));
                }
            }
            results.count=filteredPlayers.size();
            results.values=filteredPlayers;
        } else {
            results.count=filterList.size();
            results.values=filterList;
        }
        return results;
    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        adapter.mData= (ArrayList<Data>) results.values;
        adapter.notifyDataSetChanged();
    }
}

И мой адаптер:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.DataViewHolder> implements Filterable {

    public List<Data> mData;
    private OnItemClickListener itemClickListener;
    private CustomFilter filter;


    public MyAdapter(List<Data> mData) {
        this.mData = mData;
    }

    @NonNull
    @Override
    public DataViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.data_item, viewGroup, false);
        DataViewHolder dataViewHolder = new DataViewHolder(v);
        return dataViewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull DataViewHolder dataViewHolder, int i) {
        dataViewHolder.tvId.setText(String.valueOf(mData.get(i).getId()));
        dataViewHolder.tvName.setText(mData.get(i).getName());
        dataViewHolder.tvCreated.setText(mData.get(i).getCreatedAt());
    }

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

    public class DataViewHolder extends RecyclerView.ViewHolder{
        private   TextView tvId;
        private   TextView tvName;
        private  TextView tvCreated;

        public DataViewHolder(@NonNull View itemView) {
            super(itemView);

            tvId = itemView.findViewById(R.id.tv_data_id);
            tvName = itemView.findViewById(R.id.tv_data_name);
            tvCreated = itemView.findViewById(R.id.tv_data_created);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if(itemClickListener != null) {
                        itemClickListener.onClick(mData != null && mData.size() != 0 ? mData.get(getAdapterPosition()): null);
                    }
                }
            });

        }
    }

    public interface OnItemClickListener {
        void onClick(Data data);
    }

    public void setOnItemClickListener (OnItemClickListener onItemClickListener) {
        this.itemClickListener = onItemClickListener;
    }

    @Override
    public Filter getFilter() {
        if(filter==null) {
            filter=new CustomFilter(mData,this);
        }
        return filter;
    }
}

Но когда я печатаюкакой-то текст так медленно работаетНо если я удаляю событие addTextChangeListener, то оно работает нормально.Как оптимизировать мой код, пожалуйста, помогите мне.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Вместо вызова метода фильтра на onTextChanged вам следует выбрать afterTextChanged, чтобы ваш новый код был

   private void editSearchListener() {
    editSearch.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        return;

    }

    @Override
    public void afterTextChanged(Editable editable) {
        adapter.getFilter().filter(editable.toString);

    }
});
}

Таким образом, ваш пользовательский интерфейс не зависнет.

0 голосов
/ 18 февраля 2019

Надеюсь, это вам поможет.

Вместо вызова adapter.getFilter().filter(charSequence); в onTextChanged замените его на afterTextChanged

private void editSearchListener() {
   editSearch.addTextChangedListener(new TextWatcher() {
     @Override
     public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

      }

     @Override
     public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            return;
     }

    @Override
    public void afterTextChanged(Editable editable) {
             adapter.getFilter().filter(charSequence);
     }
   });
}

Поскольку onTextChanged выполняется во время изменения текста,поэтому он может работать медленно.

Попробуйте afterTextChanged, он запустится сразу после изменения текста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...