0

I have a recyclerview which has 2 imageviews for play and stop button inside a cardview. i am using onclick method to change play image to pause via setImageSrouce. My problem is that i am not able to change previous row's imageview back to play button upon clicking on any other row's image button (Play image). It would be great if someone could help solve this.

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>{
private static final String TAG = "RecyclerViewAdapter";
    private ArrayList<String> songnames=new ArrayList<>();
    private ArrayList<Integer> mFlag=new ArrayList<>();
    private ArrayList<Integer> song=new ArrayList<>();
    private ArrayList<Integer> mplay=new ArrayList<>();
    private ArrayList<Integer> mstop=new ArrayList<>();
    private ArrayList<Integer> mpause=new ArrayList<>();
    MediaPlayer player;
public static int path;
ArrayList<Integer> msong, ArrayList<Integer> mplay,ArrayList<Integer> mstop
private Context mcontext;
int i=0;
private ArrayList<ItemData> itemData;
    private int position;
    private Object payload;
    public RecyclerViewAdapter(Context mcontext, ArrayList<String> msongnamesnames, ArrayList<Integer> flag, ArrayList<Integer> msong, ArrayList<Integer> mplay, ArrayList<Integer> mstop, ArrayList<Integer> pause) {
        this.mcontext = mcontext;
        this.songnames = msongnamesnames;
        this.mFlag = flag;
        this.song=msong;
        this.mplay=mplay;
        this.mstop=mstop;
        this.mpause=pause;
    }
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
       View view= LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_list_item,viewGroup,false);
       ViewHolder holder = new ViewHolder(view);
       return holder;
    }                           
    @Override
    public void onBindViewHolder(@NonNull final ViewHolder viewHolder, final int position) {
        viewHolder.songname.setText(songnames.get(position));
        viewHolder.flag.setImageResource(mFlag.get(position));
        viewHolder.play.setImageResource(mplay.get(position));
        viewHolder.stop.setImageResource(mstop.get(position));
        viewHolder.play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                path=song.get(position);
                play(v, viewHolder, position);
                Log.d(TAG, "onClick: position is " + mpause);
            }
        });

        viewHolder.stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                stopPlayer(viewHolder, position);
            }
        });
    }
public boolean checkimage(ViewHolder viewHolder) {
        String imagename= viewHolder.play.getResources().getResourceEntryName(R.id.playbutton);
return  true;
}
    @Override
    public int getItemCount() {
        return songnames.size() ;
    }
    public class ViewHolder extends RecyclerView.ViewHolder {
TextView songname;
ImageView flag;
ImageView play;
ImageView stop;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            songname=itemView.findViewById(R.id.songname);
            flag=itemView.findViewById(R.id.FlagHolder);
         play=itemView.findViewById(R.id.playbutton);
              stop=itemView.findViewById(R.id.stopbutton);
        }
  }
    public void play(View v, final ViewHolder viewHolder, final int position) {
        if(player!=null) {
            Log.d(TAG, "Here position is" + position );
            player.release();
            player = null;
            for(int i=0; i<songnames.size(); i++) {
                viewHolder.play.setImageResource(mplay.get(i));

            }
        }
        if (player == null) {
            player = (MediaPlayer) MediaPlayer.create(mcontext, path);
                    viewHolder.play.setImageResource(mpause.get(position));
            player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    stopPlayer(viewHolder, position);
                }
            });
        }
        player.start();
    }
    public void pause(View v) {
        if (player != null) //is called to check a user is pressing the pause button which started the song
        {
            player.pause();
        }
    }
    public void stop(ViewHolder viewHolder, int position) {
        stopPlayer(viewHolder, position);
    }
    private void stopPlayer(ViewHolder viewHolder, int position) {
            viewHolder.play.setImageResource(mplay.get(position));
        if (player != null) {
            player.release();
            player = null;
            Toast.makeText(mcontext, "MediaPlayer released", Toast.LENGTH_SHORT).show();
        }
    }
}
ZigZag
  • 53
  • 6
  • you can store some kind of state for each item, and change it to `Playing` or `idle` for every item, and then `adapter.notifydataSetChanged()`, which will make your RecyclerView to recreate items, and in `onBindViewHolder` you check which is the state of the item, and set corresponding images – Vladyslav Matviienko Apr 25 '19 at 06:45
  • possibly you are looking to update other recyclerview item from one item. This link might help you https://stackoverflow.com/questions/47864758/how-to-update-data-in-recyclerview-item-from-another-item – Mukul Bhardwaj Apr 25 '19 at 07:03
  • Thank you for your recommendations – ZigZag Apr 25 '19 at 09:32

1 Answers1

0

in your model add one Boolean,

boolean isPlaying = false; //with getter setter

in onBindViewHolder() do like this,

if(songnames.get(position).isPlaying())
    viewHolder.play.setImageResource(R.drawable.play);
else
    viewHolder.play.setImageResource(R.drawable.stop);

viewHolder.play.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                  for(int i = 0; i<songnames.size(); i++)
                     songnames.get(i).setIsPlaying(false);
                  songnames.get(viewHolder.getAdapterPosition()).setIsPlaying(true);
                  notifyDataSetChanged();
                }
            });

SUGGESTION

don't use so many arraylist in adapter

 private ArrayList<String> songnames=new ArrayList<>();
    private ArrayList<Integer> mFlag=new ArrayList<>();
    private ArrayList<Integer> song=new ArrayList<>();
    private ArrayList<Integer> mplay=new ArrayList<>();
    private ArrayList<Integer> mstop=new ArrayList<>();
    private ArrayList<Integer> mpause=new ArrayList<>();

avoid doing this, make one model for all of your required fields and use this model in arraylist.

Priyanka
  • 3,369
  • 1
  • 10
  • 33