OnClick RecyclerView adapter avvia activity

di il
1 risposte

OnClick RecyclerView adapter avvia activity

Ciao, ho una recyclerView che contiene cardView con dei dati ricavati dal faìirebase realtime database.
Ho aggiunto l'OnClickListener nell'Adapter e funziona, ma da lì devo avviare un'altra activity inviandogli i dati appena ottenuti dall'OnClickListener.
Premetto che sono consapevole di non aver ben capito come gestire le classi e sicuramente sto sbagliando qualcosa.


RecyclerView:
public class RecyclerView extends AppCompatActivity implements PopupMenu.OnMenuItemClickListener{
    
    private androidx.recyclerview.widget.RecyclerView recyclerView;
    EditText searchBox;

    DatabaseReference nonConsegnate;
    ArrayList<DatiRecyclerView> list;

    private String filtro = "DDT";

    private SwipeRefreshLayout swipeRefreshLayout;                                                              //scorrere verso il basso per ricaricare


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

        searchBox = findViewById(R.id.searchBox);

        nonConsegnate = FirebaseDatabase.getInstance().getReference().child("percorso");             

        recyclerView = findViewById(R.id.recyclerView);                                             
        recyclerView.setHasFixedSize(true);                                                              
        recyclerView.setLayoutManager(new LinearLayoutManager(this));                            

        swipeRefreshLayout = findViewById(R.id.swipeRefreshLayout);
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {                                                                         //scorrendo verso il basso, ricarica la pagina
                Intent intent = RecyclerView.this.getIntent();
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
                RecyclerView.this.overridePendingTransition(0, 0);
                RecyclerView.this.finish();

                RecyclerView.this.overridePendingTransition(0, 0);
                startActivity(intent);
            }
        });


        searchBox.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) { }

            @Override
            public void afterTextChanged(Editable s) {
                ArrayList<DatiRecyclerView> myList = new ArrayList<>();
                
                  //filtri ricerca

                AdapterClass adapterClass = new AdapterClass(myList);
                recyclerView.setAdapter(adapterClass);
            }
        });


    }

    public void PopUp(View view) {                                           //apre il menu filtri a tendina
        PopupMenu popup = new PopupMenu(this, view);
        popup.setOnMenuItemClickListener(this);
        popup.inflate(R.menu.popup_search_menu);
        popup.show();
    }

    @SuppressLint("NonConstantResourceId")
    @Override
    public boolean onMenuItemClick(MenuItem item) {             //"OnClickListener" del menu filtri a tendina
        searchBox = findViewById(R.id.searchBox);

        switch (item.getItemId()){
                                                 //filtri ricerca
        }

        return false;
    }

    @Override                                                                                        
    protected void onStart() {
        super.onStart();
        if (nonConsegnate != null){
            nonConsegnate.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {
                    if(snapshot.exists()){
                        list = new ArrayList<>();
                        for(DataSnapshot ds : snapshot.getChildren()){

                            list.add(ds.getValue(DatiRecyclerView.class));

                        }
                        AdapterClass adapterClass = new AdapterClass(list);
                        recyclerView.setAdapter(adapterClass);

                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError error) {
                    Toast.makeText(RecyclerView.this, error.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });
        }

    }



}



Adapter:
public class AdapterClass extends RecyclerView.Adapter<AdapterClass.MyViewHolder>{
    ArrayList<DatiRecyclerView> list;                                                                 //lista dei risultati ottenuti con .getDDT

    class MyViewHolder extends RecyclerView.ViewHolder{
        TextView bolla;
        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            bolla = itemView.findViewById(R.id.textViewBolla);
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.d("test", "click su: " + bolla.getText().toString());
                    String id = bolla.getText().toString();                              //QUI DEVO AVVIARE LA SECONDA ACTIVITY INVIANDO LA VARIABILE  "id"

                }
            });

        }

    }

    public AdapterClass(ArrayList<DatiRecyclerView> list){
        this.list = list;
    }
    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_items, viewGroup, false);  
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int i) {
        myViewHolder.bolla.setText(list.get(i).getDDT());      
    }

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

}

Mi sareste di grande aiuto, grazie.

1 Risposte

  • Re: OnClick RecyclerView adapter avvia activity

    Nell'adapter :
    
    public interface OnItemClick {
            void OnRowClick(Wallbox entry);
    }
    
    devi mettere il codice dopo la definizione della classe :
    
    public class wallboxadapter extends RecyclerView.Adapter<wallboxadapter.wallboxviewholder> {
    
    QUI!
    
    poi occorre definire il delegato che invia la chiamata
    
    
    public class wallboxadapter extends RecyclerView.Adapter<wallboxadapter.wallboxviewholder> {
    
        public interface OnItemClick {
            void OnRowClick(Wallbox entry);
        }
    
        private List<Wallbox> elencobox;
        private Context context;
        public wallboxadapter.OnItemClick onclickdelegate;
        ^^^^^^^^^^^^^ QUESTO E' IL DELEGATO ^^^^^^^^^^^
    
    a questo punto nel codice in base all'azione chiami il delegato che avviserà il delegante ...
    
    @Override
            public void onClick(View v) {
                int itemPosition = getAdapterPosition();
                Wallbox corrente = elencobox.get( itemPosition );
                onclickdelegate.OnRowClick( corrente );
            }
    
    mi serviva sulla selezione di una riga della reciclerview, quindi ogni volta che premi su una riga passo il dato corrente ( una classe di oggetti )

    il delegante invece va impostato in questo modo :

    nella classe :
    public class CLASSE extends ESTENSIONE implements wallboxadapter.OnItemClick
    in questo caso inserendo il nome del delegato wallboxadapter.OnItemClick ti verrà chiesto di inserire il metodo @Override
    poi da li hai la tua chiamata.
    ...

    prima di utilizzarlo gli devi dire che lo vuoi utilizzare altrimenti non verrà mai chiamato:
    
    wallboxadapterlista.onclickdelegate = this;
    
    Buona giornata.
Devi accedere o registrarti per scrivere nel forum
1 risposte