Sakshyam Limbu
Sakshyam Limbu

Reputation: 11

how to pass values from recycler view item of one fragment to another fragment

I have a hard time understanding how to pass value from one fragment to another fragment. I've created a toggle button in recycler item which when checked should pass the content of the card to another fragment(Favourites) implementing recyclerVIew.

this is my recyclerView adapter

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
    private ClipboardManager myClipboard;
    private ClipData myClip;
    private Context context;




    public List<CardItemModel> cardItems;

    public RecyclerAdapter(List<CardItemModel> cardItems){
        this.cardItems = cardItems;
    }

    public static class ViewHolder extends RecyclerView.ViewHolder{
        ImageView copyButton;
        ImageView shareButton;
        ToggleButton favButton;


        TextView title;
        TextView content;
        public ViewHolder(View itemView) {
            super(itemView);
            this.title = (TextView)itemView.findViewById(R.id.card_title);
            this.content = (TextView)itemView.findViewById(R.id.card_content);
            this.copyButton= (ImageView) itemView.findViewById(R.id.copyButton);
            this.shareButton=(ImageView) itemView.findViewById(R.id.shareButton);

            this.favButton=(ToggleButton) itemView.findViewById(R.id.favButton);

            favButton.setChecked(false);
            favButton.setBackgroundDrawable(ContextCompat.getDrawable(favButton.getContext(), R.mipmap.ic_launcher));


        }
    }



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

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        holder.title.setText(cardItems.get(position).title);
        holder.content.setText(cardItems.get(position).content);
        holder.copyButton.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){


                myClipboard = (ClipboardManager) v.getContext().getSystemService(Context.CLIPBOARD_SERVICE);


                myClip = ClipData.newPlainText("label", holder.content.getText().toString());
                myClipboard.setPrimaryClip(myClip);
                Toast.makeText(v.getContext(), "Copied to clipboard" , Toast.LENGTH_SHORT ).show();

            }
        });
        holder.shareButton.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){
                Intent share = new Intent(Intent.ACTION_SEND);
                share.setType("text/plain");
                share.putExtra(Intent.EXTRA_TEXT, holder.content.getText().toString());
                v.getContext().startActivity(Intent.createChooser(share, "Share Text"));
            }
        });

        holder.favButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
            @Override
            public void onCheckedChanged(CompoundButton favButton, boolean isChecked){
                if (isChecked)
                    favButton.setBackgroundDrawable(ContextCompat.getDrawable(favButton.getContext(),R.mipmap.ic_launcher));

                else
                    favButton.setBackgroundDrawable(ContextCompat.getDrawable(favButton.getContext(), R.mipmap.ic_cart));
            }
        });
    }

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

and this is my 'Favourite' fragment where I want to passs the value.

public class FavouriteFragment extends Fragment {

    private List<CardItemModel> cardItems = new ArrayList<>(20);
    private MainActivity mainActivity;
    private Toolbar toolbar;
    private RecyclerView recyclerView;
    private RecyclerAdapter recyclerAdapter;

    public FavouriteFragment() {

    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        mainActivity = (MainActivity)activity;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_favourite, container, false);

        toolbar = (Toolbar)view.findViewById(R.id.fab_toolbar);

        setupToolbar();



        recyclerView = (RecyclerView)view.findViewById(R.id.fab_recycler_view);

        setupRecyclerView();

        return view;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        mainActivity.setupNavigationDrawer(toolbar);
    }

    private void setupToolbar(){
        toolbar.setTitle(getString(R.string.fav_fragment_title));
        mainActivity.setSupportActionBar(toolbar);
    }

    private void setupRecyclerView(){
        recyclerView.setLayoutManager(new LinearLayoutManager(mainActivity));
        recyclerView.setHasFixedSize(true);
        initializeCardItemList();
        recyclerAdapter = new RecyclerAdapter(cardItems);
        recyclerView.setAdapter(recyclerAdapter);
    }

    private void initializeCardItemList(){
        CardItemModel cardItemModel;
        String[] cardTitles = getResources().getStringArray(R.array.fav_cards);
        String[] cardContents = getResources().getStringArray(R.array.fav_cards_content);
        final int length = cardTitles.length;
        for(int i=0;i<length;i++){
            cardItemModel = new CardItemModel(cardTitles[i],cardContents[i]);
            cardItems.add(cardItemModel);
        }
    }



}

Upvotes: 1

Views: 2073

Answers (3)

Bipin Paudel
Bipin Paudel

Reputation: 85

You can use interface for that. Let us see an example where you want to pass value from FragmentA to FragmentB

    class FragmentA extends Fragment{
     //Your fragment a functionalities goes here
    //now define an interface inside this FragmentA

   //you get reference from main activity
    MainActivity activity;
    @Override
    void onCreate(){
    activity = getActivity();
    }
//after your functionalities you can call passValue function of main activity from the variable 'activity' like
    activity.passValue(your integer value from fragmentA to main activity)

    interface OnValuePassedListener{
      void passValue(int value)//if you want to pass integer value 
      }
    }


    //this is the activity where FragmentA is located

    public class MainActivity extends Activity implements FragmentA.OnValuePassedListener{
//Inside this activity, you write code to open the fragment. When you do that pass this activity's reference to the FragmentA


    @Override
    void passValue(int value){
    //you get the value from FragmentA inside this function
        }

    }

You know how to pass value from activity to fragment. From passValue() function inside activity, you can call another fragment and pass the value to the fragment.

In this way, you can pass value from FragmentA to another fragment using Activity as middleman. You can learn more about this from here https://www.youtube.com/watch?v=VyyGP_d0Ia8&index=118&list=PLonJJ3BVjZW6hYgvtkaWvwAVvOFB7fkLa

Upvotes: 1

jagapathi
jagapathi

Reputation: 1645

Add your values in the Bundle

    Fragment fragment = new Table_Selection_QRCODE();
                            Bundle bun = new Bundle();
                            bun.putString("table","20");
                            fragment.setArguments(bun);
getFragmentManager().beginTransaction().replace(R.id.frag, fragment).commit();

In other fragment Receive the Values Like this(OnCreate)

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bundle b=getArguments();
        if(b!=null){
            rslt=b.getString("table","");
        }
    }

Upvotes: 0

Priyanka Madgundi
Priyanka Madgundi

Reputation: 129

Communication between fragments can be done by EventBus. steps : 1. Create event class 2. Register event where you want to change data of fragment. 3. Post Event from fragment (onClick on toggle button).

https://github.com/greenrobot/EventBus

http://greenrobot.org/eventbus/

Step 1 :

import java.io.Serializable;

public class ToggleButtonClickEvent implements Serializable {
private CardItemModel cardItemModel;

public ToggleButtonClickEvent (CardItemModel ardItemModel){
    this.cardItemModel= cardItemModel;
}

public CardItemModel getCardItemModel() {
    return cardItemModel;
}

}

Step 2 : Register and unregister event in fragment where you want to change data

 @Override
 public void onStart() {
 super.onStart();
 EventBus.getDefault().register(this);

}

  @Override
  public void onStop() {
     super.onStop();
     EventBus.getDefault().unregister(this);
   }

Step 3 :

post event when toggle button clicked

    EventBus.getDefault().post(new ToggleButtonClickEvent(cardItemModel));

Upvotes: 0

Related Questions