1

I have a recyclerview (with an adapter) in my mainactivity which displays different categories, I want to click on each of these categories and navigate to a fragment from there. How do I do this? What is the best approach?

Here is the mainActivity

public class MainActivity extends AppCompatActivity {

private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.word_info_layout);
    Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
    setSupportActionBar(myToolbar);
    getSupportActionBar().setTitle("");
    myToolbar.setTitle(Html.fromHtml("<font color='#272d85'> </font>"));

    mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    mLayoutManager = new LinearLayoutManager(this);
    mRecyclerView.setLayoutManager(mLayoutManager);
    mAdapter = new MyAdapter();
    mRecyclerView.setAdapter(mAdapter);



}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate(R.menu.menu, menu);
    MenuItem searchItem = menu.findItem(R.id.action_search);
    final SearchView searchView = (SearchView) 
    MenuItemCompat.getActionView(searchItem);
    searchItem.expandActionView();
    searchView.requestFocus();
    searchView.setQueryHint("Sök efter ord");
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

        @Override
        public boolean onQueryTextSubmit(String query) {
            searchView.clearFocus();
            return true;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            return false;
        }
    });
    return super.onCreateOptionsMenu(menu);


}

}

My adapter

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{
private Context context;
private int[] cardimages = {
        R.drawable.stockholm,
        R.drawable.invandrar,
        R.drawable.goteborg,
        R.drawable.norrland,
        R.drawable.svengelska,
        R.drawable.skanska,
        R.drawable.ovrigt

};
private String[] titles = {
        "Stockholmsslang",
        "Invandrarslang",
        "Skane",
        "Norrland",
        "Svengelska",
        "Skåne",
        "Övrigt",

};


public class ViewHolder extends RecyclerView.ViewHolder {
    ImageView itemImage;

    public ViewHolder(View itemView) {
        super(itemView);
        itemImage = (ImageView) itemView.findViewById(R.id.item_image);
        itemImage.setScaleType(ImageView.ScaleType.CENTER_CROP);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               final int position = getAdapterPosition();

               //ONclick for the recyclerview
            }

        });
    }
}

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

@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
    Context context = viewHolder.itemView.getContext();
    Picasso.with(context).load(cardimages[i]).fit().centerInside().into(((MyAdapter.ViewHolder) viewHolder).itemImage);
}

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


}
Albin Engberg
  • 11
  • 1
  • 5
  • 1
    This will help you https://stackoverflow.com/questions/24471109/recyclerview-onclick – Ezio Jun 28 '17 at 10:04
  • Initailize you adapter like this MyAdapter myAdapter=new MyAdapter(this); and create a contructor in your adapter public MyAdapter(Context context){this.context=context}; – Neha Tyagi Jun 28 '17 at 10:42

3 Answers3

0

Declare this method in your Fragment where you are initializing the adapter. If you are using activity then remove getActivity() while initializing FragmentManager.You also need to have a framelayout in your current activity at the position you want to place your fragment.

public void replaceFragment()
    {
           YourFragment yourFragment=new YourFragment();
           FragmentManager fragmentManager=getActivity().getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

            fragmentTransaction.replace(R.id.frameLayout, yourFragment,null);
            fragmentTransaction.addToBackStack(tag);

            fragmentTransaction.commitAllowingStateLoss();
    }

Now call this method from the adapter

               @Override
                public void onClick(View view) {
                   final int position = getAdapterPosition();

                (Activity)context.replaceFragment();
                }

            });

//Initilaize ypu adapter in activity like this:

//Declare varaible is adapter

MyAdapter myAdapter=new MyAdapter(this);

In your adapter create a constructor

 public MyAdapter(Context context)
{
  this.context=context;
}
Neha Tyagi
  • 3,821
  • 3
  • 15
  • 25
0

You can't initiate a fragment like activity.You need a parent view to initiate the fragment.In your case,I suppose you want to show it in a new screen.

Create a new activity with a framelayout in layout,send the fragment name to the activity and use this code.If you have multiple fragments, you can use one activity for all fragments by using extras.

Intent i = new Intent(context,FragmentParentActivity.class);
i.putExtra("fragment",1);
startActivity(i);

you can use the extra parameter to decide which fragment to initiate,(onCreate)

String fragmentTag="Fragment1";
int fragmentID = getIntent().getIntExtra("fragment",0);
if(fragmentID == 1){
  fragment = new YourFragment();
}
...
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_frame, fragment, fragmentTag).commit();
Shreeya Chhatrala
  • 1,441
  • 18
  • 33
cancit
  • 172
  • 5
  • Ok, so if I'm using the recyclerview, I would navigate to a new activity which holds a fragments yeah? and then the id to identify which fragment to show? – Albin Engberg Jun 28 '17 at 10:41
  • @cancit: you can always call a fragment from adapter theres no issue. – Neha Tyagi Jun 28 '17 at 10:49
  • @NehaTyagi yes you can call, but you need a parent activity for initiating the fragment. In your case,you use the MainActivity. Since there is no clue for usage of fragments in the MainActivity, I suggested a new activity for showing the fragments. – cancit Jun 28 '17 at 11:04
  • @cancit: yes that depends where he wants to initialize his fragment. it may be any activity – Neha Tyagi Jun 28 '17 at 11:12
0

You can easily navigate to any fragment from a fragment or a RecyclerAdapter using:

AppCompatActivity activity = (AppCompatActivity) view.getContext();
// view is from onClick listener in my case

YourFrag frag = new YourFrag();

activity.getSypportFragmentManager().beginTransaction(R.id.yourFragmentHolder,frag).addToBackStack(null).commit();
bad_coder
  • 11,289
  • 20
  • 44
  • 72
Sandip
  • 156
  • 1
  • 11