How to get the context of a item in Recycler View

I am retrieving Cloud Firesstore data in (Modelo) and I'm trying to pass these variables from the constructor "Modelo" to fragment (DescDenuncia) using a adapter (Adapter) but to do that I need to get the context to pass using the .getSupportFragmentManager() I've already tried use "AppCompatActivity activity = (AppCompatActivity) view.getContext();", but my app crashes every time, and is necessary to use a Context in the getSupportFragmentManager() to it works. I truly don't know what I should do, please someone answer me.

Modelo

package com.example.safe;

public class Modelo {

    String empresa, area, setor, tipo, risco, img, data, prazo, desc, resolucao, ID;

    public Modelo() {
    }


    public Modelo(String empresa, String area, String setor, String tipo, String risco, String img, String data, String prazo, String desc, String resolucao, String ID) {
        this.empresa = empresa;
        this.area = area;
        this.setor = setor;
        this.tipo = tipo;
        this.risco = risco;
        this.img = img;
        this.data = data;
        this.prazo = prazo;
        this.desc = desc;
        this.resolucao = resolucao;
        this.ID = ID;
    }

    public String getEmpresa() {
        return empresa;
    }

    public void setEmpresa(String empresa) {
        this.empresa = empresa;
    }

    public String getArea() {
        return area;
    }

    public void setArea(String area) {
        this.area = area;
    }

    public String getSetor() {
        return setor;
    }

    public void setSetor(String setor) {
        this.setor = setor;
    }

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    public String getRisco() {
        return risco;
    }

    public void setRisco(String risco) {
        this.risco = risco;
    }

    public String getImg() {
        return img;
    }

    public void setImg(String img) {
        this.img = img;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public String getPrazo() {
        return prazo;
    }

    public void setPrazo(String prazo) {
        this.prazo = prazo;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public String getResolucao() {
        return resolucao;
    }

    public void setResolucao(String resolucao) {
        this.resolucao = resolucao;
    }

    public String getID() {
        return ID;
    }

    public void setID(String ID) {
        this.ID = ID;
    }
}

Adapter

package com.example.safe;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentManager;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.Glide;
import com.firebase.ui.firestore.FirestoreRecyclerAdapter;
import com.firebase.ui.firestore.FirestoreRecyclerOptions;

//Vinculando o reclycler view ao firestore
public class Adapter extends FirestoreRecyclerAdapter<Modelo, Adapter.myviewholder> {


    public Adapter(@NonNull FirestoreRecyclerOptions<Modelo> options) {
        super(options);
    }

    //Sobrescrevendo o método
    @Override
    protected void onBindViewHolder(@NonNull myviewholder holder, int position, @NonNull final Modelo model) {
        //Associando os itens do atalho ocorrências
        holder.IDText.setText(model.getID());
        holder.tipoText.setText(model.getTipo());
        Glide.with(holder.img1.getContext()).load(model.getImg()).into(holder.img1);

        ///////////////////////////////////////THE PROBLEM IS HERE///////////////////////////////////////////
        holder.RLAYOUT.setOnClickListener(new View. OnClickListener() {
            @Override
            public void onClick(View view) {
                .getSupportFragmentManager().beginTransaction().replace(R.id.frameLayout, new DescDenuncia(
                        model.getEmpresa(),
                        model.getArea(),
                        model.getSetor(),
                        model.getTipo(),
                        model.getRisco(),
                        model.getImg(),
                        model.getData(),
                        model.getPrazo(),
                        model.getDesc(),
                        model.getResolucao(),
                        model.getID()
                )).addToBackStack(null).commit();
            }



        });
        //////////////////////////////////////////////////////////////////////////////////////////////////////
    }


    @NonNull
    @Override
    public myviewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.modelo_atalho_ocorrencias, parent, false);
        return new myviewholder(view);

    }

    //Coneção do reclycler view com essa classe
    public class myviewholder extends RecyclerView.ViewHolder {

        //Variáveis do modelo atalho
        TextView tipoText, IDText;
        RelativeLayout RLAYOUT;
        ImageView img1;
        private Context context;



        //Associando os objetos ao modelo atalho
        public myviewholder(@NonNull View itemView) {
            super(itemView);


            tipoText = itemView.findViewById(R.id.txtTipo);
            img1 = itemView.findViewById(R.id.imageView);
            IDText = itemView.findViewById(R.id.txtModeloID);
            RLAYOUT = itemView.findViewById(R.id.RLlayout);
        }
    }

}

Upvotes: 1

Views: 102

Answers (1)

z.g.y
z.g.y

Reputation: 6187

Add a Context parameter in your myviewholder constructor that will accept an additional context argument

public class myviewholder extends RecyclerView.ViewHolder {

    private Context context;

    ...
    ...

    public myviewholder(@NonNull View itemView, Context context) {
        super(itemView);
        this.context = context
}

and in your onCreateViewHolder simply call parent.getContext() and pass it to the construction of the view holder.

public myviewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.modelo_atalho_ocorrencias, parent, false);
        return new myviewholder(view, parent.getContext()); //  add <- this

Also please practice naming classes with Uppercase Initials

Upvotes: 1

Related Questions