RecyclerView: No attached plugin; skipping layout

0

My problem is as follows I have a RecyclerView in which I try to display a list of shifts assigned to a selected doctor of spinner , on a selected day of my calendar. The issue is that it shows me the list but the program closes showing the following error RecyclerView: No adapter attached; skipping layout . And the line where I would be marking this error corresponds to getItemCount of my adapter . I share the code to see if you can help me.

ConsultTurno.java

import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.Toast;
import com.example.clinica.clinica.Controladores.ControladorEspecialidad;
import com.example.clinica.clinica.Controladores.ControladorFechas;
import com.example.clinica.clinica.Controladores.ControladorMedico;
import com.example.clinica.clinica.Controladores.ControladorTurno;
import com.example.clinica.clinica.R;
import com.example.clinica.clinica.UI.Adapters.TurnoAdapter;
import com.example.clinica.library.CalendarListener;
import com.example.clinica.library.CustomCalendarView;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

public class ConsultarTurno extends AppCompatActivity {

Context context;
static  Context c;
Spinner spEspecialidades, spEspecialistas;
String item, fecha, day;
RecyclerView turnoView;
CustomCalendarView calendario;
int dia, mes, año;
LinearLayout volver;
String medico;
public int posicion_esp;

private SimpleDateFormat formatoDia = new SimpleDateFormat("dd", Locale.getDefault());
private SimpleDateFormat formatoMes = new SimpleDateFormat("M", Locale.getDefault());
private SimpleDateFormat formatoAño = new SimpleDateFormat("yyyy", Locale.getDefault());


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_consultar_turno);
    context = ConsultarTurno.this;
    turnoView = (RecyclerView) findViewById(R.id.listaTurnosAsignados);
    turnoView.setHasFixedSize(true);
    turnoView.setLayoutManager(new LinearLayoutManager(context));
    turnoView.setAdapter(null);
    spEspecialidades = (Spinner) findViewById(R.id.spEspecialidadesConsultarTurno);
    spEspecialistas = (Spinner) findViewById(R.id.spEspecialistaConsultarTurno);
    calendario = (CustomCalendarView) findViewById(R.id.calendarioTurnosAsignados);
    final Calendar currentCalendar = Calendar.getInstance(Locale.getDefault());
    calendario.setFirstDayOfWeek(Calendar.MONDAY);
    calendario.setShowOverflowDate(false);
    calendario.refreshCalendar(currentCalendar);
    spEspecialistas.setEnabled(false);
    ControladorEspecialidad ctrlEspecialidad = new ControladorEspecialidad(context);
    ctrlEspecialidad.cargarSpinnerEspecialidades();
    volver = (LinearLayout) findViewById(R.id.btnVolverConsultarTurno);


    final ArrayAdapter<String> adaptador = new ArrayAdapter(context, android.R.layout.simple_spinner_item, ctrlEspecialidad.listaEspecialidades);
    spEspecialidades.setAdapter(adaptador);
    spEspecialidades.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            item = spEspecialidades.getSelectedItem().toString();
            ControladorMedico ctrlMedico = new ControladorMedico(context);
            if (item == "Seleccione") {
                spEspecialistas.setEnabled(false);
            } else {
                spEspecialistas.setEnabled(true);
                ctrlMedico.cargarSpinnerMedicos(item);

                final ArrayAdapter<CharSequence> adaptador = new ArrayAdapter(context, android.R.layout.simple_spinner_item, ctrlMedico.listaMedicos);
                spEspecialistas.setAdapter(adaptador);
                spEspecialistas.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                    @Override
                    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                        ControladorMedico ctrlMedico = new ControladorMedico(context);
                        posicion_esp = ctrlMedico.cargarSpinnerEspecialistas(spEspecialistas.getSelectedItem().toString());
                        spEspecialistas.setAdapter(adaptador);
                        spEspecialistas.setSelection(posicion_esp);
                        spEspecialistas.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                            @Override
                            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                                calendario.setCalendarListener(new CalendarListener() {
                                    @Override
                                    public void onDateSelected(Date date) {
                                        ControladorFechas ctrlFechas = new ControladorFechas(context);
                                        ControladorTurno ctrlTurno = new ControladorTurno(context);
                                        if (ctrlFechas.isPastDay(date) == false) {
                                            año = Integer.parseInt(formatoAño.format(date));
                                            mes = Integer.parseInt(formatoMes.format(date));
                                            dia = Integer.parseInt(formatoDia.format(date));
                                            day = ctrlFechas.filtrarDia(año, mes, dia);
                                            fecha = dia + "-" + mes + "-" + año;
                                            medico = spEspecialistas.getSelectedItem().toString();

                                            final TurnoAdapter adapter = new TurnoAdapter(context, ctrlTurno.listaTurnos(fecha, medico));
                                            turnoView.setAdapter(adapter);
                                            adapter.getFilter().filter(day);

                                        } else {
                                            turnoView.setAdapter(null);
                                            errorTurno();
                                            calendario.refreshCalendar(currentCalendar);
                                        }

                                    }

                                    @Override
                                    public void onMonthChanged(Date time) {

                                    }
                                });

                            }

                            @Override
                            public void onNothingSelected(AdapterView<?> parent) {

                            }
                        });

                    }

                    @Override
                    public void onNothingSelected(AdapterView<?> parent) {

                    }
                });}}

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });


}




        public static void confirmacion(){
    Toast.makeText(c, "El Turno ha sido dado de baja!!", Toast.LENGTH_LONG).show();
}

