RecycleView filter

0

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;
}
    
asked by Josu Vázquez 16.04.2018 в 18:32
source

0 answers