5

안녕 얘들 아 너희 모두 괜찮 으면 좋겠다. 다른 동물 소리를 재생하는 Android 앱을 개발 중입니다.이전 항목보기를 새로 고치는 방법 재활용보기보기

아래의 스크린 샷에서 볼 수있는 것처럼 재활용보기를 사용하고 있습니다. 이제 문제가 발생했습니다. 내 항목 0 또는 어떤 위치에서 소리가 들릴 때마다 동물의 소리를 재생하는 행렬 안에 재생 버튼이 있습니다. 내 위치에서 일시 중지 옵션을 보여줍니다. 그러나 다음 항목 1을 클릭하거나 이전 항목 0의 이미지를 변경하지 않을 때마다.

다음 코드를 사용하여 내 어댑터 목록을 새로 고침으로써이 작업을 수행하고 있습니다. 하지만 좋은 연습은 아닙니다.

   t1.recyclerView.setAdapter(null); 
       t1.customAdapter=new CustomAdapter(t1.animalList,ctx); 
       t1.recyclerView.setAdapter(t1.customAdapter); 

는 내가 원하는 결과를 얻었다를 havent 아직 notifyItemChanged(oldPosition)처럼 모든 것을 사용하여 시도하지만.!

이 문제를 해결하는 적절한 방법을 제안 해 주시겠습니까? 나는 안드로이드가 처음인데 마음에두고 마지막 항목을보기 위해 먼저 생각한 다음 이전보기 버튼을 기본보기로 설정하고 이전의 목록 단추에서 재생하도록 설정했는데 어떻게해야할지 모르겠다.

