RISOLTO Problema RecyclerView Android Studio

  • Autore discussione Autore discussione Utente 399201
  • Data d'inizio Data d'inizio
Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.
U

Utente 399201

Ospite
Buonasera a tutti.
Sto realizzando quest'app con Android studio che in pratica consiste in una Lyric App con all'interno tutti i testi dei Verdena e, per realizzare il layout delle Activity , ho utilizzato dei RecyclerView (sia per l'Activity dove vengono mostrati tutti gli album sia in quello in cui ci sono tutti i brani).
Il problema è che, avendo una sola Activity per i testi, stavo provando (fallendo miseramente) a passare i testi tramite una classe Canzone, per poi effettuare nell'Activity dei testi un setText sulla TextView. Qualcuno riesce a darmi una mano?

Activity di un album
Java:
package com.example.verdenalyrics;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;

import java.util.ArrayList;
import java.util.List;

public class CanosEpActivity extends AppCompatActivity {

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

        RecyclerView dataList = findViewById(R.id.dataList);
        List<String> titles = new ArrayList<>();
        List<String> testo = new ArrayList<>();

        titles.add("Caños");
        titles.add("Malaga");
        titles.add("L'ora è buia");
        titles.add("Párabellium");
        titles.add("His latest flame (Marie’s the name)");
        titles.add("Fluido");

        testo.add("Peggio di noi\nNon si può stare, credimi\nL'alta marea\nCi porterà via, credimi\n\nTu mi assordi, come fai?\nTi subirò\nNon torneremo più\nIt's true\n\nDicono che\nTutto è sbagliato\nE parlano\nLingue di bue\nUn pasto per due\nParlami\n\nTu mi asciugherai\nGiuro, lo fai\nNon torneremo più\nIt's true\n\\nSeven\nSeven\nÈ il numero\nDegli alberi\nDio solo sa\nSe questa città\nHa alberi\n\nMa che importa\nTu mi fai\nMi brucerò\nNon torneremo più\n\n");
        testo.add("[Strumentale]");
        testo.add("Tu non puoi\nTu non lo fai\nMa sei qui\nOramai\nSembri giù\nVuoi di più\nTu mi affliggerai!\n\nC'è uno squarcio su di lei\nOra è tardi, io dovrei\nIn un bar\nFra di noi\nTi convincerò!\n\nNon sei più\nNon sarai mai\nCome vuoi\nTu lo sai\nNulla in più\nD'ora in poi\nTu mi affliggerai!\n\nC'è uno squarcio su di lei\nOra e sempre io dovrei\nIn un bar\nFra di noi\nTi convincerò!\n\nCome è buia\nL'ora è buia\nSarà dura\nL'ora è buia\nÈ buia\n\nTu non puoi\nTu non lo fai\nMa sei qui\nOramai\nSembri giù\nVuoi di più\nTu non fingerai\n\nC'è uno squarcio su di lei\nOra e sempre io dovrei\nIn un bar\nFra di noi\nTi convincerò\nTi convincerò\n\n");
        testo.add("[Strumentale]");
        testo.add("A very old friend came by today\nBecause he was telling everyone in town\nAbout the love that he just found\nAnd Marie's the name of his latest flame\n\nThough I smiled the tears inside were a-burning\nI wished him luck and then he said goodbye\nHe was gone but still his words kept returning\nWhat else was there for me to do but cry\n\nHe talked and talked and I heard him say\nThat she had the longest blackest hair\nThe prettiest green eyes anywhere\nAnd Marie's the name of his latest flame\n\nWould you believe that yesterday\nThis girl was in my arms and swore to me\nShe'd be mine eternally\nAnd Marie's the name of his latest flame\n\n");
        testo.add("Paradiso enorme\nNessuno può capirmi più\nE non so darmi più risposte\nGesù\n\nAl buio il fiume non c'è\nIl fiume al buio non si vede\nIncolla i fiori nella sabbia\nGesù\nGesù\nGesù\nGesù\n\nOra è meglio, ora nuoto\nSicuramente come non crederai\nAh, ah\n\n");

        AdapterSong adapter = new AdapterSong(this, titles, testo);

        GridLayoutManager gridLayoutManager = new GridLayoutManager(this,1,GridLayoutManager.VERTICAL,false);
        dataList.setLayoutManager(gridLayoutManager);
        dataList.setAdapter(adapter);
    }
}

