Mahdi H
Mahdi H

Reputation: 339

Replacing fragments inside ViewPager on RecyclerView click

I have an activity called navigation and two fragments called OneFragment, Description Fragment.

The navigation activity contains these two fragments as code show below:

navigation.java

public class navigation extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {
private TabLayout tabLayout;
private ViewPager viewPager;
private int[] tabIcons = {
        R.drawable.ic_newsfeed,
        R.drawable.ic_livestream,
        R.drawable.ic_matches,
        R.drawable.ic_sort
};
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_navigation);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);



    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
    viewPager = (ViewPager) findViewById(R.id.viewpager);
    setupViewPager(viewPager);

    tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);
    setupTabIcons();
}

private void setupTabIcons() {
    tabLayout.getTabAt(0).setIcon(tabIcons[0]);
    tabLayout.getTabAt(1).setIcon(tabIcons[1]);
    tabLayout.getTabAt(2).setIcon(tabIcons[2]);
    tabLayout.getTabAt(3).setIcon(tabIcons[3]);

}

private void setupViewPager(ViewPager viewPager) {
   ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFrag(new OneFragment(),getString(R.string.newsfeed));
    adapter.addFrag(new TwoFragment(), getString(R.string.livestream));
    adapter.addFrag(new ThreeFragment(),getString(R.string.matches));
    adapter.addFrag(new FourFragment(),getString(R.string.schedule));
    viewPager.setAdapter(adapter);
}
class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFrag(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}



@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}



@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();

    if (id == R.id.share) {
        // Handle the camera action
    } else if (id == R.id.check) {

    } else if (id == R.id.rateus) {

    } else if (id == R.id.aboutus) {

    }

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

This is my Adapter class:

public class PostAdapter2 extends RecyclerView.Adapter<PostAdapter2.ViewHolder>{

public Context mContext;
public ArrayList<News_data> original_items = new ArrayList<>();
public ArrayList<News_data> filtered_items = new ArrayList<>();
//   ItemFilter mFilters = new ItemFilter();

public PostAdapter2(Context mContext, ArrayList<News_data> postList) {
    this.mContext = mContext;
    this.original_items = postList;
    this.filtered_items = postList;

}

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

    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_news, parent, false);


    return new ViewHolder(view);

}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {

    try {

        final News_data post = filtered_items.get(position);

        holder.txt_news_title.setText(post.getName_news());
        holder.setItemClickListener(new ItemClickListener() {
            @Override
            public void onItemClick() {

              //what to do to replace the OneFragment with the DescriptionFragment 

            }
        });

    } catch (Exception e) {
        e.printStackTrace();
    }
}



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





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

    Context c;
    ItemClickListener itemClickListener;
    TextView txt_news_title,txt_desc;
    ImageView image_news;

    public ViewHolder(View itemView) {
        super(itemView);
        txt_news_title = (TextView) itemView.findViewById(R.id.txt_news_title);
        itemView.setOnClickListener(this);









    }


    @Override
    public void onClick(View v) {
        this.itemClickListener.onItemClick();

    }
    public void setItemClickListener(ItemClickListener itemClickListener)
    {
        this.itemClickListener=itemClickListener;
    }
}

What I want to do is to replace the OneFragment with The DescriptionFragment on Recyclerview item click.

Upvotes: 1

Views: 1363

Answers (1)

Keivan Esbati
Keivan Esbati

Reputation: 3454

Sadly you cannot replace Fragments inside ViewPager, but you can use NestedFragment to add a ChildFragment to your main Fragment like you do with Activity. Just define a FrameLayout inside you OneFragment Layout and call getChildFragmentManager instead of getSupportFragmentManager. For example:

Fragment descriptionFragment = new DescriptionFragment ();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.nested_fragment_container, descriptionFragment ).commit();

For more info you can visit here:

https://developer.android.com/about/versions/android-4.2.html#NestedFragments

P.S: If you have more fragment than these two or you want your fragments to be stand alone you can use this library to get instagram like tabs:

https://github.com/ncapdevi/FragNav

Upvotes: 1

Related Questions