How to pass data from an Activity to an Adapter?

1

Hello my problem is the following one I am developing an app in android where I have an Activity and a RecyclerView.Adapter, where what I want is to pass some parameters from the activity to the adapter by means of in intent. The problem is that I can not send the data that is inside the method to send data to the adapter.

AssignTurning.java

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CalendarView;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Spinner;

import com.example.clinica.clinica.DTO.Atencion;
import com.example.clinica.clinica.DTO.Especialidad;
import com.example.clinica.clinica.DTO.Medico;
import com.example.clinica.clinica.sqlite.BaseDeDatos;
import com.example.clinica.clinica.sqlite.Tablas;

import java.util.ArrayList;
import java.util.Calendar;

public class AsignarTurno extends AppCompatActivity{

CalendarView calendarView;
RecyclerView turnoView;
public String fecha;
String hora, dia, medicos;
EditText edtPaciente, edtEspecialista;
ImageButton addPaciente, addEspecialista;
BaseDeDatos db;
Spinner spEspecialidades, spEspecialistas;
String nombre, apellido;
private Dialog dialog;
ArrayList<String> listaMedicos, listaEspecialidades;
ArrayList<Medico> MedicosList;
ArrayList<Especialidad> EspecialidadesList;
AtencionAdapter adp;
AtencionHolder holder;


String item;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_asignar_turno);
    db = new BaseDeDatos(this, null, null, 1);
    turnoView = (RecyclerView) findViewById(R.id.listaTurnosDisponibles);
    turnoView.setLayoutManager(new LinearLayoutManager(this));
    turnoView.setItemAnimator(new DefaultItemAnimator());
    calendarView = (CalendarView) findViewById(R.id.calendario);
    addPaciente = (ImageButton) findViewById(R.id.addPaciente);
    addEspecialista = (ImageButton) findViewById(R.id.addEspecialista);
    edtPaciente = (EditText) findViewById(R.id.turnoPaciente);
    edtEspecialista = (EditText) findViewById(R.id.turnoEspecialista);



    addEspecialista.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            LayoutInflater inflater = getLayoutInflater();
            final View dialogLayout = inflater.inflate(R.layout.dialog_especialista, null);

            spEspecialidades = (Spinner) dialogLayout.findViewById(R.id.spEspecialidades);
            spEspecialistas = (Spinner) dialogLayout.findViewById(R.id.spEspecialista);
            Button aceptar = (Button) dialogLayout.findViewById(R.id.btnAceptarEspecialista);
            Button cancelar = (Button) dialogLayout.findViewById(R.id.btnCancelarEspecialista);
            cargarSpinnerEspecialidades();


            final ArrayAdapter<String> adaptador = new ArrayAdapter(AsignarTurno.this, android.R.layout.simple_spinner_item, 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();
                    if (item == "Seleccione") {
                        spEspecialistas.setEnabled(false);
                    } else {
                        spEspecialistas.setEnabled(true);

                        cargarSpinnerMedicos(item);

                        final ArrayAdapter<String> adapter = new ArrayAdapter(AsignarTurno.this, android.R.layout.simple_spinner_item, listaMedicos);
                        spEspecialistas.setAdapter(adapter);
                        spEspecialistas.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                            @Override
                            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                            }

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

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

            AlertDialog.Builder builder = new AlertDialog.Builder(AsignarTurno.this);
            builder.setView(dialogLayout);
            dialog = builder.show();

            cancelar.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dialog.dismiss();
                }
            });

            aceptar.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    edtEspecialista.setText(spEspecialistas.getSelectedItem().toString());

                    dialog.dismiss();


                }
            });


        }
    });


    addPaciente.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            LayoutInflater inflater = getLayoutInflater();
            final View dialogLayout = inflater.inflate(R.layout.dialog_buscar_paciente, null);

            Button buscar = (Button) dialogLayout.findViewById(R.id.btnBuscarPacienteDialog);
            Button volver = (Button) dialogLayout.findViewById(R.id.btnCancelarPacienteDialog);
            final EditText edtDni = (EditText) dialogLayout.findViewById(R.id.edtDialogDni);


            buscar.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    if (edtDni.getText().toString().length() > 0) {

                        Cursor c = pacientePorDni(Integer.parseInt(edtDni.getText().toString()));

                        edtPaciente.setText((c.getString(c.getColumnIndexOrThrow("apellido")) + " " + (c.getString(c.getColumnIndexOrThrow("nombre")))));
                        dialog.dismiss();
                    }
                }
            });
            AlertDialog.Builder builder = new AlertDialog.Builder(AsignarTurno.this);
            builder.setView(dialogLayout);
            dialog = builder.show();


            volver.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dialog.dismiss();
                }
            });
        }
    });
    calendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
                                             @Override
                                             public void onSelectedDayChange(CalendarView calendarView, int i, int i1, int i2) {

                                                 fecha = i2 + "-" + (i1 + 1) + "-" + i;
                                                 medicos = spEspecialistas.getSelectedItem().toString();
                                                 final AtencionAdapter adapter = new AtencionAdapter(AsignarTurno.this, listaAtencion(medicos));
                                                 turnoView.setAdapter(adapter);
                                                 Calendar c = Calendar.getInstance();
                                                 c.set(i, (i1+1) , (i2-3));
                                                 int diaSemana = c.get(Calendar.DAY_OF_WEEK);
                                                 dia = filtrarDia(diaSemana);
                                                 adapter.getFilter().filter(dia);
                                                 enviarDatos();

                                           }


                                         }

    );



}


