fazil tm
fazil tm

Reputation: 299

android value passing adapter to fragment

I am developing an app for displaying images and text. When clicking on the item it goes to another fragment. The listing showing is correct but when I click on the item it does not go to fragment. I am using recycler adapter to listing the items. The code is shown below.

public class MyRecyclerAdapter extends RecyclerView.Adapter < MyRecyclerAdapter.MyViewHolder > {

 String categoryId;

 private List < NewsFeeds > feedsList;
 private Context context;
 private LayoutInflater inflater;

 public MyRecyclerAdapter(Context context, List < NewsFeeds > feedsList) {

  this.context = context;
  this.feedsList = feedsList;
  inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 }

 @Override
 public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

  View rootView = inflater.inflate(R.layout.singleitem_recyclerview_categories, parent, false);
  return new MyViewHolder(rootView);
 }

 @Override
 public void onBindViewHolder(MyViewHolder holder, int position) {
  NewsFeeds feeds = feedsList.get(position);
  //Pass the values of feeds object to Views
  holder.title.setText(feeds.getName());
  //holder.categoryId.setText(feeds.getCategory_id());
  categoryId = feeds.getCategory_id();
  Log.d("LOGTAG", "id : " + categoryId);
  holder.imageview.setImageUrl(feeds.getImgURL(), NetworkController.getInstance(context).getImageLoader());

  Log.d("LOGTAG", "feeds.getFeedName():" + feeds.getName());
 }

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

 public class MyViewHolder extends RecyclerView.ViewHolder {

  private TextView title;
  private NetworkImageView imageview;
  private CardView cardView;


  public MyViewHolder(View itemView) {
   super(itemView);
   title = (TextView) itemView.findViewById(R.id.title_view);
   //categoryId = (TextView) itemView.findViewById(R.id.content_view);
   // Volley's NetworkImageView which will load Image from URL
   imageview = (NetworkImageView) itemView.findViewById(R.id.thumbnail);
   cardView = (CardView) itemView.findViewById(R.id.card_view);

   cardView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
     //Toast.makeText(context, "Clicked", Toast.LENGTH_SHORT).show();



     // I want to send values to SubCategoryFragment and start SubCategoryFragment
     Bundle args = new Bundle();
     args.putString("category_id", categoryId);
     //set Fragmentclass Arguments
     SubCategoryFragment fragobj = new SubCategoryFragment();
     fragobj.setArguments(args);

     Log.d("LOGTAG", categoryId);
     Log.d("LOGTAG", "clicked");



     //newInstance(categoryId);



    }
   });




  }


 }


}

I want to send value to SubCategoryFragment and start SubCategoryFragment.

my SubCategoryFragment code

public class SubCategoryFragment extends Fragment {

 public SubCategoryFragment() {
  // Required empty public constructor
 }

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);


 }

 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
  Bundle savedInstanceState) {
  View rootView = inflater.inflate(R.layout.fragment_sub_category, container, false);
  //Bundle bundle = this.getArguments();


  Bundle args = getArguments();
  //String categoryId = args.getString("index");

  String categoryId = getArguments().getString("category_id");
  //String categoryId = getArguments().getString("category_id");
  TextView textView = (TextView) rootView.findViewById(R.id.label);
  textView.setText(categoryId);



  // Inflate the layout for this fragment
  return rootView;
 }

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

 @Override
 public void onDetach() {
  super.onDetach();
 }
}

Please help me

Upvotes: 1

Views: 16877

Answers (4)

Adarsh Chaudhary
Adarsh Chaudhary

Reputation: 67

Replace your onclick listener with this.

cardView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
     //Toast.makeText(context, "Clicked", Toast.LENGTH_SHORT).show();



     // I want to send values to SubCategoryFragment and start SubCategoryFragment
     Bundle args = new Bundle();
     args.putString("category_id", categoryId);
     //set Fragmentclass Arguments
     SubCategoryFragment fragobj = new SubCategoryFragment();
     fragobj.setArguments(args);

     Log.d("LOGTAG", categoryId);
     Log.d("LOGTAG", "clicked");
     //put this in your code
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
            FragmentTransaction fragmentTransaction =         fragmentManager.beginTransaction();
            fragmentTransaction.replace(R.id.SubCategoryFragment, fragobj);
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();


     //newInstance(categoryId);



    }
   });    