여기 내 맞춤 코드 어댑터입니다. 여기 enter image description here

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyViewHolder> { 
    private List<Animal> AnimalList; 
    public Context ctx; 
    public static int postionchange=-1; 

    public static Tab1Birds t1; 


    final int[] countLike = {0}; 
    //public static MediaPlayer mediaPlayer2 = new MediaPlayer(); 
    int pos=0; 
    public class MyViewHolder extends RecyclerView.ViewHolder { 
      public ImageView display; 
      public TextView nameTextView; 
      public ImageButton play,options,menubtn; 
      public MyViewHolder(View view) { 
       super(view); 
       nameTextView = (TextView) view.findViewById(R.id.nameTextView); 
       play=(ImageButton)view.findViewById(R.id.playbtn); 
       options=(ImageButton)view.findViewById(R.id.menubtn); 
       display=(ImageView)view.findViewById(R.id.imageview); 
       menubtn = (ImageButton) view.findViewById(R.id.menubtn); 
        //MediaPlayerClass.mediaPlayer= new MediaPlayer(); 
      } 
    } 
    public CustomAdapter(List<Animal> moviesList,Context ct) { 
     this.AnimalList = moviesList; 
     this.ctx=ct; 
     } 
    @Override 
     public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      View itemView = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.row_list, parent, false); 
     return new MyViewHolder(itemView); 
     } 
    @Override 
     public void onBindViewHolder(final MyViewHolder holder, final int position) { 
     final Animal animal = AnimalList.get(position); 

     final int[] previous = {position}; 
      holder.nameTextView.setText(animal.getName()); 
      holder.display.setImageResource(animal.getImageResource()); 
     ////////////////////////////////////////////////////////////////////////////////////////////////////////// 
     holder.options.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       try { 
        if (MediaPlayerClass.mediaPlayer.isPlaying()) { 
         holder.play.setBackgroundResource(R.drawable.play_btn); 
         MediaPlayerClass.mediaPlayer.stop(); 
        } 
       } catch (Exception ex) { 
       } 
       Dialog dialog; 
       final String[] items = {"SET AS RING TUNE", "SET AS MESSAGE TUNE", "SET AS ALARM TUNE"}; 
       final ArrayList itemsSelected = new ArrayList(); 
       final AlertDialog.Builder builder = new AlertDialog.Builder(ctx); 
       builder.setTitle("OPTIONS"); 
       builder.setMultiChoiceItems(items, null, 
         new DialogInterface.OnMultiChoiceClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int selectedItemId, 
               boolean isSelected) { 
           if (isSelected) { 
            itemsSelected.add(selectedItemId); 
           } else if (itemsSelected.contains(selectedItemId)) { 
            itemsSelected.remove(Integer.valueOf(selectedItemId)); 
           } 
          } 
         }) 
         .setPositiveButton("Done!", new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int id) { 
           Toast toast = Toast.makeText(ctx, "successfully selected", Toast.LENGTH_SHORT); 
            toast.show(); 
           SparseBooleanArray CheCked = ((AlertDialog) dialog).getListView().getCheckedItemPositions(); 
           String str = ""; 
           if (CheCked.get(0)) { 

            savering(animal.getSoundResource()); 
           } 
           if (CheCked.get(1)) { 
            savemsg(animal.getSoundResource()); 
           } 
           if (CheCked.get(2)) { 
            savealarm(animal.getSoundResource()); 
           } 
           // if (CheCked.get(3)) { 
            // DatabaseHelper.save_bookmarks(itemsList.get(position).getitemName(), R.drawable.play_btn, itemsList.get(position).getItemTuneSt()); 
            // Toast.makeText(ctx, "Item added to favourites", Toast.LENGTH_SHORT).show(); 

           // } 
          } 
         }) 
       .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int id) { 
        } 
       }); 
       dialog = builder.create(); 
       dialog.show(); 
       /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
      } 
     }); 
     pos=position; 

     // for animation 
     // /////////////////////////// 
     //animate(holder);//Function for animation 
     ////////////////////////////// 

     holder.play.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       if(postionchange==-1) 
       { 
        postionchange=position; 
       } 
       if(postionchange!=position) 
       { 
        holder.play.setBackgroundResource(R.drawable.play_btn); 
       } 
       holder.play.setBackgroundResource(R.drawable.pause_btn);// present state 
       MediaPlayerClass.play(animal.getSoundResource(),ctx); 
       if(countLike[0] ==0) 
        { 
         countLike[0] =1; 
        }else if(countLike[0] ==1) 
        { 
         //if is playing then Pause 
         if(MediaPlayerClass.mediaPlayer.isPlaying()) 
          MediaPlayerClass.mediaPlayer.stop(); 

         t1.recyclerView.setAdapter(null); 
         t1.customAdapter=new CustomAdapter(t1.animalList,ctx); 
         t1.recyclerView.setAdapter(t1.customAdapter); 


         holder.play.setBackgroundResource(R.drawable.play_btn); //sound stop show play button 
         countLike[0] =2; 
        } 
        if(countLike[0] >1) 
        { 
         countLike[0] =0; 
         holder.play.setBackgroundResource(R.drawable.play_btn); // click to play music, click again to stop music 

        } 
        //setOnCompletionListener 
       MediaPlayerClass.mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
        @Override 
        public void onCompletion(MediaPlayer mediaPlayer) { 
         holder.play.setBackgroundResource(R.drawable.play_btn); 
        } 
       }); 
       // MediaPlayerClass.mediaPlayer.start(); 

       } 
     }); 
    } 
     @Override 
     public int getItemCount() { 
      return AnimalList.size(); 
     } 
    //animation 
    public void animate(RecyclerView.ViewHolder viewHolder) { 
     final Animation animAnticipateOvershoot = AnimationUtils.loadAnimation(ctx, R.anim.bounce_interpolator); 
     viewHolder.itemView.setAnimation(animAnticipateOvershoot); 
    } 

    ////////////////////////////////////////////////////////////////////////////////////////// 

} 

삼성 핸드폰에서 음악 플레이어의 예입니다.! 음악을 재생할 때 애니메이션이 표시되고 다음 노래를 재생하면 해당 노래가 재생되고 이전 재생 음악 및 해당 애니메이션이 중지됩니다. 미디어 플레이어를 중지하는 방법을 알고 있지만 변경하려면 어떻게해야합니까 애니메이션 또는 음악 라이브러리 등?