Classe RecyclerView Canzoni
Java:
package com.example.verdenalyrics;

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

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import org.jetbrains.annotations.NotNull;

import java.util.List;

public class AdapterSong extends RecyclerView.Adapter<AdapterSong.ViewHolder>
{
    Context context;
    LayoutInflater inflater;
    List<String> titles;
    List<String> testo;
    Intent intent;
    Canzoni canzoni;

    public AdapterSong(Context paramContext, List<String> paramList,List<String> testo) {
        this.titles = paramList;
        this.testo = testo;
        this.inflater = LayoutInflater.from(paramContext);
        this.context = paramContext;
    }

    public AdapterSong(Context paramContext, List<String> paramList) {
        this.titles = paramList;
        this.inflater = LayoutInflater.from(paramContext);
        this.context = paramContext;
    }

    public int getItemCount(){
        return this.titles.size();
    }

    public @NotNull ViewHolder onCreateViewHolder(@NotNull ViewGroup paramViewGroup, int paramInt)
    {
        View view = inflater.inflate(R.layout.layout_songs,paramViewGroup,false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull @NotNull AdapterSong.ViewHolder holder, int position) {
        holder.title.setText(titles.get(position));
    }



    public class ViewHolder extends RecyclerView.ViewHolder{
        TextView title;
        public ViewHolder(View paramView) {
            super(paramView);
            title = itemView.findViewById(R.id.textSong);
            paramView.setOnClickListener(paramAnonymousView -> {
                /*switch (getAdapterPosition()){    Qua è dove stavo provando a passare i testi
                    case 0:
                        canzoni.setTesto(testo.get(0));
                        break;
                }*/
                intent = new Intent(context , CanzoniActivity.class);
                context.startActivity(intent);
            });
        }
    }
}

Classe Canzoni

Java:
package com.example.verdenalyrics;

public class Canzoni {
    private String testo;

    public String getTesto() {
        return testo;
    }

    public void setTesto(String testo) {
        this.testo = testo;
    }
}

Activity dei testi

Codice:
package com.example.verdenalyrics;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;

public class CanzoniActivity extends AppCompatActivity {

    TextView testo;
    Button btnAscolta;
    Canzoni canzoni;

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

        testo = findViewById(R.id.TestoCanzone);
        btnAscolta = findViewById(R.id.btnAscolta);
        testo.setText(canzoni.getTesto());
    }

}
 
Ciao, non ho ben capito il tuo problema.
Nella recyclerview riesci a settare il testo, ma nella activity CanzoniActivity non riesci a prelevare il testo dell'elemento che hai cliccato nella recyclerview?
 
Ciao, non ho ben capito il tuo problema.
Nella recyclerview riesci a settare il testo, ma nella activity CanzoniActivity non riesci a prelevare il testo dell'elemento che hai cliccato nella recyclerview?

Più che altro quando provo a settare il testo nella Classe AdapterSong succede che poi in fase di prova mi fa premere ma non mi apre CanzoniActivity
 
Più che altro quando provo a settare il testo nella Classe AdapterSong succede che poi in fase di prova mi fa premere ma non mi apre CanzoniActivity
Non puoi startare una activity nell'adapter.
Devi implementare una interfaccia nella activity dove istanzi la recycleview e passare il riferimento di quest interfaccia nel costruttore dell'adapter.
Nell'onclicklistner della textview (nell'adapter), chiami il metodo dell'interfaccia (tramite lil riferimento) e gli passi la position o quello che ti serve. Nel metodo dell'interfaccia implementato nella activity, fai lo start della nuova activity.

