aida_dead12
aida_dead12

Reputation: 25

How to put Recyclerview's OnClickListener in Activity

The RecyclerViewAdapter is in the fragment.I was able to call the OnItemClickListener in Fragment but the problem is that I need it in Ativity

I tried to call interface again but no result (null)

  public class SongsFragment extends Fragment implements ARecyclerViewAdapter.OnItemClickListener
{
    OnHeadlineSelectedListener callback;

    @Override
    public void onItemClick(int position)
    {
        // TODO: Implement this method
        String TAG = "AAA";
        Log.e(TAG, "lol" + position);
    }

    View v;
    private RecyclerView myrecyclerView;
    private List<AudioModel> listSong;

    DatabaseHelper myDB;

    public SongsFragment() {

    }

    public void setOnHeadlineSelectedListener(OnHeadlineSelectedListener callback) {
        this.callback = callback;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        // TODO: Implement this method
        v = inflater.inflate(R.layout.songs_fragment, container, false);

        myrecyclerView = (RecyclerView) v.findViewById(R.id.audio_recyclerview);
        ARecyclerViewAdapter adapter = new ARecyclerViewAdapter(getContext(),listSong);
        adapter.setOnItemClickListener(this);
        myrecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        myrecyclerView.setAdapter(adapter);
        return v;
    }

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        // TODO: Implement this method
        super.onCreate(savedInstanceState);

        DatabaseHelper myDB = new DatabaseHelper(getActivity());
        listSong = new ArrayList<>();
        listSong.addAll(myDB.getAllSongs());

    }

    public interface OnHeadlineSelectedListener {
        public void onArticleSelected(int position);
    }
}

Upvotes: 0

Views: 73

Answers (2)

Linh
Linh

Reputation: 60923

Quick and simple way (to very good to reuse) is define 1 more function in your Activity and call it from your Fragment.
Example

class YourFragment {

       ...

       @Override 
       public void onItemClick(){
          ((YourActivity) getActivity()).onItemClickInYourFragment()
       }
}


class YouActivity {

      void onItemClickInYourFragment(){
          // do something
      }
}

It is not good very good when reuse because when you want to reuse the fragment in many activity, you need some check like

if(getActivity() is YourActivity){
   // do something
} else if(getActivity() is OtherActivity){
  // do something
}

Therefore, if you want reuse solution, better to use interface like @Tenten Ponce solution

Upvotes: 1

Tenten Ponce
Tenten Ponce

Reputation: 2506

Create interface between activity and fragment. Creating interface makes your fragment reusable and easy to put it in another activities.

Add the listener on the fragment from activity to listen to any clicks from the recyclerview. Example below:

class SongsFragment {

  interface RecyclerViewClickListener {
    void onClick(int position); // you can pass any parameters here you need from recyclerview to activity
  }

  private RecyclerViewClickListener mListener;

  // set the listener here from activity
  public void setListener(RecyclerViewClickListener listener) {
    mListener = listener;
  }

  @Override
  public void onItemClick(int position) {
    // TODO: Implement this method
    String TAG = "AAA";
    Log.e(TAG, "lol" + position);
    mListener.onClick(position);
  }
}

Activity:

class YourActivity extends AppCompatActivity {
  // some codes
  private void setupFragment() {
    SongsFragment fragment = new SongsFragment();
    fragment.setListener(new RecyclerViewClickListener() {
      @Override
      void onClick(int position) {
        // do something on the object clicked from rv
      }
    });
  }
}

Upvotes: 3

Related Questions