public void errorTurno(){
    Toast.makeText(context, "No se puede realizar consulta en esta fecha", Toast.LENGTH_SHORT).show();
}

}

ControllerTurno

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.example.clinica.clinica.DTO.Turno;
import com.example.clinica.clinica.sqlite.BaseDeDatos;
import com.example.clinica.clinica.sqlite.Tablas;
import java.util.ArrayList;
public class ControladorTurno {
Context context;


public ControladorTurno(Context context) {
    this.context = context;
}


public ArrayList<Turno> listaTurnos(String fecha, String medico) {
    BaseDeDatos db = new BaseDeDatos(context, null, null, 1);
    String sql = "SELECT * FROM " + Tablas.TABLA_TURNO + " WHERE " + Tablas.COLUMN_DIA_TURNO + " = '" + fecha + "' AND " + Tablas.COLUMN_ESPECIALISTA_TURNO + " = '" + medico + "';";
    SQLiteDatabase bd = db.getReadableDatabase();
    ArrayList<Turno> listaTurnos = new ArrayList<>();
    Cursor cursor = bd.rawQuery(sql, null);
    if (cursor.moveToFirst()) {
        do {

            long id = cursor.getLong(0);
            String paciente = cursor.getString(1);
            String hora = cursor.getString(4);
            listaTurnos.add(new Turno(id, paciente, hora));
        } while (cursor.moveToNext());
    }
    cursor.close();
    return listaTurnos;
}

}

TurnoAdapter

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.Filterable;

import com.example.clinica.clinica.Controladores.ControladorTurno;
import com.example.clinica.clinica.DTO.Turno;
import com.example.clinica.clinica.R;
import com.example.clinica.clinica.UI.Holders.TurnoHolder;
import com.example.clinica.clinica.UI.View.Turno.ConsultarTurno;
import com.example.clinica.clinica.sqlite.BaseDeDatos;
import java.util.ArrayList;


public class TurnoAdapter extends RecyclerView.Adapter<TurnoHolder> implements Filterable {


Context c;
ArrayList<Turno> turnos, listaFiltrada;
FiltroTurnos filtro;
BaseDeDatos db;
long idi;




public TurnoAdapter(Context ctx, ArrayList<Turno> turnos){
    this.c=ctx;
    this.turnos=turnos;
    this.listaFiltrada=turnos;

}



@Override
public TurnoHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.item_turno,null);

    //HOLDER
    TurnoHolder holder=new TurnoHolder(v);

    return holder;
}

@Override
public void onBindViewHolder(TurnoHolder holder, int position) {
    final Turno t = turnos.get(position);

    holder.paciente.setText(turnos.get(position).getPaciente());
    holder.hora.setText(turnos.get(position).getHora());


    holder.eliminar.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            idi = t.getId();
            AlertDialog.Builder builder = new AlertDialog.Builder(c);
            builder.setTitle(" - Confirmar - ");
            builder.setMessage("Estas seguro dar de baja el turno?");
            builder.setPositiveButton("SI", new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int which) {
                    ControladorTurno ctrlTurno = new ControladorTurno(c);
                    ctrlTurno.eliminarTurno(t.getId());
                    ((Activity)c).finish();
                    c.startActivity(((Activity) c).getIntent());
                    dialog.dismiss();
                    ConsultarTurno.confirmacion();
                }
            });
            builder.setNegativeButton("NO", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // Do nothing
                    dialog.dismiss();
                }
            });
            AlertDialog alert = builder.create();
            alert.show();
        }
    });

}

@Override
public int getItemCount() {

    return turnos.size();
}

@Override
public Filter getFilter() {

    if (filtro==null){
        filtro = new FiltroTurnos(listaFiltrada, this);
    }
    return filtro;
 }




 }

FilterTurns.java

import android.widget.Filter;
import com.example.clinica.clinica.DTO.Turno;
import com.example.clinica.clinica.UI.Adapters.TurnoAdapter;
import java.util.ArrayList;


public class FiltroTurnos extends Filter {

TurnoAdapter adapter;
ArrayList<Turno> listaFiltrada;

public FiltroTurnos(ArrayList<Turno>listaFiltrada, TurnoAdapter adapter){
    this.adapter=adapter;
    this.listaFiltrada=listaFiltrada;
}




@Override
protected Filter.FilterResults performFiltering(CharSequence constraint) {
    Filter.FilterResults r = new Filter.FilterResults();
    if (constraint != null && constraint.length()>0){
        constraint = constraint.toString().toUpperCase();
        ArrayList<Turno> filtroTurnos = new ArrayList<>();
        for (int i=0; i< listaFiltrada.size();i++){
            if (listaFiltrada.get(i).getFecha().toUpperCase().contains(constraint) || listaFiltrada.get(i).getHora().toUpperCase().contains(constraint)){
                filtroTurnos.add(listaFiltrada.get(i));
            }
        }
        r.count=filtroTurnos.size();
        r.values=filtroTurnos;
    }else{
        r.count=listaFiltrada.size();
        r.values=listaFiltrada;
    }
    return r;
}

@Override
protected void publishResults(CharSequence constraint, Filter.FilterResults r) {

    adapter.turnos = (ArrayList<Turno>) r.values;
    adapter.notifyDataSetChanged();

}


}
    
asked by Germanccho 27.11.2017 в 22:33
source

1 answer

0

The problem is that in your adapter, you are not validating if the list is null and it has no elements, so it falls in the line you mention, I recommend adding this validation:

@Override
public int getItemCount() {
    if (turnos != null)
      return turnos.size();
    return 0;
}
    
answered by 28.11.2017 / 02:11
source