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.
- ¿Cómo puedo forzar un sitio a escala para fijar para móviles (Iphone android ..)
- Establecer el ancho y la altura de la imagen en ImageView
- Analógico de android: filterTouchesWhenObscured para el nivel de API inferior a 9
- A veces listView.getChildAt (int index) devuelve NULL (Android)
- Tabla de Donuts Android
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); } ////////////////////////////////////////////////////////////////////////////////////////// }
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?
- Android Cómo obtener una vista previa de una imagen, utilizando su ruta de acceso desde SDcard, desde mi aplicación
- compruebe si existe una vista desde un inflador de diseño antes de añadir otro
- LAYER_TYPE_SOFTWARE causa que WebView cargue la página en blanco
- Android: ExpandableListView indicador de grupo dibujable que es grande cuando uso mi propio icono
- ¿Cómo crear Clone-Duplicate View?
- agregar vista (vista de texto) en AsyncTask
- Refresh ExpandableListView al agregar datos: keep state
- Cómo agregar vista al diseño XML android
El siguiente ejemplo funciona para una lista normal de datos con RecyclerView.
- En primer lugar tenemos que guardar la posición de clic, entonces tenemos que aplicar notifyDataSetChanged ().
-
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();
- ADB comando tcpip sin cable
- El informe de mercado de mi manifiesto no tiene un permiso en la lista, cuando definitivamente lo hace?