Cómo actualizar la vista de la vista de fila de elementos anteriores de la vista de reciclaje

Hola chicos espero que todos están bien. Estoy desarrollando una aplicación para Android que reproducirá diferentes sonidos de animales.

Estoy usando la vista de reciclaje como se puede ver en la captura de pantalla de abajo. Ahora estoy haciendo frente a un problema, tengo un botón del juego dentro de mi fila que esté jugando el sonido del animal cada vez que juego el sonido de mi artículo 0 o cualquier posición que me muestra la opción de la pausa dentro de la visión. Pero cada vez que haga clic en el siguiente elemento 1 o cualquier otro no está cambiando la imagen del elemento anterior 0.

Lo estoy haciendo refrescando mi lista del adaptador usando código siguiente.! Pero creo que no es una buena práctica.!

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

Intenté usar cada cosa como notifyItemChanged(oldPosition) pero todavía havent conseguido mi resultado deseado.!

Por favor, sugerirme una manera adecuada de resolver esto? Soy nuevo en android y tengo un pensamiento en mente para obtener la vista del último elemento y guardarlo en primer lugar, a continuación, obtener esa vista y establecer la imagen predeterminada jugar en mi botón de lista anterior, pero no sé cómo hacer esto?

Aquí está mi código de adaptador personalizado.

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

Introduzca aquí la descripción de la imagen

Aquí está un ejemplo de reproductor de música en Samsung . Cuando alguna vez toco música, muestra animación y cuando toco la siguiente canción toco esa canción y dejo de reproducir música anterior y su animación. Sé cómo detener reproductor de medios, pero ¿cómo cambiar la parada de animación o biblioteca de música, etc?

Detiene la animación previa en fila y reproduce música con animación.

Reproductor de medios Samsung

El siguiente ejemplo funciona para una lista normal de datos con RecyclerView.

  1. En primer lugar tenemos que guardar la posición de clic, entonces tenemos que aplicar notifyDataSetChanged ().
  2. Después de eso, cuando la lista de refresco compruebe su posición guardada con su posición de enlace actual, a continuación, aplique los cambios que necesita.

    Public void onBindViewHolder (titular final de MyViewHolder, posición final de 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"); } } 

Espero que esta muestra útil ..

Y,

También he modificado tu clase comprobar esto y espero que funcione.

 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

Esta pregunta es similar a

Multiple YouTubePlayerFragments dentro de un ScrollView horizontal – todos los jugadores muestran el último video cargado

Desea establecer el icono de reproducción y pausa en el elemento de lista dependiendo de si se está reproduciendo o no el archivo de sonido vinculado a ese elemento.

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

Ahora necesitas añadir la variable isPlaying para guardar en tu modelo de audio

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

Ahora, cuando el usuario pulsa en cualquier elemento de su lista, debe actualizar el último elemento de reproducción y asignar ahora el elemento de reproducción al último elemento de reproducción

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

Necesita administrar la lógica de show hide en el adaptador

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

Este es un pseudo código, pero tienes una idea de cómo hacerlo. Espero eso ayude.

No entiendo su flujo. Pero puedo darte una pista.

Tienes ' AnimalList '

Intenta usar notifyItemChanged (int position, Object payload);
Y agregue variable someState (booleana) para determinar qué elemento está reproduciendo ahora. como abajo.

 @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(); 
  • Cómo obtener un Gesture View como en la aplicación oficial de Facebook
  • HasStableIds () en ListView expandible?
  • Diseño de vistas personalizadas
  • Android ampliablelistview grupo / padre imagen de fondo cambiar cuando se colapsan o expanden
  • Registrarse en la transmisión local dentro de una vista personalizada
  • Cuando establezco MinimumHeight, ¿qué unidades estoy usando?
  • Android doble lista de correo expandible oculta los elementos si la lista es demasiado grande
  • API de Android 23. WebView cómo ignorar errores de JavaScript
  • Android ViewPropertyAnimator no se escala al mismo tiempo
  • Cargar HTML en la vista web en Android?
  • Cómo agregar vistas dentro de una vista personalizada?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.