Mis amigos programadores, os invoco (Android)

Visto que en Stack Overflow no me han sabido responder la duda os pregunto la duda a vosotros (copio el post tal cual de allí):

Veréis, tengo una lista de libros que estoy mostrando en un ListView, y me gustaría que al pulsar cada elemento del ListView reproduzca un sonido, en principio me conformaría con un sonido único, aunque me gustaría saber como poder reproducir un sonido por cada elemento, es decir, yo tengo la lista con diferentes libros de Harry Potter (en este caso) y me gustaría que al pulsar cada portada del libro o cada elemento se reproduzca un sonido diferente, lo he intentado con un setOnClickListener pero nada, ni tampoco con un setOnItemClickListener, no reproduce nada, y he comprobado que no fuera por el sonido de mi móvil o el propio archivo, a ver si me podeis ayudar, os dejo el código:

El Activity:

package com.eoi.aplicationmenu.books;

import android.media.MediaPlayer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

import com.eoi.aplicationmenu.R;
import com.eoi.aplicationmenu.films.FilmActivity;
import com.eoi.aplicationmenu.films.Movie;
import com.eoi.aplicationmenu.films.MovieAdapter;

import java.util.ArrayList;

public class BooksActivity extends AppCompatActivity {

    ListView lvBooks;

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

        lvBooks = findViewById(R.id.lvBooks);

        Books book1 = new Books();
        book1.setTitle("Harry Potter y la Piedra Filosofal");
        book1.setAutor("J.K. Rowling");
        book1.setUrl("https://m.media-amazon.com/images/S/aplus-media/sota/f1abc087-9d36-4c74-9f63-eae7cbd1dc8c.jpg");

        Books book2 = new Books();
        book2.setTitle("Harry Potter y la Cámara Secreta");
        book2.setAutor("J.K. Rowling");
        book2.setUrl("https://images-na.ssl-images-amazon.com/images/I/91%2BBwNDpbSL.jpg");

        Books book3 = new Books();
        book3.setTitle("Harry Potter y el Prisionero de Azkaban");
        book3.setAutor("J.K. Rowling");
        book3.setUrl("https://images-na.ssl-images-amazon.com/images/I/910GP4qni2L.jpg");

        Books book4 = new Books();
        book4.setTitle("Harry Potter y el Caliz de Fuego");
        book4.setAutor("J.K. Rowling");
        book4.setUrl("https://images-na.ssl-images-amazon.com/images/I/51-bCW%2B8%2BvL._SX316_BO1,204,203,200_.jpg");

        Books book5 = new Books();
        book5.setTitle("Harry Potter y la Orden del Fenix");
        book5.setAutor("J.K. Rowling");
        book5.setUrl("https://imagessl2.casadellibro.com/a/l/t5/22/9788478887422.jpg");

        Books book6 = new Books();
        book6.setTitle("Harry Potter y el Misterio del Principe");
        book6.setAutor("J.K. Rowling");
        book6.setUrl("https://images-na.ssl-images-amazon.com/images/I/51BsPIGtJHL._SX301_BO1,204,203,200_.jpg");

        Books book7 = new Books();
        book7.setTitle("Harry Potter y las Reliquias de la Muerte");
        book7.setAutor("J.K. Rowling");
        book7.setUrl("https://images-na.ssl-images-amazon.com/images/I/91Uo5gyDkIL.jpg");

        ArrayList<Books> books = new ArrayList<>();
        books.add(book1);
        books.add(book2);
        books.add(book3);
        books.add(book4);
        books.add(book5);
        books.add(book6);
        books.add(book7);

        BookAdapter adapter = new BookAdapter(BooksActivity.this, books);

        lvBooks.setAdapter(adapter);

    }
}

El Adapter:

package com.eoi.aplicationmenu.books;

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

import com.bumptech.glide.Glide;
import com.eoi.aplicationmenu.R;
import com.eoi.aplicationmenu.films.Movie;

import java.util.ArrayList;

public class BookAdapter extends ArrayAdapter<Books> {

    ArrayList<Books> books;

    public BookAdapter(Context context, ArrayList<Books> books) {
        super(context, R.layout.item_books, books);
        this.books = books;
    }

    @Override
    public View getView(int position,  View convertView,  ViewGroup parent) {

        LayoutInflater inflater = LayoutInflater.from(getContext()); //Rellenar

        View item = inflater.inflate(R.layout.item_books, null);

        ImageView ivPortada = item.findViewById(R.id.ivPortada);
        TextView tvTitulo = item.findViewById(R.id.tvTitulo);
        TextView tvAutor = item.findViewById(R.id.tvAutor);

        Books movie = books.get(position);

        tvTitulo.setText(movie.getTitle());
        tvAutor.setText(movie.getAutor());
        String urlPortada = movie.getUrl();

        Glide.with(getContext()).load(urlPortada).into(ivPortada);

        return item;

    }
}

El XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/ivPortada"
        android:layout_width="100dp"
        android:layout_height="150dp"
        />

    <TextView
        android:id="@+id/tvTitulo"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        android:layout_toRightOf="@+id/ivPortada"
        android:text="Este es el título del libro"
        android:textSize="12sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/tvAutor"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tvTitulo"
        android:layout_margin="8dp"
        android:layout_toRightOf="@+id/ivPortada"
        android:text="Este es el autor del libro"
        android:textSize="10sp" />

</RelativeLayout>

No se si necesitáis algún dato más, pero piedad conmigo que soy nuevo en esto de la programación en Android, Java y la programación en general y me voy enterando como buenamente puedo.

Solo voy a decirte 2 cosas:

  1. EL ListView ya está anticuado, utiliza el RecyclerView que es lo más reciente.

  2. Para los listviews debes meterle el setOnItemClickListener a la ListView si no recuerdo mal. De allí tendrás la posición que deseas.

Lo se lo se, pero es lo que estamos aprendiendo ahora mismo en clase para que veamos como funcionaban y para ver el porque el RecyclerView es mejor, de ahí que quiera hacerlo con ese ejemplo…

1 me gusta

Ah bueno, que es una asignatura jejeeje.

Bueno, espero haberte ayudado con lo que te he dicho. Un consejo: Si ves que la lista no refresca bien (items que aparecen donde no deben), utiliza un ViewHolder.

Si, es una asignatura de un curso, es mi primera vez tocando programación, se lo básico de Java y ahora me meto en Android y pues me quiero echar un poco las manos a la cabeza :rofl: