-1

I'm building a music player and I have a songs.java fragment that displays all the songs from SD card into the recyclerView. When I click any of the song the it starts playing. The problem is, I also have a sliding up panel layout https://github.com/umano/AndroidSlidingUpPanel implemented in MainActivity.java and it has two textViews that displays Song name and Artist name when a song from recyclerView is clicked and a button(marked in red). The problem is I can't figure out how to implement onClickListener on the button in MainActivity so that It plays and pauses the songs that are displayed in recyclerView. I hope my question is clear. Thanks in advance! Please don't downnvote my question if it is silly as I'm very to new android studio.

Example screenshot:

enter image description here

Songs.java

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.songs_activity, container, false);

    Activity activity = getActivity();


    recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
    recyclerView.setLayoutManager(linearLayoutManager);


    songAdapter = new SongAdapter(getContext(), SongList, new SongAdapter.RecyclerItemClickListener() {
        @Override
        public void onClickListener(SongInfoModel song, int position) {

            Toast.makeText(getContext(), song.getSongName(), Toast.LENGTH_SHORT).show();

            Activity activity = getActivity();
            if (activity instanceof MainActivity) {

                mainActivity = (MainActivity) activity;
                mainActivity.setsongText(song);

            }
            prepareSong(song);



        }

        @Override
        public void onLongClickListener(SongInfoModel song, int position) {
            Toast.makeText(getContext(), "You long clicked me, thank you!", Toast.LENGTH_SHORT).show();
        }


    });

    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    String selection = MediaStore.Audio.Media.IS_MUSIC + "!=0";
    Cursor cursor = getActivity().getContentResolver().query(uri, null, selection, null, null);
    if (cursor != null) {
        if (cursor.moveToFirst()) {
            do {
                String name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));
                String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
                Long duration = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
                String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
                // String AlbumArt = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));

                SongInfoModel s = new SongInfoModel(name, artist, null, null, null, duration, data);
                SongList.add(s);

            } while (cursor.moveToNext());
        }


        cursor.close();

        Collections.sort(SongList, new Comparator<SongInfoModel>() {
            @Override
            public int compare(SongInfoModel lhs, SongInfoModel rhs) {
                return lhs.getSongName().compareTo(rhs.getSongName());
            }
        });



    }


    alphaAdapter = new ScaleInAnimationAdapter(songAdapter);
    alphaAdapter.setDuration(1000);
    alphaAdapter.setInterpolator(new OvershootInterpolator());
    alphaAdapter.setFirstOnly(false);
    recyclerView.setAdapter(alphaAdapter);
    alphaAdapter.notifyDataSetChanged();


    mediaPlayer = new MediaPlayer();
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);



    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {

            togglePlay(mp);
        }
    });

    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mediaPlayer) {




        }
    });


    return view;
}




private void prepareSong(SongInfoModel song) {


    mediaPlayer.reset();


    try {
        mediaPlayer.setDataSource(song.getData());
        mediaPlayer.prepareAsync();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private void togglePlay(MediaPlayer mp) {

    if (mp.isPlaying()) {
        mp.stop();

        mp.reset();
    } else {

        mp.start();


    }


}  

MainActivity.java :

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);



    buttonabc = findViewById(R.id.songButton);
    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayShowTitleEnabled(false);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        Window w = getWindow(); // in Activity's onCreate() for instance
        w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
    }
    sectionsPageAdapter = new SectionsPageAdapter(getSupportFragmentManager());

    viewPager = (ParallaxViewPager) findViewById(R.id.viewpager);
    setupViewPager(viewPager);
    viewPager.setOffscreenPageLimit(6);


    smartTabLayout = (SmartTabLayout) findViewById(R.id.viewpagertab);
    smartTabLayout.setViewPager(viewPager);


    backarrow = (ImageView) findViewById(R.id.imageView);

    backarrow.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            resideMenu.openMenu(ResideMenu.DIRECTION_LEFT);
        }
    });

    SongNameSlide = findViewById(R.id.SongNameSlide);
    ArtistNameSlide = findViewById(R.id.ArtistNameSlide);


    slidingUpPanelLayout = (SlidingUpPanelLayout)findViewById(R.id.sliding_layout);




    slidingUpPanelLayout.addPanelSlideListener(new SlidingUpPanelLayout.PanelSlideListener() {
        @Override
        public void onPanelSlide(View panel, float slideOffset) {

            Log.i(TAG, "onPanelSlide, offset " + slideOffset);

            SongNameSlide.setAlpha(1 - slideOffset);
            ArtistNameSlide.setAlpha(1 - slideOffset);
            buttonabc.setAlpha(1 - slideOffset);
            slidingUpPanelLayout.setDragView(panel);


        }


        @Override
        public void onPanelStateChanged(View panel, SlidingUpPanelLayout.PanelState previousState, SlidingUpPanelLayout.PanelState newState) {



        }
    });

    slidingUpPanelLayout.setFadeOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            slidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED);

        }
    });



    setUpMenu();



}

