user1712775
user1712775

Reputation:

How update recyclerviews other items when click on an item?

I have an application that uses MediaPlayer class to play musics from internet. I used recyclerview, and on the each item , it has a play/puse button to start playing and pause the sound. How to change the play button to pause button when the user clicks on another items play button?

public class Adapter extends RecyclerView.Adapter<Adapter.Viewholder> {

private List<Track> tracks;
private Context context;

public Adapter(List<Track> tracks, Context context) {
    this.tracks = tracks;
    this.context = context;
}

@NonNull
@Override
public Viewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.track_item, parent, false);
    return new Viewholder(view);
}

@Override
public void onBindViewHolder(@NonNull final Viewholder holder, final int position) {


    holder.title.setText(tracks.get(position).getTitle());
    holder.id.setText(tracks.get(position).getId());
    Glide.with(context).load(tracks.get(position).getImgurl()).into(holder.trackImage);
   holder.btnPlay.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View v) {

           holder.btnPause.setVisibility(View.VISIBLE);
           Intent intent = new Intent(context, Player.class);
           intent.putExtra("URL", tracks.get(position).getMusicurl());
           context.startService(intent);

       }
   });

   holder.btnPause.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View v) {
           Player.killMediaPlayer();
           holder.btnPause.setVisibility(View.INVISIBLE);
       }
   });

}

@Override
public int getItemCount() {
    return tracks.size();
}


public static class Viewholder extends RecyclerView.ViewHolder {

    TextView title, id;
    ImageView trackImage;
     ImageButton btnPlay;

    public Viewholder(View itemView) {
        super(itemView);
        title = itemView.findViewById(R.id.title);
        id = itemView.findViewById(R.id.id);
        trackImage = itemView.findViewById(R.id.trackImage);
        btnPlay = itemView.findViewById(R.id.play);
    }
}

}

Upvotes: 5

Views: 3529

Answers (5)

user1712775
user1712775

Reputation:

holder.btnPlay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(Track.isPlaying()){
                    notifyItemChanged(currentItem, holder );
                }

                Track.setPlaying(true);
                currentItem = holder.getAdapterPosition();
                Log.i("TAG", "Position : " + currentItem);
                holder.equalizer.setVisibility(View.VISIBLE);
                holder.btnPause.setVisibility(View.VISIBLE);
                holder.btnPlay.setVisibility(View.INVISIBLE);
                Intent intent = new Intent(context, Player.class);
                intent.putExtra("URL", tracks.get(position).getMusicurl());
                intent.putExtra("ID", tracks.get(position).getId());
                context.startService(intent);

            }
        });

Upvotes: 0

avinash
avinash

Reputation: 1774

Here is sample code :

public class MainActivity extends AppCompatActivity {
private TrackAdapter trackAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    RecyclerView recyclerView = findViewById(R.id.reycleView);
    ((SimpleItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);

    trackAdapter = new TrackAdapter();
    trackAdapter.setCallBack(new CallBackImpl());
    trackAdapter.setTracks(getTracks());
    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(mLayoutManager);
    recyclerView.setHasFixedSize(true);
    recyclerView.setAdapter(trackAdapter);


}

private List<Track> tracks;

private List<Track> getTracks() {
    tracks = new ArrayList<>();
    for (int i = 0; i < 50; i++) {
        Track track = new Track();
        track.setTrackName(" Track " + i);
        track.setPlaying(false);
        tracks.add(track);
    }
    return tracks;

}

int currentPosition = -1;

private class CallBackImpl implements TrackAdapter.CallBack {
    @Override
    public void clicked(int position) {
        Track track = tracks.get(position);
        tracks.get(position).setPlaying(!track.isPlaying());
        if (currentPosition >-1) {
            track = tracks.get(currentPosition);
            tracks.get(currentPosition).setPlaying(!track.isPlaying());
        }
        trackAdapter.setTracks(tracks);
        trackAdapter.notifyItemChanged(currentPosition);
        trackAdapter.notifyItemChanged(position);
        currentPosition = position;
    }
}
}

TrackAdapter.java

public class TrackAdapter extends RecyclerView.Adapter<TrackAdapter.VH> {
private int current;

public void setCallBack(CallBack callBack) {
    this.callBack = callBack;
}

private CallBack callBack;
interface  CallBack
{
    void clicked(int position);
}

public void setTracks(List<Track> tracks) {
    this.tracks = tracks;
}

private List<Track> tracks;

@Override
public VH onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout, parent, false);
    return new VH(view);
}

@Override
public void onBindViewHolder(VH holder, int position) {
    holder.setData(tracks.get(position));

}

@Override
public int getItemCount() {
    if (tracks == null) {
        return 0;
    } else {
        return tracks.size();
    }

}


class VH extends RecyclerView.ViewHolder {
    TextView textView;

    TextView playView;

    public VH(View itemView) {
        super(itemView);
        textView = itemView.findViewById(R.id.track);
        playView = itemView.findViewById(R.id.trackplay);
        playView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (callBack!=null)
                {
                    callBack.clicked(getAdapterPosition());
                }

            }
        });
    }

    void updateState(boolean isPlaying) {
        if (isPlaying) {
            current = getAdapterPosition();
            playView.setText("Playing");
        } else {
            playView.setText("Stopped");
        }

    }

    void setData(Track data) {
        textView.setText(data.getTrackName());
        updateState(data.isPlaying());
    }
}
  }

Track .java

 public class Track {
 private boolean isPlaying;

public String getTrackName() {
    return trackName;
}

public void setTrackName(String trackName) {
    this.trackName = trackName;
}

private String trackName;

public boolean isPlaying() {
    return isPlaying;
}

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

layout.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="wrap_content">
<TextView
android:id="@+id/track"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
    android:id="@+id/trackplay"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

   </LinearLayout>

Click is implemented on Stopped Text.

Upvotes: 0

faran.javed
faran.javed

Reputation: 418

you have to use notifyDataSetChanged() - it will reset all recyclerView items then using notifyItemChanged(poition) or mList.get(getAdapterPosition()) - it will update the specific position.

Upvotes: 1

Chethan Kumar
Chethan Kumar

Reputation: 195

  1. your can use notifyDataSetChange() - it will update all recyclerView items

  2. use notifyItemChanged(poition) - it will update the particular position.

    NOTE : Suppose if your mobile screen has 8 items display at a moment and you made 1th position as pause, the 9th position will show as pause. To overcome this, try to compare the song_title/artist name before notifying

Upvotes: 1

Koustuv Ganguly
Koustuv Ganguly

Reputation: 899

Very simple just loop through your entire dataset and set all of them to pause except the current one.Then call notifyDatasetChanged();

Upvotes: 1

Related Questions