Error: Attempt to invoke interface method

0

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) {

    } }
    
asked by Enrique Espinosa 27.04.2018 в 19:58
source

1 answer

0

Everything seems normal, but the problem that causes the null can be the following.

  • Try to pass the instance that implements interface in the constructor of adapter and not with a public method: this usually happens many times and I can not find the main reason why it happens.

Simply do:

tareasAdapter = new TareasAdapter(tareas, this);

and on your adapter, you create or modify your constructor:

public TareasAdapter(List<Tareas> tareas, OnEventMovieListener listener) {
        this.tarea = tareas;
        this.onEventMovieListener = listener;
}

Remove the Getter and Setter from the interface of your class TareasAdapter and its uses.

Debug the program in debug mode and make sure that the listener does not reach null . Let me know if it worked.

    
answered by 27.04.2018 / 22:18
source