public void cargarSpinnerMedicos(String item) {
    Medico m=null;
    SQLiteDatabase data=db.getWritableDatabase();
    String query = "SELECT * FROM " + Tablas.TABLA_MEDICO + " WHERE " + Tablas.COLUMNA_ESPECIALIDAD + " = '" + item + "';";
    Cursor cursor = data.rawQuery(query, null);
    MedicosList = new ArrayList<>();

    while (cursor.moveToNext()){
        m=new Medico();
        m.setNombre(cursor.getString(1));
        m.setApellido(cursor.getString(2));
        m.setEspecialidad(cursor.getString(10));
        Log.i("Nombre",m.getNombre());
        MedicosList.add(m);
    }
    obtenerListaMedicos();
}

public void obtenerListaMedicos() {
    listaMedicos=new ArrayList<String>();
    listaMedicos.add("Seleccione");
    for(int i=0;i<MedicosList.size();i++){
        listaMedicos.add(MedicosList.get(i).getNombre() + " " + MedicosList.get(i).getApellido());
    }
}

public Cursor pacientePorDni(int dni) {
    SQLiteDatabase bd = db.getWritableDatabase();
    String query = "SELECT * FROM " + Tablas.TABLA_PACIENTE + " WHERE " + Tablas.COLUMNA_DNI_PACIENTE + " = " + dni + ";";
    Cursor c = bd.rawQuery(query, null);
    if (c != null) {
        c.moveToFirst();
    }
    return c;
}


public void cargarSpinnerEspecialidades() {
    SQLiteDatabase data = db.getReadableDatabase();
    Especialidad e = null;
    EspecialidadesList = new ArrayList<Especialidad>();
    //select * from usuarios
    Cursor cursor = data.rawQuery("SELECT * FROM " + Tablas.TABLA_ESPECIALIDAD, null);

    while (cursor.moveToNext()) {
        e = new Especialidad();
        e.setNombre(cursor.getString(1));
        Log.i("Nombre", e.getNombre());
        EspecialidadesList.add(e);
    }
    obtenerListaEspecialidades();
}


public void obtenerListaEspecialidades() {
    listaEspecialidades = new ArrayList<String>();
    listaEspecialidades.add("Seleccione");
    for (int i = 0; i < EspecialidadesList.size(); i++) {
        listaEspecialidades.add(EspecialidadesList.get(i).getNombre());
    }
}



public ArrayList<Atencion> listaAtencion(String medico) {
    String sql = "SELECT * FROM " + Tablas.TABLA_ATENCION + " WHERE " + Tablas.COLUMN_ESPECIALISTA + " = '" + medico + "';";
    SQLiteDatabase bd = db.getReadableDatabase();
    ArrayList<Atencion> listaAtencion = new ArrayList<>();
    Cursor cursor = bd.rawQuery(sql, null);
    if (cursor.moveToFirst()) {
        do {

            String especialista = cursor.getString(1);
            String dia = cursor.getString(2);
            String hora = cursor.getString(4);


            listaAtencion.add(new Atencion(especialista, dia, hora));
        } while (cursor.moveToNext());
    }
    cursor.close();
    return listaAtencion;
}

public String filtrarDia(int diaSemana){
    if (diaSemana == 1) {
        dia = "Domingo";
    } else if (diaSemana == 2) {
        dia = "Lunes";
    } else if (diaSemana == 3) {
        dia = "Martes";
    } else if (diaSemana == 4) {
        dia = "Miércoles";
    } else if (diaSemana == 5) {
        dia = "Jueves";
    } else if (diaSemana == 6) {
        dia = "Viernes";
    } else if (diaSemana == 7) {
        dia = "Sábado";
    }
    return dia;
}


public void enviarDatos(){
    String pacienteTurno, fechaTurno, especialistaTurno;

    pacienteTurno = edtPaciente.getText().toString();
    especialistaTurno = edtEspecialista.getText().toString();
    fechaTurno = fecha;

    Intent intent = new Intent(this, AtencionAdapter.class);
    intent.putExtra("paciente", pacienteTurno);
    intent.putExtra("especialista", especialistaTurno);
    intent.putExtra("fecha", fechaTurno);
    startActivity(intent);

}

AtencionAdapter.java

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
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.DTO.Atencion;
import com.example.clinica.clinica.sqlite.BaseDeDatos;
import com.example.clinica.clinica.sqlite.Tablas;

