The filter does not filter the recycleview correctly, it shows the correct number of items but the items do not change position.
This is my RecycleView
public class RecycleViewAdapter extends
RecyclerView.Adapter<RecycleViewAdapter.ViewHolder> implements Filterable{
public static ArrayList Class_Canciones
lista_canciones,lista_canciones_filtrada;
private int layout;
private OnItemClickListener listener;
public RecycleViewAdapter(ArrayList<Class_Canciones> lista, OnItemClickListener listener, int layout){
this.listener=listener;
this.lista_canciones_filtrada=lista;
this.lista_canciones =lista;
this.layout=layout;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(layout, parent, false);
ViewHolder vh = new ViewHolder(itemView);
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.bind(lista_canciones_filtrada.get(position),listener);
}
@Override
public int getItemCount() {
return lista_canciones_filtrada.size();
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String charString = charSequence.toString();
if (charString.isEmpty()) {
lista_canciones_filtrada = lista_canciones;
} else {
ArrayList<Class_Canciones> filteredList = new ArrayList<>();
for (Class_Canciones cancion : lista_canciones) {
if (cancion.getTitulo().toLowerCase().contains(charString.toLowerCase())) {
filteredList.add(cancion);
}
}
lista_canciones_filtrada = filteredList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = lista_canciones_filtrada;
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
lista_canciones_filtrada = (ArrayList<Class_Canciones>) filterResults.values;
// refresh the list with filtered data
notifyDataSetChanged();
}
};
}
public static class ViewHolder extends RecyclerView.ViewHolder {
private TextView nombre, numero, info;
public ViewHolder(View itemView) {
super(itemView);
this.nombre= (TextView) itemView.findViewById(R.id.txt_titulos);
this.numero= (TextView) itemView.findViewById(R.id.txt_numero);
this.info= (TextView) itemView.findViewById(R.id.txt_artista_album);
}
public void bind(final Class_Canciones clase, final OnItemClickListener listener){
String artista = clase.getArtista();
String disco = clase.getAlbum();
this.nombre.setText(clase.getTitulo());
this.numero.setText(getAdapterPosition()+1+"");
this.info.setText(artista +" / " + disco);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onItemClick(clase, getAdapterPosition());
}
});
}
}
public interface OnItemClickListener{
void onItemClick(Class_Canciones clase, int position);
}
This is the call to the Filter
@Override
public boolean onQueryTextChange(String newText) {
recycle_adapter.getFilter().filter(newText);
return true;
}