Stops Previous Animation in row and play music with animation.!

Samsung media Player

+0

몇 가지 코드로 알려 주실 수 있습니까? 우리가하는 일을 보지 않고는 도울 수 없을 것 같습니다. – Jay

+0

@ 제이 코드가 추가되었습니다! 그것 좀 봐. –

+0

나는 그것을 찾는 누군가를 찾고있다.! –

답변

0

벨로 샘플 RecyclerView을 사용하여 일반 목록 데이터를 사용할 수 있습니다.

  1. 먼저 클릭 한 위치를 저장해야하며 notifyDataSetChanged()를 적용해야합니다.
  2. 그 후 목록 새로 고침을하면 실제 바인딩 위치로 저장된 위치를 확인한 다음 필요한 사항을 적용합니다.

    공공 무효 onBindViewHolder (최종 MyViewHolder 홀더, 최종 INT 위치) {

    holder.tvGroupName.setText(list.get(position).getGroupName()); 
    
        holder.itemView.setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
    
    
          // Save position in item click then refresh list 
          pos = position; 
          notifyDataSetChanged(); 
    
         } 
        }); 
    
        // Once all items started refreshing check your save position with actual position then change text 
        if (pos == position) { 
         holder.tvGroupName.setText("Testing"); 
        } 
    
    } 
    

희망 도움이 샘플 ..

그리고,