Ma nella 2 activity tu hai "caznoni.getTesto()", ma dove recuperi la canzone? Quell'oggetto canzone sarà vuoto.
Per mantere traccia della canzone devi usare un Database o avere un array nell'xml con le canzoni già memorizzate e poi tramite la posizione che gli passi dall'adapter te la recuperi. Oppure al posto della posizione gli passi il testo dell'elemento cliccato.
In sostanza viene così il codice:

Java:
public class CanosEpActivity extends AppCompatActivity implements ListnerInterface {

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

        RecyclerView dataList = findViewById(R.id.dataList);
        List<String> titles = new ArrayList<>();
        List<String> testo = new ArrayList<>();

        titles.add("Caños");
        titles.add("Malaga");
        titles.add("L'ora è buia");
        titles.add("Párabellium");
        titles.add("His latest flame (Marie’s the name)");
        titles.add("Fluido");

        testo.add("Peggio di noi\nNon si può stare, credimi\nL'alta marea\nCi porterà via, credimi\n\nTu mi assordi, come fai?\nTi subirò\nNon torneremo più\nIt's true\n\nDicono che\nTutto è sbagliato\nE parlano\nLingue di bue\nUn pasto per due\nParlami\n\nTu mi asciugherai\nGiuro, lo fai\nNon torneremo più\nIt's true\n\\nSeven\nSeven\nÈ il numero\nDegli alberi\nDio solo sa\nSe questa città\nHa alberi\n\nMa che importa\nTu mi fai\nMi brucerò\nNon torneremo più\n\n");
        testo.add("[Strumentale]");
        testo.add("Tu non puoi\nTu non lo fai\nMa sei qui\nOramai\nSembri giù\nVuoi di più\nTu mi affliggerai!\n\nC'è uno squarcio su di lei\nOra è tardi, io dovrei\nIn un bar\nFra di noi\nTi convincerò!\n\nNon sei più\nNon sarai mai\nCome vuoi\nTu lo sai\nNulla in più\nD'ora in poi\nTu mi affliggerai!\n\nC'è uno squarcio su di lei\nOra e sempre io dovrei\nIn un bar\nFra di noi\nTi convincerò!\n\nCome è buia\nL'ora è buia\nSarà dura\nL'ora è buia\nÈ buia\n\nTu non puoi\nTu non lo fai\nMa sei qui\nOramai\nSembri giù\nVuoi di più\nTu non fingerai\n\nC'è uno squarcio su di lei\nOra e sempre io dovrei\nIn un bar\nFra di noi\nTi convincerò\nTi convincerò\n\n");
        testo.add("[Strumentale]");
        testo.add("A very old friend came by today\nBecause he was telling everyone in town\nAbout the love that he just found\nAnd Marie's the name of his latest flame\n\nThough I smiled the tears inside were a-burning\nI wished him luck and then he said goodbye\nHe was gone but still his words kept returning\nWhat else was there for me to do but cry\n\nHe talked and talked and I heard him say\nThat she had the longest blackest hair\nThe prettiest green eyes anywhere\nAnd Marie's the name of his latest flame\n\nWould you believe that yesterday\nThis girl was in my arms and swore to me\nShe'd be mine eternally\nAnd Marie's the name of his latest flame\n\n");
        testo.add("Paradiso enorme\nNessuno può capirmi più\nE non so darmi più risposte\nGesù\n\nAl buio il fiume non c'è\nIl fiume al buio non si vede\nIncolla i fiori nella sabbia\nGesù\nGesù\nGesù\nGesù\n\nOra è meglio, ora nuoto\nSicuramente come non crederai\nAh, ah\n\n");

        AdapterSong adapter = new AdapterSong(this, titles, testo, this);

        GridLayoutManager gridLayoutManager = new GridLayoutManager(this,1,GridLayoutManager.VERTICAL,false);
        dataList.setLayoutManager(gridLayoutManager);
        dataList.setAdapter(adapter);
    }
 
    //metodo dell'interfaccia
    public void clickListner(int position //o quello che ti serve){
        Intent i = new Intent(this, CanzoneActivity.class);
        startActivity(i);
    }
}

Mentre l'adapter

Java:
public class AdapterSong extends RecyclerView.Adapter<AdapterSong.ViewHolder>
{
    Context context;
    LayoutInflater inflater;
    List<String> titles;
    List<String> testo;
    Intent intent;
    Canzoni canzoni;
    private ListnerInterface listnerInterface;

    public AdapterSong(Context paramContext, List<String> paramList,List<String> testo, ListnerInterface listnerInterface) {
        this.titles = paramList;
        this.testo = testo;
        this.inflater = LayoutInflater.from(paramContext);
        this.context = paramContext;
        this.listInterface = listInterface;
    }

    public AdapterSong(Context paramContext, List<String> paramList, ListnerInterface listnerInterface) {
        this.titles = paramList;
        this.inflater = LayoutInflater.from(paramContext);
        this.context = paramContext;
        this.listInterface = listInterface;
    }

    public int getItemCount(){
        return this.titles.size();
    }

    public @NotNull ViewHolder onCreateViewHolder(@NotNull ViewGroup paramViewGroup, int paramInt)
    {
        View view = inflater.inflate(R.layout.layout_songs,paramViewGroup,false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull @NotNull AdapterSong.ViewHolder holder, int position) {
        holder.title.setText(titles.get(position));
        //implementa qui il click listner e poi chiami il metodo listnerInterface.clickListner(position);
    }



    public class ViewHolder extends RecyclerView.ViewHolder{
        TextView title;
        public ViewHolder(View paramView) {
            super(paramView);
            title = itemView.findViewById(R.id.textSong);
        }
    }
}
 
Ultima modifica:
Non puoi startare una activity nell'adapter.
Devi implementare una interfaccia nella activity dove istanzi la recycleview e passare il riferimento di quest interfaccia nel costruttore dell'adapter.
Nell'onclicklistner della textview (nell'adapter), chiami il metodo dell'interfaccia (tramite lil riferimento) e gli passi la position o quello che ti serve. Nel metodo dell'interfaccia implementato nella activity, fai lo start della nuova activity.

Ma nella 2 activity tu hai "caznoni.getTesto()", ma dove recuperi la canzone? Quell'oggetto canzone sarà vuoto.
Per mantere traccia della canzone devi usare un Database o avere un array nell'xml con le canzoni già memorizzate e poi tramite la posizione che gli passi dall'adapter te la recuperi. Oppure al posto della posizione gli passi il testo dell'elemento cliccato.
In sostanza viene così il codice:

Java:
public class CanosEpActivity extends AppCompatActivity implements ListnerInterface {

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

        RecyclerView dataList = findViewById(R.id.dataList);
        List<String> titles = new ArrayList<>();
        List<String> testo = new ArrayList<>();

        titles.add("Caños");
        titles.add("Malaga");
        titles.add("L'ora è buia");
        titles.add("Párabellium");
        titles.add("His latest flame (Marie’s the name)");
        titles.add("Fluido");

