2016-04-13 3 views
-1

Ich baue App mit Bildern von Tieren, und nachdem Sie auf Tier klicken, seinen Sound für das Tier zu spielen.Android, wie für jedes Element in Recyclerview verschiedenen Sound zu spielen

Ich benutze Recyclerview für die Anzeige aller Tiere.

Mein Problem ist, dass ich nicht weiß, wie Click-Ereignis für das Abspielen von Sounds für jedes Tier zu behandeln. Ich weiß, wie man den gleichen Sound für jeden Gegenstand in Recyclerview spielt, aber ich weiß nicht, wie man mit spezifischem Sound für jeden Gegenstand umgeht.

das ist Code für meine Klasse wo ich handle Daten, wo ich alle Tiernamen, Bilder und Sounds für jedes Objekt.

package com.example.android.animalsoundsforchildren; 
 

 
import java.util.ArrayList; 
 

 

 
public class Zivotinje { 
 
    private String mAnimal_name; 
 
    private int mAnimal_slika; 
 
    private int mSound; 
 

 

 
    public Zivotinje(String animalName, int slika, int sound) { 
 
     this.setmAnimal_name(animalName); 
 
     this.setmAnimal_slika(slika); 
 
     this.setmSound(sound); 
 
    } 
 

 
    public String getmAnimal_name() { 
 
     return mAnimal_name; 
 
    } 
 

 
    public void setmAnimal_name(String mAnimal_name) { 
 
     this.mAnimal_name = mAnimal_name; 
 
    } 
 

 
    public int getmAnimal_slika() { 
 
     return mAnimal_slika; 
 
    } 
 

 
    public void setmAnimal_slika(int mAnimal_slika) { 
 
     this.mAnimal_slika = mAnimal_slika; 
 
    } 
 

 
    public int getmSound() { 
 
     return mSound; 
 
    } 
 

 
    public void setmSound(int mSound) { 
 
     this.mSound = mSound; 
 
    } 
 

 
    //putting data 
 
    public static ArrayList<Zivotinje> createZivotinjeList() { 
 
     ArrayList<Zivotinje> animals = new ArrayList<Zivotinje>(); 
 

 
     animals.add(new Zivotinje("Sheep", R.drawable.domestic_sheep, R.raw.gun)); 
 
     animals.add(new Zivotinje("Sparrow", R.drawable.birds_sparrow, R.raw.birds_sparrow)); 
 
     animals.add(new Zivotinje("Dolphin", R.drawable.sea_dolphin, R.raw.dolphin)); 
 
     animals.add(new Zivotinje("Bumblebee", R.drawable.insects_bumblebee, R.raw.bumblebee)); 
 
     animals.add(new Zivotinje("Tractor", R.drawable.cars_tractor, R.raw.tractor)); 
 
     animals.add(new Zivotinje("Baby Cry", R.drawable.laugh_baby_cry, R.raw.baby_cray)); 
 
     animals.add(new Zivotinje("Wind", R.drawable.nature_wind, R.raw.wind)); 
 
     animals.add(new Zivotinje("Golf", R.drawable.effects_golf, R.raw.golf)); 
 
     animals.add(new Zivotinje("Clock", R.drawable.others_clock, R.raw.clock)); 
 

 

 
     return animals; 
 
    } 
 
}

Dies ist Code für Adapter, und hier Griff i klicken und wenn ich auf Element klicken, den gleichen Ton spielen, aber wie verschiedenen Sound für jedes Tier zu spielen, nicht der gleiche Ton wie hier. Hier spiele ich immer Sound R.raw.clock

package com.example.android.animalsoundsforchildren; 
 

 
import android.content.Context; 
 
import android.media.MediaPlayer; 
 
import android.support.v7.widget.RecyclerView; 
 
import android.view.LayoutInflater; 
 
import android.view.View; 
 
import android.view.ViewGroup; 
 
import android.widget.ImageView; 
 
import android.widget.TextView; 
 

 
import java.util.List; 
 

 

 
public class ZivotinjeAdapter extends RecyclerView.Adapter<ZivotinjeAdapter.ViewHolder> { 
 

 
    @Override 
 
    public ZivotinjeAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
 
     Context context = parent.getContext(); 
 
     LayoutInflater inflater = LayoutInflater.from(context); 
 

 
     // Inflate the custom layout 
 
     View contactView = inflater.inflate(R.layout.item_zivotinje, parent, false); 
 

 
     // Return a new holder instance 
 
     ViewHolder viewHolder = new ViewHolder(contactView); 
 