는 또한 클래스 확인이 수정 그리고 그것이 효과가 있기를 바랍니다 ..

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyViewHolder> { 
    private List<Animal> AnimalList; 
    public Context ctx; 
    public static int postionchange=-1; 

    public static Tab1Birds t1; 


    final int[] countLike = {0}; 
    //public static MediaPlayer mediaPlayer2 = new MediaPlayer(); 
    int pos; 
    public class MyViewHolder extends RecyclerView.ViewHolder { 
     public ImageView display; 
     public TextView nameTextView; 
     public ImageButton play,options,menubtn; 
     public MyViewHolder(View view) { 
      super(view); 
      nameTextView = (TextView) view.findViewById(R.id.nameTextView); 
      play=(ImageButton)view.findViewById(R.id.playbtn); 
      options=(ImageButton)view.findViewById(R.id.menubtn); 
      display=(ImageView)view.findViewById(R.id.imageview); 
      menubtn = (ImageButton) view.findViewById(R.id.menubtn); 
      //MediaPlayerClass.mediaPlayer= new MediaPlayer(); 
     } 
    } 
    public CustomAdapter(List<Animal> moviesList,Context ct) { 
     this.AnimalList = moviesList; 
     this.ctx=ct; 
    } 
    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.row_list, parent, false); 
     return new MyViewHolder(itemView); 
    } 
    @Override 
    public void onBindViewHolder(final MyViewHolder holder, final int position) { 
     final Animal animal = AnimalList.get(position); 

     final int[] previous = {position}; 
     holder.nameTextView.setText(animal.getName()); 
     holder.display.setImageResource(animal.getImageResource()); 
     ////////////////////////////////////////////////////////////////////////////////////////////////////////// 
     holder.options.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       try { 
        if (MediaPlayerClass.mediaPlayer.isPlaying()) { 
         holder.play.setBackgroundResource(R.drawable.play_btn); 
         MediaPlayerClass.mediaPlayer.stop(); 
        } 
       } catch (Exception ex) { 
       } 
       Dialog dialog; 
       final String[] items = {"SET AS RING TUNE", "SET AS MESSAGE TUNE", "SET AS ALARM TUNE"}; 
       final ArrayList itemsSelected = new ArrayList(); 
       final AlertDialog.Builder builder = new AlertDialog.Builder(ctx); 
       builder.setTitle("OPTIONS"); 
       builder.setMultiChoiceItems(items, null, 
         new DialogInterface.OnMultiChoiceClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int selectedItemId, 
               boolean isSelected) { 
           if (isSelected) { 
            itemsSelected.add(selectedItemId); 
           } else if (itemsSelected.contains(selectedItemId)) { 
            itemsSelected.remove(Integer.valueOf(selectedItemId)); 
           } 
          } 
         }) 
         .setPositiveButton("Done!", new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int id) { 
           Toast toast = Toast.makeText(ctx, "successfully selected", Toast.LENGTH_SHORT); 
           toast.show(); 
           SparseBooleanArray CheCked = ((AlertDialog) dialog).getListView().getCheckedItemPositions(); 
           String str = ""; 
           if (CheCked.get(0)) { 

            savering(animal.getSoundResource()); 
           } 
           if (CheCked.get(1)) { 
            savemsg(animal.getSoundResource()); 
           } 
           if (CheCked.get(2)) { 
            savealarm(animal.getSoundResource()); 
           } 
           // if (CheCked.get(3)) { 
           // DatabaseHelper.save_bookmarks(itemsList.get(position).getitemName(), R.drawable.play_btn, itemsList.get(position).getItemTuneSt()); 
           // Toast.makeText(ctx, "Item added to favourites", Toast.LENGTH_SHORT).show(); 

           // } 
          } 
         }) 
         .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int id) { 
          } 
         }); 
       dialog = builder.create(); 
       dialog.show(); 
       /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
      } 
     }); 


     // for animation 
     // /////////////////////////// 
     //animate(holder);//Function for animation 
     ////////////////////////////// 

     holder.play.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       pos=position; 
       notifyDataSetChanged();      

      } 
     }); 

     if (pos == position){ 

      holder.play.setBackgroundResource(R.drawable.pause_btn);// present state 
      MediaPlayerClass.play(animal.getSoundResource(),ctx); 
      if(countLike[0] ==0) 
      { 
       countLike[0] =1; 
      }else if(countLike[0] ==1) 
      { 
       //if is playing then Pause 
       if(MediaPlayerClass.mediaPlayer.isPlaying()) 
        MediaPlayerClass.mediaPlayer.stop(); 

       t1.recyclerView.setAdapter(null); 
       t1.customAdapter=new CustomAdapter(t1.animalList,ctx); 
       t1.recyclerView.setAdapter(t1.customAdapter); 


       holder.play.setBackgroundResource(R.drawable.play_btn); //sound stop show play button 
       countLike[0] =2; 
      } 
      if(countLike[0] >1) 
      { 
       countLike[0] =0; 
       holder.play.setBackgroundResource(R.drawable.play_btn); // click to play music, click again to stop music 

      } 
      //setOnCompletionListener 
      MediaPlayerClass.mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
       @Override 
       public void onCompletion(MediaPlayer mediaPlayer) { 
        holder.play.setBackgroundResource(R.drawable.play_btn); 
       } 
      }); 
      // MediaPlayerClass.mediaPlayer.start(); 
     }else { 
      holder.play.setBackgroundResource(R.drawable.play_btn); 
     } 
    } 
    @Override 
    public int getItemCount() { 
     return AnimalList.size(); 
    } 
    //animation 
    public void animate(RecyclerView.ViewHolder viewHolder) { 
     final Animation animAnticipateOvershoot = AnimationUtils.loadAnimation(ctx, R.anim.bounce_interpolator); 
     viewHolder.itemView.setAnimation(animAnticipateOvershoot); 
    } 

} 

@Rajesh

-1

나는 당신의 흐름을 이해하지 못합니다. 하지만 약간의 힌트를 드릴 수 있습니다.

당신은 notifyItemChanged (INT 위치, 개체 페이로드)를 사용하는 'AnimalList'

시도가;
그리고 현재 재생중인 항목을 결정하기 위해 someState 변수 (부울 값)를 추가하십시오. 은 아래와 같습니다.

@Override 
public void onBindViewHolder(final MyViewHolder holder, final int position) { 
    final Animal animal = AnimalList.get(position); 
    if(animal.isPlayStatus()){ 
     playButton.setSelected(true); 
    }else{ 
     playButton.setSelected(false); 
    } 
} 


public class Animal { 
    boolean playStatus; 
     . 
     . 
     . 

