I am using Cardviews for an application and in those CardView I have two buttons that I want to give a function, the problem is that clicking on any of them shows me the following error:
FATAL EXCEPTION: main Process: com.example.enriq.examen_tareas_segundo_plano_enrique_espinosa, PID: 22660 java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.enriq.examen_tareas_segundo_plano_enrique_espinosa.adapter.TareasAdapter $ OnEventMovieListener.deleteMovie (int) 'on a null object reference at com.example.enriq.examen_tareas_segundo_plano_enrique_espinosa.adapter.TareasAdapter $ UsuarioHolder.onClick (TareasAdapter.java:75) at android.view.View.performClick (View.java:5637) at android.view.View $ PerformClick.run (View.java:22429) at android.os.Handler.handleCallback (Handler.java:751) at android.os.Handler.dispatchMessage (Handler.java:95) at android.os.Looper.loop (Looper.java:154) at android.app.ActivityThread.main (ActivityThread.java:6119) at java.lang.reflect.Method.invoke (Native Method) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:886) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:776)
This is how I see the interface:
My class where I recover the buttons is the following:
package com.example.enriq.examen_tareas_segundo_plano_enrique_espinosa.adapter;
import android.app.Activity;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.TextView;
import android.widget.Toast;
import com.example.enriq.examen_tareas_segundo_plano_enrique_espinosa.R;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Next University.
*/
public class TareasAdapter extends RecyclerView.Adapter<TareasAdapter.UsuarioHolder>{
private Activity activity;
private ArrayList<Tareas> tareas;
private List<Tareas> tarea;
private OnEventMovieListener onEventMovieListener;
//public MovieAdapter(List<Movie> movies) {
// this.movies = movies;
//}
public TareasAdapter(List<Tareas> tareas) {
this.tarea = tareas;
}
public interface OnEventMovieListener {
void changeDisponibilityMovie(Tareas tarea, boolean disponibility);
void deleteMovie(int position);
void actualizar(int position);
}
public TareasAdapter(Activity activity, ArrayList<Tareas> tareas) {
this.activity = activity;
this.tareas = tareas;
}
protected class UsuarioHolder extends RecyclerView.ViewHolder implements CompoundButton.OnCheckedChangeListener, View.OnClickListener {
protected TextView txtId, txtNombreUsuario, txtNota, txtEstudiante;
Button btnDelete;
Button btnUpdate;
public UsuarioHolder(View itemView) {
super(itemView);
txtId = (TextView) itemView.findViewById(R.id.txt_id);
txtNombreUsuario = (TextView) itemView.findViewById(R.id.txt_nombre_usuario);
txtNota = (TextView)itemView.findViewById(R.id.txt_nota);
txtEstudiante = (TextView)itemView.findViewById(R.id.txtEstudiante);
btnDelete = (Button) itemView.findViewById(R.id.btnEliminar);
btnDelete.setOnClickListener(this);
btnUpdate = (Button) itemView.findViewById(R.id.btnActualizar);
btnUpdate.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch(view.getId()){
case R.id.btnEliminar:
onEventMovieListener.deleteMovie(getAdapterPosition());
break;
case R.id.btnActualizar:
onEventMovieListener.actualizar(getAdapterPosition());
break;
default:
break;
}
}
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
}
}
@Override
public UsuarioHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = activity.getLayoutInflater().inflate(R.layout.plantilla_usuariosegundo, parent, false);
UsuarioHolder holder = new UsuarioHolder(view);
return holder;
}
@Override
public void onBindViewHolder(UsuarioHolder holder, int position) {
//Movie movie = movies.get(position);
//Tareas tarea = tareas.get(position);
holder.txtId.setText("Codigo: "+ tareas.get(position).getId());
holder.txtNombreUsuario.setText("Tarea: "+ tareas.get(position).getNombreTarea());
holder.txtNota.setText("Nota: "+ tareas.get(position).getNota());
holder.txtEstudiante.setText("Estudiante: "+ tareas.get(position).getEstudiante());
}
@Override
public int getItemCount() {
return tareas.size();
}
public OnEventMovieListener getOnEventMovieListener() {
return onEventMovieListener;
}
public void setOnEventMovieListener(
OnEventMovieListener onEventMovieListener) {
this.onEventMovieListener = onEventMovieListener;
}
}
And in this class is where I want to use my deleteMovie method which is the method that should be fired at the moment I press the Delete button:
package com.example.enriq.examen_tareas_segundo_plano_enrique_espinosa;
import android.content.DialogInterface; import android.support.annotation.NonNull; import android.support.design.widget.NavigationView; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.widget.Toast;
import com.example.enriq.examen_tareas_segundo_plano_enrique_espinosa.adapter.Asignatura; import com.example.enriq.examen_tareas_segundo_plano_enrique_espinosa.adapter.AsignaturaAdapter; import com.example.enriq.examen_tareas_segundo_plano_enrique_espinosa.adapter.Tareas; import com.example.enriq.examen_tareas_segundo_plano_enrique_espinosa.adapter.TareasAdapter;
import java.util.ArrayList; import java.util.List;
public class Principal extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener,TareasAdapter.OnEventMovieListener{
AlertDialog alertDialog1;
//private List<Movie> movies;
//private MovieAdapter movieAdapter;
private List<Tareas> tareas;
private TareasAdapter tareasAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_principal);
//movies = new ArrayList<>();
//movieAdapter = new MovieAdapter(movies);
//movieAdapter.setOnEventMovieListener(this);
tareas = new ArrayList<>();
tareasAdapter = new TareasAdapter(tareas);
tareasAdapter.setOnEventMovieListener(this);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
toolbar.setTitle("Control de Tareas");
toolbar.setSubtitle("Asignaturas");
asignaturaFragmento asignatura = new asignaturaFragmento();
android.support.v4.app.FragmentManager manager = getSupportFragmentManager();
manager.beginTransaction().replace(R.id.qwe, asignatura).commit();
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
int id = item.getItemId();
if(id == R.id.asigna){
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setSubtitle("Asignaturas");
asignaturaFragmento asignatura = new asignaturaFragmento();
android.support.v4.app.FragmentManager manager = getSupportFragmentManager();
manager.beginTransaction().replace(R.id.qwe, asignatura).commit();
}else if(id == R.id.estudia){
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setSubtitle("Estudiantes");
estudiantesFragmento estudiantes = new estudiantesFragmento();
android.support.v4.app.FragmentManager manager = getSupportFragmentManager();
manager.beginTransaction().replace(R.id.qwe, estudiantes).commit();
}else if (id == R.id.tareas){
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setSubtitle("Tareas");
tareasFragmento tareas = new tareasFragmento();
android.support.v4.app.FragmentManager manager = getSupportFragmentManager();
manager.beginTransaction().replace(R.id.qwe, tareas).commit();
}
//Este codigo nos permite mostrar que menu esta seleccionado
//para poder identificar que menu esta en uso
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
@Override
public void onBackPressed(){
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if(drawer.isDrawerOpen(GravityCompat.START)){
drawer.closeDrawer(GravityCompat.START);
}else{
super.onBackPressed();
}
}
@Override
public void changeDisponibilityMovie(Tareas tarea, boolean disponibility) {
}
@Override
public void deleteMovie(int position) {
AlertDialog.Builder builder = new AlertDialog.Builder(Principal.this);
LayoutInflater inflater = this.getLayoutInflater();
View MyView = inflater.inflate(R.layout.dialog_signin_deletedonante, null);
final int valor = position;
builder.setView(MyView)
.setPositiveButton("Eliminar", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
Toast.makeText(getApplicationContext(),"Boton positivo", Toast.LENGTH_SHORT).show();
alertDialog1.dismiss();
}
})
.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Toast.makeText(getApplicationContext(),"Boton negativo", Toast.LENGTH_SHORT).show();
alertDialog1.dismiss();
}
});
alertDialog1 = builder.create();
alertDialog1.show();
}
@Override
public void actualizar(int position) {
} }