     return viewHolder; 
 
    } 
 

 
    @Override 
 
    public void onBindViewHolder(ZivotinjeAdapter.ViewHolder viewHolder, int position) { 
 

 
     Zivotinje zivotinjeIme = mZivotinje.get(position); 
 

 
     // Set item views based on the data model 
 
     TextView textView = viewHolder.nameTextView; 
 
     textView.setText(zivotinjeIme.getmAnimal_name()); 
 

 
     ImageView slika_source = viewHolder.imageView; 
 
     slika_source.setImageResource(zivotinjeIme.getmAnimal_slika()); 
 

 

 

 

 

 
    } 
 

 

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

 
    public static class ViewHolder extends RecyclerView.ViewHolder { 
 

 
     public ImageView imageView; 
 
     public TextView nameTextView; 
 

 

 

 

 
     public ViewHolder(final View itemView) { 
 
      super(itemView); 
 

 
      nameTextView = (TextView) itemView.findViewById(R.id.zivotinjaIme_id); 
 
      imageView = (ImageView) itemView.findViewById(R.id.slika_id); 
 

 

 

 

 

 
      //It works when i play for each item sound but how to play specific sound for each animal 
 
      itemView.setOnClickListener(new View.OnClickListener() { 
 
       @Override 
 
       public void onClick(View v) { 
 
        MediaPlayer mediaPlayer = MediaPlayer.create(v.getContext(), R.raw.clock); 
 
        mediaPlayer.start(); 
 
       } 
 
      }); 
 

 
     } 
 
    } 
 

 
    private List<Zivotinje> mZivotinje; 
 

 
    public ZivotinjeAdapter(List<Zivotinje> animals) { 
 
     mZivotinje = animals; 
 
    } 
 
}

+0

Möchten Sie nur Bild klickbar oder das Listenelement anklickbar sein? –

+0

Es ist bereits Listenelement anklickbar, aber auf diese Weise spielt es nur den gleichen Sound. Ich weiß nicht, wie ich es erreichen soll, wenn ich auf ein bestimmtes Element klicke, um den Sound für dieses Listenelement abzuspielen. – beginner

Antwort

0

Siehe den Link https://gist.github.com/grantland/cd70814fe4ac369e3e92

Sie auf das Element klicken Ereignis beziehen können und wie den auf Click-Ereignis unter

lesen Sie bitte den Code zu erhalten. Ich habe die Änderungen vorgenommen

public class ZivotinjeAdapter extends RecyclerView.Adapter<ZivotinjeAdapter.ViewHolder> { 

    @Override 
    public ZivotinjeAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     Context context = parent.getContext(); 
     LayoutInflater inflater = LayoutInflater.from(context); 

     // Inflate the custom layout 
     View contactView = inflater.inflate(R.layout.item_zivotinje, parent, false); 

     // Return a new holder instance 
     ViewHolder viewHolder = new ViewHolder(contactView); 
     return viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(ZivotinjeAdapter.ViewHolder viewHolder, int position) { 

     Zivotinje zivotinjeIme = mZivotinje.get(position); 

     // Set item views based on the data model 
     TextView textView = viewHolder.nameTextView; 
     textView.setText(zivotinjeIme.getmAnimal_name()); 

     ImageView slika_source = viewHolder.imageView; 
     slika_source.setImageResource(zivotinjeIme.getmAnimal_slika()); 

     viewHolder.setItem(mZivotinje[position]); 




    } 


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

    public static class ViewHolder extends RecyclerView.ViewHolder { 

     public ImageView imageView; 
     public TextView nameTextView; 
     private Zivotinje mItem; 





     public ViewHolder(final View itemView) { 
      super(itemView); 

      nameTextView = (TextView) itemView.findViewById(R.id.zivotinjaIme_id); 
      imageView = (ImageView) itemView.findViewById(R.id.slika_id); 


public void setItem(Zivotinje item) { 
      mItem = item; 

     } 




      //It works when i play for each item sound but how to play specific sound for each animal 
      itemView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 

         // here you will get mItem and from that you can get the sound 
        MediaPlayer mediaPlayer = MediaPlayer.create(v.getContext(), R.raw.clock); 
        mediaPlayer.start(); 
       } 
      }); 

     } 
    } 

    private List<Zivotinje> mZivotinje; 

    public ZivotinjeAdapter(List<Zivotinje> animals) { 
     mZivotinje = animals; 
    } 
} 
+0

Ihre Lösung hat perfekt funktioniert. DANKE. Ich musste nur von viewHolder.setItem (mZivotinje [Position]) wechseln; to viewHolder.setItem (mZivotinje.get (Position)); Ich werde deine Antwort später bearbeiten. Nochmals vielen Dank – beginner

0

Eine Sache, die Sie tun können, ist eine switch-Anweisung verwenden, die prüfen würde, welches Tier angeklickt wird und dann entsprechend handeln.

Wenn Sie eine große Sammlung von Tieren haben, machen Sie alle Tiere von der Animal-Klasse, die eine abstrakte makeSound() -Methode haben würde. Überschreiben Sie diese Methode in den Unterklassen, damit sie ihren eigenen Sound erzeugen können. Rufen Sie in der Methode onClick() die Methode makeSound() auf.

+0

Aber in meiner App möchte ich 200 Tiere haben, ich kann nicht 200 Schaltanweisungen machen. – beginner

+0

Siehe meine aktualisierte Antwort. – Ruben2112

+0

danke, dass du mir geholfen hast. Ich implementiere Mourice-Lösung und es hat funktioniert. – beginner

0

Sie die Position von ViewHolder zugreifen können einen Anruf an getAdapterPosition indem sie()

Sobald Sie haben Position Sie das Element (Tier-Objekt) erhalten können an dieser Position, wie etwas durch eine Liste der Tierhaltung in Ihrem Adapter. Jetzt können Sie einfach auf den Klang im Objekt zugreifen, um zu spielen.

+0

Vielen Dank für Ihre Hilfe, ich implementiere Mourice Lösung und es hat perfekt funktioniert. – beginner

Verwandte Themen