Android Studio Problema RecyclerView stampa un array due volte

U

Utente 399201

Ospite
Buonasera a tutti,
come scritto nel titolo sto avendo un problema con una recyclerview.
In pratica cliccando su un opzione la prima volta mi funziona correttamente (quindi mi apre l'activity che mi deve aprire con l'arraylist che deve), però, se torno indietro e riclicco su quell'opzione, mi riapre l'activity ma mi stampa l'arraylist due volte.
Com'è possibile? Grazie in anticipo

Activity RecyclerView
Java:
public class AlbumAdapter extends RecyclerView.Adapter<AlbumAdapter.MyViewHolder>{

    public ArrayList<Album> arrayCanzoni;
    Context mContext;
    LayoutInflater inflater;

    public AlbumAdapter(Context mContext, ArrayList<Album> arrayCanzoni) {
        this.arrayCanzoni = arrayCanzoni;
        this.mContext = mContext;
        this.inflater = LayoutInflater.from(mContext);
    }

    @NonNull
    @Override
    public AlbumAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new MyViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.element_album,parent,false));
    }

    @SuppressLint("SetTextI18n")
    @Override
    public void onBindViewHolder(@NonNull AlbumAdapter.MyViewHolder holder, int position) {
        holder.nomeAlbum.setText(arrayCanzoni.get(position).getAlbum());
        holder.tipoAlbum.setText(arrayCanzoni.get(position).getTipo() + "\n" + arrayCanzoni.get(position).getData());
        holder.imgAlbum.setImageResource(arrayCanzoni.get(position).getAlbumPhoto());
    }

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

    public class MyViewHolder extends RecyclerView.ViewHolder {
        private final TextView nomeAlbum,tipoAlbum;
        ImageView imgAlbum;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            imgAlbum = itemView.findViewById(R.id.imgAlbum);
            nomeAlbum = itemView.findViewById(R.id.albumNome);
            nomeAlbum.setSelected(true);
            tipoAlbum = itemView.findViewById(R.id.tipoAlbumAnno);
            ArrayList<Canzone> arrayCanzoni = new ArrayList<>();
            itemView.setOnClickListener(v -> {
                switch (getAdapterPosition()){
                    case 0:
                        arrayCanzoni.add(new Canzone("Took your name","Lyrics for this song have yet to be released"));
                        arrayCanzoni.add(new Canzone("Valium","Lyrics for this song have yet to be released"));
                        arrayCanzoni.add(new Canzone("DMS 10","Lyrics for this song have yet to be released"));
                        arrayCanzoni.add(new Canzone("Froggs Eggs","Lyrics for this song have yet to be released"));
                        arrayCanzoni.add(new Canzone("Across","Lyrics for this song have yet to be released"));
                        arrayCanzoni.add(new Canzone("Stinky Louse","Lyrics for this song have yet to be released"));
                        arrayCanzoni.add(new Canzone("High Heart Corporation","Lyrics for this song have yet to be released"));
                        arrayCanzoni.add(new Canzone("Wonder","Lyrics for this song have yet to be released"));
                        arrayCanzoni.add(new Canzone("Leasy Creep","Lyrics for this song have yet to be released"));
                        arrayCanzoni.add(new Canzone("Porno Dolls Rubber","Lyrics for this song have yet to be released"));
                        arrayCanzoni.add(new Canzone("Velvet","Lyrics for this song have yet to be released"));
                        break;
                    case 1:
                        // va avanti come sopra
                    break;
                }
                Intent intent = new Intent(mContext,CanzoniActivity.class);
                intent.putExtra("arrayCanzoni",arrayCanzoni);
                mContext.startActivity(intent);
            });
        }
    }
}

Activity che mi apre
Java:
public class CanzoniActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_canzoni);
        RecyclerView recyclerView = findViewById(R.id.recyclerViewCanzoni);
        ArrayList<Canzone> arrayList = (ArrayList<Canzone>) getIntent().getSerializableExtra("arrayCanzoni");

        CanzoniAdapter adapter = new CanzoniAdapter(this,arrayList);
        RecyclerView.LayoutManager layoutManager = new GridLayoutManager(this,1, RecyclerView.VERTICAL,false);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(adapter);
    }
}

RecyclerView della seconda Activity
Java:
public class CanzoniAdapter extends RecyclerView.Adapter<CanzoniAdapter.MyViewCanzoniHolder>{

    ArrayList<Canzone> arrayCanzone;
    Context mContext;
    LayoutInflater inflater;

    public CanzoniAdapter(Context mContext,ArrayList<Canzone> arrayList) {
        this.arrayCanzone = arrayList;
        this.mContext = mContext;
        this.inflater = LayoutInflater.from(mContext);
    }

    @NonNull
    @Override
    public CanzoniAdapter.MyViewCanzoniHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new MyViewCanzoniHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.element_canzoni, parent, false));
    }

    @Override
    public void onBindViewHolder(@NonNull CanzoniAdapter.MyViewCanzoniHolder holder, @SuppressLint("RecyclerView") int position) {
        holder.titolo.setText(arrayCanzone.get(position).getTitles());
        holder.itemView.setOnClickListener(v -> {
            Intent intent = new Intent(mContext,TestoActivity.class);
            intent.putExtra("testo",arrayCanzone.get(position).getTesto());
            intent.putExtra("titolo",arrayCanzone.get(position).getTitles());
            mContext.startActivity(intent);
        });
    }

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

    public static class MyViewCanzoniHolder extends RecyclerView.ViewHolder {
        private final TextView titolo;

        public MyViewCanzoniHolder(@NonNull View itemView) {
            super(itemView);
            this.titolo = itemView.findViewById(R.id.textSong);
            this.titolo.setSelected(true);
        }
    }
}
 

Ibernato

Utente Èlite
4,328
2,047
OS
Windows 10 Pro / Ubuntu 22.04
Ciao,
se condividi il progetto su github (se puoi), gli posso dare un'occhiata.

Comunque, piuttosto che aprire tante activity, io userei dei fragment.
 
U

Utente 399201

Ospite
Alla fine ho provando varie cose è provando a mettere un arrayList.clear() prima dello switch e mi funziona.
Probabilmente non è la soluzione migliore, ma per quel che fa l'app direi che mi basta anche questo
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,220
1,852
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Premetto che non conosco Android, quindi mi limito a Java (che non uso comunque da anni), e che arrivo un pò in ritardo...

Non mi sembra un buon approccio quello che hai adottato. Invece di quello switch enorme ti conveniva utilizzare una mappa, magari tenendo in una classe separata tutti i vari testi. Meglio ancora salvarli in un file o anche in SQLite, se puoi, e poi leggerli all'occorrenza.

Se non puoi, allora probabilmente farei una mappa, qualcosa tipo HashMap<Integer, ArrayList<Canzoni>>. Il numero del case è il tuo Integer della mappa; così solo accedendo a quella key, restituisci l'arraylist.

E' vero che occupi più memoria, ma hai altri benefici.
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!