2016-04-13 5 views
-1

私は動物の画像でアプリを構築し、動物をクリックするとその動物の再生音が鳴ります。Android recyclerviewの各項目の異なる音を再生する方法

私はすべての動物のアイテムを表示するためにRecyclerviewを使用します。

私の問題は、各動物の音を再生するためのクリックイベントの処理方法がわかりません。私は、recyclerviewの各アイテムで同じサウンドを再生する方法を知っていますが、各アイテムの特定のサウンドをどのように扱うかはわかりません。

これは、私がデータを扱う私のクラスのコードです。ここでは、すべての動物の名前、画像、サウンドを各オブジェクトに入れます。

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; 
 
    } 
 
}

これは、アダプタのコードであり、ここでは私は同じ音ではなく、クリックした項目に私をクリックしたとき、それは同じ音を再生扱うが、各動物ごとに異なるサウンドを再生する方法ここのような。あなたが行うことができ、ここで私はいつも音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

画像のみをクリック可能にしたい、またはリスト項目をクリック可能にしますか? –

+0

すでにリストアイテムがクリック可能ですが、この方法では同じサウンドしか再生されません。私は特定のアイテムをクリックしてそのリストアイテムのサウンドを再生する方法を知りません。 – beginner

答えて

0

は、アイテムのクリックイベントを参照し、どのようにクリックイベント

上のアイテムを取得するには、以下のコードを参照してくださいすることができ、リンクhttps://gist.github.com/grantland/cd70814fe4ac369e3e92

を参照してください。私は変更を加えました

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

あなたのソリューションは完全に機能しました。ありがとうございました。私はviewHolder.setItem(mZivotinje [position])から変更する必要があります。 viewHolder.setItem(mZivotinje.get(position));に移動します。私はあなたの答えを後で編集します。もう一度、ありがとう – beginner

0

ことの一つは、クリックされた動物をチェックし、それに応じて行動するだろうswitchステートメントを使用しています。

動物のコレクションが大量の場合は、すべての動物を抽象的なmakeSound()メソッドを持つAnimalクラスから継承させます。サブクラスでそのメソッドをオーバーライドして、独自のサウンドを作成させます。 onClick()メソッドでは、makeSound()メソッドを呼び出します。

+0

しかし、私のアプリでは200匹の動物が欲しいと思っています。 – beginner

+0

私の更新された回答を参照してください。 – Ruben2112

+0

私を助けてくれてありがとう。私はモーリスのソリューションを実装し、それは働いた。 – beginner

0

あなたはgetAdapterPosition(への呼び出しを行うことによってViewHolderからの位置にアクセスすることができます)

あなたがポジションを持っていたら、その位置にアイテム(動物オブジェクト)を取得することができ、自分の中で動物のリストを保持することによってのようなものアダプタ。これで、再生するオブジェクトのサウンドに簡単にアクセスできます。

+0

私を助けてくれてありがとう、私はMouriceソリューションを実装し、それは完璧に働いた。 – beginner

関連する問題