Upvotes: 0

Mavya Soni
Mavya Soni

Reputation: 972

You have made one mistake in your onClick method.

When you want to go one fragment to other fragment, you have to transaction the fragment using FragmentTransaction.class Check out below code.

Edit :

 SecondFragment fragment = new SecondFragment();  
     FragmentManager fragmentManager = currentfragment.getFragmentManager();
       FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.add(R.id.content_frame, fragment);
        fragmentTransaction.hide(currentfragment)    fragmentTransaction.addToBackStack(currentfragment.getclass().getsimplename());
            fragmentTransaction.commit();

Edit :

Just put below code in your RecyclerViewAdapter method onBindViewHolder.

holder.cardView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //Toast.makeText(context, "Clicked", Toast.LENGTH_SHORT).show();
            // I want to send values to SubCategoryFragment and start SubCategoryFragment
            Bundle args = new Bundle();
            args.putString("category_id", categoryId);
            //set Fragmentclass Arguments
            SubCategoryFragment fragobj = new SubCategoryFragment();
            fragobj.setArguments(args);
            FragmentManager fragmentManager = currentfragment.getFragmentManager(); 
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.add(R.id.content_frame, fragobj);
            fragmentTransaction.hide(currentfragment);
      fragmentTransaction.addToBackStack(currentfragment.getclass().getsimplename());
            fragmentTransaction.commit();


            //newInstance(categoryId);



        }
    });

EDIT :

public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyViewHolder> {

    String categoryId;

    private List<NewsFeeds> feedsList;
    private Context context;
    private LayoutInflater inflater;
    private Fragment currentFragment;

    public MyRecyclerAdapter(Context context, List<NewsFeeds> feedsList, final Fragment currentFragment) {

        this.context = context;
        this.feedsList = feedsList;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.currentFragment = currentFragment;
    }

    @Override
    public MyRecyclerAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View rootView = inflater.inflate(R.layout.singleitem_recyclerview_categories, parent, false);
        return new MyViewHolder(rootView);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        NewsFeeds feeds = feedsList.get(position);
        //Pass the values of feeds object to Views
        holder.title.setText(feeds.getName());
        //holder.categoryId.setText(feeds.getCategory_id());


        holder.title.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Toast.makeText(context, "Clicked", Toast.LENGTH_SHORT).show();
                // I want to send values to SubCategoryFragment and start SubCategoryFragment
                Bundle args = new Bundle();
                args.putString("category_id", categoryId);
                //set Fragmentclass Arguments
                SubCategoryFragment fragobj = new SubCategoryFragment();
                fragobj.setArguments(args);
                FragmentManager fragmentManager = currentfragment.getFragmentManager();
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.add(R.id.content_frame, fragobj);
                fragmentTransaction.hide(currentfragment);
                fragmentTransaction.addToBackStack(currentfragment.getclass().getsimplename());
                fragmentTransaction.commit();


                //newInstance(categoryId);


            }
        });

    }

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

    public class MyViewHolder extends RecyclerView.ViewHolder {
        private TextView title;

        public MyViewHolder(View itemView) {
            super(itemView);
            title = (TextView) itemView.findViewById(R.id.title_view);
        }


    }


}

Upvotes: 0

Maveňツ
Maveňツ

Reputation: 1

From Adapter you send data with intent as:

Fragment fragment = new tasks();
FragmentManager fragmentManager = context.getSupportFragmentManager(); // this is basically context of the class
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Bundle bundle=new Bundle();
bundle.putString("name", "From Adapter"); //key and value
//set Fragmentclass Arguments
fragment.setArguments(bundle);
fragmentTransaction.replace(R.id.content_frame, fragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

and in Fragment onCreateView method:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
    String strtext=getArguments().getString("name"); //fetching value by key 
    return inflater.inflate(R.layout.fragment, container, false);
}

Upvotes: 5

Abhi
Abhi

Reputation: 2295

In your onClickListener();

Fragment fragment = new tasks();
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.content_frame, fragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

Change R.id.content_frame with your fragment

Upvotes: 1

Related Questions