    public boolean isPlayStatus() { 
     return playStatus; 
    } 

    public void setPlayStatus(boolean playStatus) { 
     this.playStatus = playStatus; 
    } 
} 



Animal item = AnimalList.get(somePosition); 
item.setPlayStatus(true); 
notifyItemChanged(somePosition, item); 

or 

Animal previousItem = AnimalList.get(somePosition); 
Animal item = AnimalList.get(somePosition + 1); 
previousItem.setPlayStatus(false); 
item.setPlayStatus(true); 
mAdapter.notifyItemRangeChanged(somePosition, somePosition + 1); 

or 

int index = 0; 
for (Animal item : AnimalList) { 
    if(somePosition == index){ 
     item.setPlayStatus(true); 
    }else{ 
     item.setPlayStatus(false); 
    } 
    index++; 
} 
notifyItemRangeChanged(0, AnimalList.size()); // or 
notifyDatasetChanged(); 
+0

남자 ... 당신은 그것을 얻지 못합니다 .. –

0

이 질문에 당신은 해당 항목이 재생되지 않거나에 사운드 파일이 링크 된 경우에 따라 목록 항목에 플레이 & 일시 중지 아이콘을 설정하려는

Multiple YouTubePlayerFragments inside a Horizontal ScrollView - all the players display the last loaded video

유사하다.

// Set a global variable to keep track of which list item is playing. 
    // if it is -1 then no sound is playing 
    private int lastPosition = 0; 

이제

public class VideoModel { 

    private String audioURL; 
    private String imageURL; 
    private boolean isPlaying; 

    public VideoModel(String audioURL, boolean isSelected,String imageURL) { 
     this.videoURL = videoURL; 
     this.isPlaying = isSelected; 
    } 

    public boolean isPlaying() { 
     return isPlaying; 
    } 

    public void setPlaying(boolean playing) { 
     isPlaying = playing; 
    } 

    /** 
    * @return Audio URL 
    */ 
    public String getAudioURL() { 
     return audioURL; 
    } 

    /** 
    * @return Thumbnail of Animal 
    */ 
    public String getImageURL() { 
     return imageURL; 
    } 
} 

이제 귀하의 목록에있는 모든 항목에 사용자 탭이 마지막 재생 항목을 업데이트에 항목을 재생 현재 할당해야 할 때 오디오 모델에서 유지하는 isPlaying 변수를 추가해야 마지막 재생 항목

videoGridAdapter.setOnCardClickListner(new VideoGridAdapter.OnCardClickListner() { 
      @Override 
      public void OnCardClicked(View view, int position) { 

       //Make Lats Tapped item playing false 
       listOfAudio.get(lastPosition).setPlaying(false); 

       //Make current Tapped item playing true 
       listOfAudio.get(position).setPlaying(true); 

       // update pointer current tapped audio 
       lastPosition = position; 

       //LET RCYCLERVIEW ADAPTER DO THE MAGIC 
       videoGridAdapter.notifyDataSetChanged(); 
      } 
     }); 

당신은 어댑터를 숨기기 쇼 로직을 관리 할 필요가

// Replace the contents of a view (invoked by the layout manager) 
    @Override 
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { 
     VideoViewHolder videoHolder = (VideoViewHolder) holder; 

     if (VideoGridActivity.listOfAudio.get(position).isPlaying()) { 

      //Playing Video :- Show Pause Button and hide play button 
      ((VideoViewHolder) holder).getPauseButton().setVisibility(View.VISIBLE); 
      ((VideoViewHolder) holder).getPlayButton().setVisibility(View.GONE); 

      // Play sound and do other stuff 


     } else { 

      //Not playing make Hide Pause Button and SHow Play button 
      ((VideoViewHolder) holder).getPauseButton().setVisibility(View.GONE); 
      ((VideoViewHolder) holder).getPlayButton().setVisibility(View.VISIBLE); 

     } 
     } 

이것은 의사 코드이지만이를 수행하는 방법을 알고 있습니다. 희망이 도움이됩니다.

관련 문제