import java.util.ArrayList;
public class AtencionAdapter extends RecyclerView.Adapter<AtencionHolder> 
implements Filterable {

Context c;
ArrayList<Atencion> atencion, listaFiltrada;
FiltroAtenciones filtro;
BaseDeDatos db;
AsignarTurno turno;
String paciente,fecha, horas, especialista;





public AtencionAdapter( Context ctx, ArrayList<Atencion> atencion){

    this.c=ctx;
    this.atencion=atencion;
    this.listaFiltrada=atencion;
    db = new BaseDeDatos(ctx, null, null, 1);

}


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

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

    return holder;
}

@Override
public void onBindViewHolder(AtencionHolder holder, int position) {
    final Atencion at = atencion.get(position);

    holder.hora.setText(atencion.get(position).getHoraInicio());
    holder.dia.setText(atencion.get(position).getDia());

    horas = atencion.get(position).getHoraInicio();


    holder.agregar.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Bundle bundle = turno.getIntent().getExtras();
            paciente = bundle.getString("paciente");
            especialista = bundle.getString("especialista");
            fecha = bundle.getString("fecha");

            SQLiteDatabase db_active=db.getWritableDatabase();
            ContentValues values = new ContentValues();
            values.put(Tablas.COLUMN_PACIENTE_TURNO,paciente);
            values.put(Tablas.COLUMN_ESPECIALISTA_TURNO,especialista);
            values.put(Tablas.COLUMN_DIA_TURNO,fecha);
            values.put(Tablas.COLUMN_HORA_TURNO,horas);
            db_active.insert(Tablas.TABLA_TURNO, null, values);
            db_active.close();

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

@Override
public Filter getFilter() {
    if (filtro==null){
        filtro = new FiltroAtenciones(listaFiltrada, this);
    }
    return filtro;
}


}

AtencionHolder.java

import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;



public class AtencionHolder extends RecyclerView.ViewHolder {

public TextView hora, dia;
public ImageView agregar;


public AtencionHolder(View itemView) {
    super(itemView);
    this.hora = (TextView) itemView.findViewById(R.id.itemHoraTurnoDisponible);
    this.dia = (TextView) itemView.findViewById(R.id.itemDiaTurnoDisponible);
    agregar = (ImageView) itemView.findViewById(R.id.addTurno);
}
}
    
asked by Germanccho 05.10.2017 в 02:38
source

1 answer

1

The intent are used to pass data between activities and an adapter is not an activity, so you can not pass data to it using an intent.

Passing data to an Adapter is simple, you just have to create a method in the adapter that you call every time you want to pass information to it.

public class AtencionAdapter extends RecyclerView.Adapter<AtencionHolder> 
implements Filterable {

    String paciente,fecha, horas, especialista;

    ...

    @Override
    public void onBindViewHolder(AtencionHolder holder, int position) {
        final Atencion at = atencion.get(position);

        ...

        holder.agregar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                SQLiteDatabase db_active=db.getWritableDatabase();
                ContentValues values = new ContentValues();
                values.put(Tablas.COLUMN_PACIENTE_TURNO,paciente);
                values.put(Tablas.COLUMN_ESPECIALISTA_TURNO,especialista);
                values.put(Tablas.COLUMN_DIA_TURNO,fecha);
                values.put(Tablas.COLUMN_HORA_TURNO,horas);
                db_active.insert(Tablas.TABLA_TURNO, null, values);
                db_active.close();

            }
        });
    }

    /**
     * Envia nuevos datos al adaptador.
     * */
    public void enviarDatos(String paciente, String especialista, String fecha) {

        // Actualizas los valores de las variables
        paciente = paciente;
        especialista = especialista;
        fecha = fecha;
    }
}

In your activity you call the method in the following way:

public class AsignarTurno extends AppCompatActivity{

    ...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_asignar_turno);

        ...

        calendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {

            @Override
            public void onSelectedDayChange(CalendarView calendarView, int i, int i1, int i2) {

                fecha = i2 + "-" + (i1 + 1) + "-" + i;
                medicos = spEspecialistas.getSelectedItem().toString();
                adapter = new AtencionAdapter(AsignarTurno.this, listaAtencion(medicos));
                turnoView.setAdapter(adapter);
                Calendar c = Calendar.getInstance();
                c.set(i, (i1+1) , (i2-3));
                int diaSemana = c.get(Calendar.DAY_OF_WEEK);
                dia = filtrarDia(diaSemana);
                adapter.getFilter().filter(dia);

                pacienteTurno = edtPaciente.getText().toString();
                especialistaTurno = edtEspecialista.getText().toString();
                fechaTurno = fecha;

                // Envias los datos al adaptador
                adapter.enviarDatos(pacienteTurno, especialistaTurno, fechaTurno);
            }
        });
    }

    ...
}
    
answered by 05.10.2017 / 16:02
source