public void setsongText(SongInfoModel songInfoModel){

    SongNameSlide.setText(songInfoModel.getSongName());
    ArtistNameSlide.setText(songInfoModel.getArtistName());

}

SongAdapter.java:

public class SongAdapter extends RecyclerView.Adapter {

ArrayList<SongInfoModel> SongList = new ArrayList<>();
Context context;
private RecyclerItemClickListener listener;
public OnSongClickListener mListener;




public SongAdapter(Context context, ArrayList<SongInfoModel> SongList, RecyclerItemClickListener listener) {

    this.context = context;
    this.SongList = SongList;
    this.listener = listener;

}




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

@Override
public void onBindViewHolder(final SongAdapter.SongHolder holder, final int position) {



    final SongInfoModel songInfoModel = SongList.get(position);

    if(songInfoModel!= null){

    holder.songName.setText(songInfoModel.SongName);
    holder.artistName.setText(songInfoModel.ArtistName);
    holder.duration.setText(String.valueOf(songInfoModel.duration));
    String duration = Utility.convertDuration(songInfoModel.getDuration());
    holder.duration.setText(duration);

        holder.bind(songInfoModel, listener);
    }

}

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

public class SongHolder extends RecyclerView.ViewHolder  {
    TextView songName;
    TextView artistName;
    TextView duration;


    public SongHolder(View itemView)    {

        super(itemView);
        songName = (TextView)itemView.findViewById(R.id.SongName);
        artistName= (TextView)itemView.findViewById(R.id.ArtistName);
        duration = (TextView) itemView.findViewById(R.id.duration);

    }

    public void bind(final SongInfoModel songInfoModel, final RecyclerItemClickListener listener) {
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.onClickListener(songInfoModel, getLayoutPosition());

            }
        });

        itemView.setOnLongClickListener(new View.OnLongClickListener() {

            @Override
            public boolean onLongClick(View view) {

                listener.onLongClickListener(songInfoModel, getLayoutPosition());
                return true;
            }
        });

    }



}

public void setOnSongClickListener(OnSongClickListener listener) {
     mListener = listener;
}


public interface RecyclerItemClickListener{

   void onClickListener(SongInfoModel song, int position);
    void onLongClickListener(SongInfoModel song, int position);

}

public interface OnSongClickListener {
    void onsongClicked(boolean songPlayed);
}

if(mListener!=null){
    mListener.onsongClicked(false);
}



}

button click:

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


           if (mListener!=null)
           {
               mListener.onsongClicked(true);
               mListener=null;
           }

           else { mListener.onsongClicked(false);}


        }
    });
Sebin Paul
  • 169
  • 1
  • 15

2 Answers2

0

You have to create a listener interface in the MainActivity.class from where you want to send data to Songs.java.

public interface OnSongCickListener {
    void onsongClicked();
}

Add a method in the same MainActivity.class to register the listener with the object where you want to send data.Keep OnSongCickListener as private member variable;

private OnSongCickListener mListener;

public void setOnSongClickListener(OnSongCickListener listener) {
    mListener = listener;
}

When you have to send data through the listener on some action or some button click send data from your class to the activity or any registered class like this

if(mListener!=null){
  mListener.onsongClicked();
}

Then in your Songs.java class create an object of the listener class and call the method like this.

MainActivity activity=(MainActivity)getActivity;

activity.setOnSongClickListener(new RecyclerAdapter.OnSongCickListener(){
   @Override
    public void onsongClicked() {
        if(mediaPlayer.isPlaying()){
            mPlayer.pause();
        } else {
            mPlayer.start();
        }
    }
});
Sharath kumar
  • 4,064
  • 1
  • 14
  • 20
0

try this. Create one method in fragment like

onButtonClickInActivity()

and then in your activity like this

buttonActivity.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Fragment page = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":" + pager.getCurrentItem());
            if (page != null) {
                ((MyFragment)page).onButtonClickInActivity("Your Data to pass");
            }
        }
    });
Bhavesh Rangani
  • 1,490
  • 12
  • 23