3

I've a RecyclerView and CardView inside it. Now what i want to do is load a simple Fragment on clicking the CardView. I'm not able to do that with FragmentManager or SupportFragmentManager. Please give me some directions.

My RecyclerViewAdapder and ViewHolder are ..

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
    private String[] eventName;
    private String[] eventBrief;

    public static class ViewHolder extends RecyclerView.ViewHolder {

        public TextView textViewName, textViewBrief;
        public CardView cardView;

        public ViewHolder(View v) {
            super(v);

            textViewName = (TextView)v.findViewById(R.id.textViewName);
            textViewBrief = (TextView)v.findViewById(R.id.textViewBrief);
            final Context context = v.getContext();
            cardView = (CardView)v.findViewById(R.id.card_view);

            cardView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    EventFragment eventFragment = EventFragment.newInstance();
                    // Load and view eventFragment here??
                }
            });
        }
    }

    public RecyclerViewAdapter(String[] eventName, String[] eventBrief) {
        this.eventName = eventName;
        this.eventBrief = eventBrief;

    }

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

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.textViewName.setText(eventName[position]);
        holder.textViewBrief.setText(eventBrief[position]);
    }

    @Override
    public int getItemCount() {
        return eventName.length;
    }
}
priyank
  • 2,651
  • 4
  • 24
  • 36

3 Answers3

7

A simple implementation is to add a onClickListener() to the ViewHolder 's itemView in the constructor of the Adapter.

    public MyViewHolder(View view) {
        super(view);

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

                AppCompatActivity activity = (AppCompatActivity) view.getContext();
                Fragment myFragment = new MyFragment();
                activity.getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, myFragment).addToBackStack(null).commit();


            }
        });
    }
viper
  • 1,836
  • 4
  • 25
  • 41
  • @martiendt @viper what is `Fragment myFragment = new MyFragment();` ? – sabbibJAVA Feb 28 '17 at 03:13
  • `MyFragment` is the fragment class of the fragment that you want to load @sabbibJAVA – viper Feb 28 '17 at 03:45
  • @sabbibJAVA you can see my implementation here https://github.com/martiendt/daily-dhamma i used this on https://github.com/martiendt/daily-dhamma/blob/master/app/src/main/java/red/point/dailydhamma/ListFragment.java – martiendt Mar 01 '17 at 15:17
5

I'm not able to do that with FragmentManager or SupportFragmentManager

That's because RecyclerViewAdapter doesn't hold a reference to the FragmentManager. You should communicate to the Activity/Fragment hosting the RecyclerView, that the event occurred and from there you start the fragment. To do so check my answer here

Community
  • 1
  • 1
Blackbelt
  • 156,034
  • 29
  • 297
  • 305
4

There are many ways to go at this, really. I feel that the best implementation is a callback to the activity notifying that an item has been clicked. I'll give you a hand with some code, see below:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
private String[] eventName;
private String[] eventBrief;
private OnItemClickListener listener;

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    public TextView textViewName, textViewBrief;
    public CardView cardView;
    private OnItemClickListener listener;

    public ViewHolder(View v, OnItemClickListener listener) {
        super(v);

        textViewName = (TextView)v.findViewById(R.id.textViewName);
        textViewBrief = (TextView)v.findViewById(R.id.textViewBrief);
        final Context context = v.getContext();
        cardView = (CardView)v.findViewById(R.id.card_view);

        cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(listener!=null)
                   listener.onItemClick(textViewName.getText().toString(),
         textViewBrief.getText().toString();
            }
        });
    }
}

public RecyclerViewAdapter(String[] eventName, String[] eventBrief) {
    this.eventName = eventName;
    this.eventBrief = eventBrief;
}

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

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    holder.textViewName.setText(eventName[position]);
    holder.textViewBrief.setText(eventBrief[position]);
    holder.setOnItemClickListener(listener);
}

@Override
public int getItemCount() {
    return eventName.length;
}

public void setOnItemClickListener(OnItemClickListener listener){
    this.listener = listener
}

public interface OnItemClickListener {
       public void onItemClick(String textName, String textViewBrief); 
    } 
}   

Then in your activity just instantiate it like this:

RecyclerViewAdapter adapter = new RecyclerViewAdapter(eventName, eventBrief);
adapter.setOnItemClickListener(new RecyclerViewAdapter.OnItemClickListener(){
        public void onItemClick(String textName, String textViewBrief){
            EventFragment eventFragment = EventFragment.newInstance();
            //replace content frame with your own view.
            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();    ft.replace(R.id.content_frame, eventFragment).commit()
       }
});
Learn2Code
  • 1,974
  • 5
  • 24
  • 46