Мой текст редактируется так медленно при наборе текста.Я нашел много решений, но ничто не помогает мне.Чтобы отфильтровать предметы из списка переработчиков по имени, я пишу следующий код:
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, то оно работает нормально.Как оптимизировать мой код, пожалуйста, помогите мне.