        testo.add("Peggio di noi\nNon si può stare, credimi\nL'alta marea\nCi porterà via, credimi\n\nTu mi assordi, come fai?\nTi subirò\nNon torneremo più\nIt's true\n\nDicono che\nTutto è sbagliato\nE parlano\nLingue di bue\nUn pasto per due\nParlami\n\nTu mi asciugherai\nGiuro, lo fai\nNon torneremo più\nIt's true\n\\nSeven\nSeven\nÈ il numero\nDegli alberi\nDio solo sa\nSe questa città\nHa alberi\n\nMa che importa\nTu mi fai\nMi brucerò\nNon torneremo più\n\n");
        testo.add("[Strumentale]");
        testo.add("Tu non puoi\nTu non lo fai\nMa sei qui\nOramai\nSembri giù\nVuoi di più\nTu mi affliggerai!\n\nC'è uno squarcio su di lei\nOra è tardi, io dovrei\nIn un bar\nFra di noi\nTi convincerò!\n\nNon sei più\nNon sarai mai\nCome vuoi\nTu lo sai\nNulla in più\nD'ora in poi\nTu mi affliggerai!\n\nC'è uno squarcio su di lei\nOra e sempre io dovrei\nIn un bar\nFra di noi\nTi convincerò!\n\nCome è buia\nL'ora è buia\nSarà dura\nL'ora è buia\nÈ buia\n\nTu non puoi\nTu non lo fai\nMa sei qui\nOramai\nSembri giù\nVuoi di più\nTu non fingerai\n\nC'è uno squarcio su di lei\nOra e sempre io dovrei\nIn un bar\nFra di noi\nTi convincerò\nTi convincerò\n\n");
        testo.add("[Strumentale]");
        testo.add("A very old friend came by today\nBecause he was telling everyone in town\nAbout the love that he just found\nAnd Marie's the name of his latest flame\n\nThough I smiled the tears inside were a-burning\nI wished him luck and then he said goodbye\nHe was gone but still his words kept returning\nWhat else was there for me to do but cry\n\nHe talked and talked and I heard him say\nThat she had the longest blackest hair\nThe prettiest green eyes anywhere\nAnd Marie's the name of his latest flame\n\nWould you believe that yesterday\nThis girl was in my arms and swore to me\nShe'd be mine eternally\nAnd Marie's the name of his latest flame\n\n");
        testo.add("Paradiso enorme\nNessuno può capirmi più\nE non so darmi più risposte\nGesù\n\nAl buio il fiume non c'è\nIl fiume al buio non si vede\nIncolla i fiori nella sabbia\nGesù\nGesù\nGesù\nGesù\n\nOra è meglio, ora nuoto\nSicuramente come non crederai\nAh, ah\n\n");

        AdapterSong adapter = new AdapterSong(this, titles, testo, this);

        GridLayoutManager gridLayoutManager = new GridLayoutManager(this,1,GridLayoutManager.VERTICAL,false);
        dataList.setLayoutManager(gridLayoutManager);
        dataList.setAdapter(adapter);
    }
 
    //metodo dell'interfaccia
    public void clickListner(int position //o quello che ti serve){
        Intent i = new Intent(this, CanzoneActivity.class);
        startActivity(i);
    }
}

Mentre l'adapter

Java:
public class AdapterSong extends RecyclerView.Adapter<AdapterSong.ViewHolder>
{
    Context context;
    LayoutInflater inflater;
    List<String> titles;
    List<String> testo;
    Intent intent;
    Canzoni canzoni;
    private ListnerInterface listnerInterface;

    public AdapterSong(Context paramContext, List<String> paramList,List<String> testo, ListnerInterface listnerInterface) {
        this.titles = paramList;
        this.testo = testo;
        this.inflater = LayoutInflater.from(paramContext);
        this.context = paramContext;
        this.listInterface = listInterface;
    }

    public AdapterSong(Context paramContext, List<String> paramList, ListnerInterface listnerInterface) {
        this.titles = paramList;
        this.inflater = LayoutInflater.from(paramContext);
        this.context = paramContext;
        this.listInterface = listInterface;
    }

    public int getItemCount(){
        return this.titles.size();
    }

    public @NotNull ViewHolder onCreateViewHolder(@NotNull ViewGroup paramViewGroup, int paramInt)
    {
        View view = inflater.inflate(R.layout.layout_songs,paramViewGroup,false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull @NotNull AdapterSong.ViewHolder holder, int position) {
        holder.title.setText(titles.get(position));
        //implementa qui il click listner e poi chiami il metodo listnerInterface.clickListner(position);
    }



    public class ViewHolder extends RecyclerView.ViewHolder{
        TextView title;
        public ViewHolder(View paramView) {
            super(paramView);
            title = itemView.findViewById(R.id.textSong);
        }
    }
}

Ha funzionato grazie mille
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top