Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

NullPointer no listener customizado

Olá, estou com problemas na hora de implementar o listener customizado na RecyclerView, como feito em aula o listener é aplicado dentro da classe ViewHolder (NotaViewHolder) onde é setado um clickListener no itemView e usando a referência da interface OnItemClickListener é retornado um NullPointer, a unica diferença em meu projeto com o do instrutor é que minha classe ViewHolder está separada do Adapter, porém a implementação é a mesma.

Segue o código do ViewHolder:

class NotaViewHolder extends RecyclerView.ViewHolder {

    private final TextView TITULO;
    private final TextView DESCRICAO;
    private OnItemClickListener onItemClickListener;

    public NotaViewHolder(View viewCriada) {
        super(viewCriada);

        TITULO = itemView.findViewById(R.id.item_nota_titulo);
        DESCRICAO = itemView.findViewById(R.id.item_nota_descricao);

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onItemClickListener.onItemClick(); //Linha que retorna o NullPointer
            }
        });
    }

Código do Adapter:

private final List<Nota> notas;
    private final Context context;
    private OnItemClickListener onItemClickListener;

    public ListaNotasAdapter(Context context, List<Nota> notas){
        this.context = context;
        this.notas = notas;
    }
    public void setOnItemClickListener(OnItemClickListener onItemClickListener){
        this.onItemClickListener = onItemClickListener;
    }
    @Override
    public NotaViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View viewCriada = LayoutInflater.from(context).
                inflate(R.layout.item_nota, parent, false);
        return new NotaViewHolder(viewCriada);
    }
    @Override
    public void onBindViewHolder(NotaViewHolder holder, int position) {
        Nota nota = this.notas.get(position);
        holder.PreencherCampo(nota);
    }

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

    public void adciona(Nota notaRecebida) {
        this.notas.add(notaRecebida);
        notifyDataSetChanged();
    }
}

Vale ressaltar que em todos os campos de referências da interface OnItemClickListener, o Android diz que este campo nunca foi acessado. Espero que tenha ficado claro meu problema, talvez seja algo simples de resolver, Obrigado!

3 respostas

Fala ai Gustavo, de boa ?

Cara acho que algum momento da vida, você esqueceu de atribuir valor nesse atributo:

private OnItemClickListener onItemClickListener;

Que é o ponto que está dando null para ti.

Olá Matheus como vai, então cara, o pior que meu código está exatamente igual ao do instrutor, e apenas em um momento é atribuído valor ao campo através de um setter, e por ser uma interface não consigo apenas inicializa-la como uma classe normal apenas através de uma classe anonima, como estou fazendo na Activity onde se encontra a lista (ListaNotasActivity), e mesmo assim ainda me retorna null, exatamente naquela linha que marquei no post que se encontra na NotaViewHolder, fiz até um teste com o Logcat incrementando+1 em uma variável, e sem aquela linha funciona tudo normalmente (Mas não executa o Toast apenas o Log). segue o código abaixo:

adapter = new ListaNotasAdapter(this, notas);
adapter.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick() {
                Toast.makeText(ListaNotasActivity.this,
                        "View Clicada!", Toast.LENGTH_SHORT).show();
            }
        });

Meu problema é simples, mas acabei me perdendo e ainda estou "pegando" essa parte da implementação :D valeu!

solução!

Olá, consegui resolver o problema, mas infelizmente não da maneira esperada, acabei tendo que refazer algumas coisas, mas no final tudo ficou 100% funcional, Obrigado pela atenção!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software