2

I have a navigation drawer and one of the drawer items. Home is a View Pager with 3 tabs. Everything worked fine when I opened the View Pager tabs the first time, but when I navigated back to it after navigating to one of the Drawer fragments(say profile), it was empty (all three tabs)

 import android.content.Intent;
    import android.net.Uri;
    import android.os.Bundle;
    import android.preference.PreferenceActivity;
    import android.support.design.widget.NavigationView;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentTransaction;
    import android.support.v4.widget.DrawerLayout;
    import android.support.v7.app.ActionBarDrawerToggle;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.EditText;
    import android.widget.FrameLayout;
    import android.widget.TextView;

    import com.android.volley.toolbox.ImageLoader;
    import com.android.volley.toolbox.NetworkImageView;
    import com.example.amol.ecom.login.SessionManager;

    import de.hdodenhof.circleimageview.CircleImageView;

    public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

        DrawerLayout drawer;
        FrameLayout frameLayout;
        NavigationView navigationView;
        ActionBarDrawerToggle toogle;
        Fragment fragment;
        NetworkImageView networkImageView;
        public TextView nametextview, emailtextview;


        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);

            frameLayout = (FrameLayout) findViewById(R.id.frame_container);
            drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
            toogle = new ActionBarDrawerToggle(MainActivity.this, drawer, R.string.open_Drawer, R.string.close_Drawer);
            drawer.setDrawerListener(toogle);
            navigationView = (NavigationView) findViewById(R.id.nav_view);
            navigationView.setNavigationItemSelectedListener(this);
            navigationView.setItemIconTintList(null);
            View headerLayout = navigationView.inflateHeaderView(R.layout.header_layout);

            ImageLoader imageLoader=AppController.getInstance().getImageLoader();
            networkImageView = (NetworkImageView) headerLayout.findViewById(R.id.circleImageView);
            networkImageView.setImageUrl(SessionManager.personPicture,imageLoader);
            nametextview = (TextView) headerLayout.findViewById(R.id.name_textview);
            nametextview.setText(SessionManager.personName);
            emailtextview = (TextView) headerLayout.findViewById(R.id.email_textview);
            emailtextview.setText(SessionManager.personEmail);
            //networkImageView.setImageURI(SessionManager.personPhoto);

            getSupportActionBar().setDisplayShowHomeEnabled(true);
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);

             FragmentManager fragmentManager = getSupportFragmentManager();
             fragmentManager.beginTransaction().replace(R.id.frame_container, new HomeFragment()).commit();

        }

        @Override
        public void onPostCreate(Bundle savedInstanceState) {
            super.onPostCreate(savedInstanceState);
            toogle.syncState();
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.menu_main, menu);
            return true;
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {

            int id = item.getItemId();

            if (id == R.id.action_settings) {
                return true;
            }
            if (id == android.R.id.home) {
                if (drawer.isDrawerOpen(navigationView)) {
                    drawer.closeDrawer(navigationView);
                } else drawer.openDrawer(navigationView);
            }

            return super.onOptionsItemSelected(item);
        }

        @Override
        public boolean onNavigationItemSelected(MenuItem item) {
            int id = item.getItemId();
            item.setCheckable(true);

            if (id == R.id.home) {
                fragment = new HomeFragment();
                FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
                ft.replace(R.id.frame_container, fragment);
                ft.attach(fragment);
                getSupportActionBar().setTitle("Home");
                ft.commit();
            }
            if (id == R.id.profile) {
                fragment = new Profile();
                FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
                ft.replace(R.id.frame_container, fragment);
                getSupportActionBar().setTitle("Profile");
                ft.commit();
            }
            if (id == R.id.notify) {
                fragment = new Notification();
                FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
                ft.replace(R.id.frame_container, fragment);
                getSupportActionBar().setTitle("Notification");
                ft.commit();
            }
            if (id == R.id.feedback) {
                Intent i = new Intent(Intent.ACTION_SEND);
                i.setData(Uri.parse("mailto:"));
                String[] to = {"wangate.amol@gmail.com", "wangate.amol@yahoo.com"};
                i.putExtra(Intent.EXTRA_EMAIL, to);
                i.putExtra(Intent.EXTRA_TEXT, "");
                i.putExtra(Intent.EXTRA_SUBJECT, "");
                i.setType("message/rfc822");
                startActivity(i);

            }
            if (id == R.id.share) {
                Intent intent = new Intent(Intent.ACTION_SEND);
                intent.putExtra(Intent.EXTRA_TEXT, "http://");
                intent.setType("text/plain");
                Intent chooser = Intent.createChooser(intent, "Share Using");
                startActivity(chooser);
            }
            if (id == R.id.rateus) {
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setData(Uri.parse("market://"));
                Intent chooser = Intent.createChooser(intent, "Complete Action Using");
                startActivity(chooser);

            }
            if (id == R.id.aboutus) {
                // Intent intent=new Intent(MainActivity.this,About.class);
                // startActivity(intent);

            }
            drawer.closeDrawers();
            return true;
        }
    }

Tab layout code is given below

import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.ArrayList;
import java.util.List;


/**
 * A simple {@link Fragment} subclass.
 */
public class HomeFragment extends Fragment {

    TabLayout tabLayout;
    ViewPager viewPager;

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

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

        View view = inflater.inflate(R.layout.fragment_home, container, false);
        viewPager = (ViewPager) view.findViewById(R.id.view_pager);
        viewPager.setOffscreenPageLimit(3);
        setUpViewPager(viewPager);

        tabLayout = (TabLayout) view.findViewById(R.id.tab_layout);
        tabLayout.setupWithViewPager(viewPager);

        return view;
    }


    private void setUpViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getFragmentManager());
        adapter.addFragment(new One(), "One");
        adapter.addFragment(new Two(), "Two");
        adapter.addFragment(new Three(), "Three");
        viewPager.setAdapter(adapter);
    }

}

class ViewPagerAdapter extends FragmentPagerAdapter {

    final List<Fragment> mfragmentList = new ArrayList<>();
    final List<String> mfragmentTitle = new ArrayList<>();

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

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

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

    public void addFragment(Fragment fragment, String title) {
        mfragmentList.add(fragment);
        mfragmentTitle.add(title);
    }

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

here is one of the tab of tab layout(View pager)

import android.annotation.TargetApi;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;

import com.android.volley.NoConnectionError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.TimeoutError;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.example.amol.ecom.login.SessionManager;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;


public class One extends Fragment implements SearchView.OnQueryTextListener {

    private ArrayList<FoodItemList> foodItemLists = new ArrayList<>();
    public RecyclerView mRecyclerView;
    public RecyclerView.LayoutManager mLayoutManager;
    private ItemOneAdapter itemOneAdapter;
    //    public SwipeRefreshLayout swipeRefreshLayout;
    public LinearLayout linearLayout;

    // private static final String url_all_items = "http://10.0.2.2/xampp/ecom/Read_food_items.php";
    private static String url_all_items = "https://www.food2all.in/apps/food2all/Read_Food_Item.php";
    private static final String TAG_ITEMS = "Item_Details";
    private static final String TAG_IMG_URL = "image_url";
    private static final String TAG_ITEM_NAME = "food_name";
    private static final String TAG_ITEM_DESCRIPTION = "food_description";
    private static final String TAG_PRICE = "food_price";
    public JSONArray items;
    public Toolbar toolbar;
    public TextView TextViewPrice;


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


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

        View view = inflater.inflate(R.layout.fragment_one, container, false);
        toolbar = (Toolbar) view.findViewById(R.id.toolbar_proceed);
        TextViewPrice = (TextView) toolbar.findViewById(R.id.textView_Item_Price);
        toolbar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getActivity(), CheckOutActivity.class);
                startActivity(intent);
            }
        });
        linearLayout = (LinearLayout) view.findViewById(R.id.linearlayoutfragmentone);
        //      swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swiperefresh_recyclerviewholder);
        //    swipeRefreshLayout.setOnRefreshListener(this);
        setCheckOutLayout();
        return view;
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
        mLayoutManager = new LinearLayoutManager(getActivity());
        mRecyclerView.setLayoutManager(mLayoutManager);
        foodItemLists.clear();
        ItemOneParsing();
        itemOneAdapter = new ItemOneAdapter(foodItemLists, getActivity());
        System.out.println("fooditemlists" + foodItemLists.size());
        mRecyclerView.setAdapter(itemOneAdapter);


    }


    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);

        final MenuItem item = menu.findItem(R.id.action_search);
        final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
        searchView.setOnQueryTextListener(this);
        System.out.println("Inside onCreate Option Menu ");

        MenuItemCompat.setOnActionExpandListener(item, new MenuItemCompat.OnActionExpandListener() {
            @Override
            public boolean onMenuItemActionExpand(MenuItem item) {
                itemOneAdapter.setFilter(foodItemLists);
                return true;
            }

            @Override
            public boolean onMenuItemActionCollapse(MenuItem item) {
                return true;
            }
        });
    }

    public void ItemOneParsing() {

       final ProgressDialog loading = ProgressDialog.show(getActivity(), "Fetching Food", "Please wait...", false, false);
        JsonObjectRequest fooditemreq = new JsonObjectRequest(Request.Method.GET, url_all_items, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                loading.dismiss();
                JsonItemOneParsing(response);

            }
        }, new Response.ErrorListener() {
            @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                loading.dismiss();
                System.out.println("volley item error message response" + volleyError.getMessage());
                if (volleyError instanceof NoConnectionError) {
                    linearLayout.setBackground(getResources().getDrawable(R.mipmap.noconnect));
                    Snackbar snackbar = Snackbar.make(getView(), "Unable to Connect", Snackbar.LENGTH_SHORT)
                            .setAction("Retry", new View.OnClickListener() {
                                @Override
                                public void onClick(View v) {
                                    ItemOneParsing();
                                }
                            });
                    snackbar.setActionTextColor(Color.RED);
                    snackbar.show();
                } else if (volleyError instanceof TimeoutError) {
                    Toast.makeText(getActivity(), "Slow Internet connection, Please try again", Toast.LENGTH_SHORT).show();
                    System.out.println("volley item error message response" + volleyError.getMessage());
                }


            }
        });
        AppController.getInstance().addToRequestQueue(fooditemreq);

    }


    private void JsonItemOneParsing(JSONObject response) {
        System.out.println("Volley Success response" + response.toString());
        try {

            int success = response.getInt("success");

            if (success == 1) {
                System.out.println("volley item entering after success");
                items = response.getJSONArray((TAG_ITEMS));
                System.out.println("volley item entering success loop==" + items);

                JSONObject c = null;
                for (int i = 0; i < items.length(); i++) {

                    FoodItemList itemList = new FoodItemList();
                    c = items.getJSONObject(i);
                    System.out.println("volley item entering success loop==" + c);

                    String itemimage = c.getString(TAG_IMG_URL);
                    itemList.setImageurl(itemimage);
                    System.out.println("volley item image==" + itemimage);

                    String itemName = c.getString(TAG_ITEM_NAME);
                    itemList.setItemName(itemName);
                    System.out.println("volley item name==" + itemName);

                    String itemDesc = c.getString(TAG_ITEM_DESCRIPTION);
                    itemList.setItemdesciption(itemDesc);
                    System.out.println("volley item descroption==" + itemDesc);

                    String itemPrice = c.getString(TAG_PRICE);
                    itemList.setItemprice(itemPrice);
                    System.out.println("volley item price==" + itemPrice);

                    foodItemLists.add(itemList);
                    itemOneAdapter.notifyDataSetChanged();
                }

            }


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


    public void setCheckOutLayout() {
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                if (getActivity() == null)
                    return;

                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if (SessionManager.ProccedFlag == 1) {
                            toolbar.setVisibility(View.VISIBLE);
                        } else {
                            toolbar.setVisibility(View.GONE);
                        }
                    }
                });

            }
        }, 5, 5);
    }

    @Override
    public boolean onQueryTextSubmit(String query) {
        return false;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        final ArrayList<FoodItemList> filtereditemlist = filter(foodItemLists, newText);
        itemOneAdapter.setFilter(filtereditemlist);

        return false;
    }

    private ArrayList<FoodItemList> filter(ArrayList<FoodItemList> foodItemLists, String newText) {
        newText = newText.toLowerCase();

        final ArrayList<FoodItemList> filtereditemlist = new ArrayList<>();
        for (FoodItemList foodItemList : foodItemLists) {
            final String text = foodItemList.getItemName().toLowerCase();
            if (text.contains(newText)) {
                filtereditemlist.add(foodItemList);
            }
        }
        return filtereditemlist;
    }
}

4 Answers4

9

Try extending FragmentStatePagerAdapter, instead of FragmentPagerAdapter, that once solved the world of trouble for me.

The main difference is that FragmentStatePagerAdapter should be use for a large number of pages, while FragmentPagerAdapter is used for a handful of pages, which will be kept in memory. Check out the official docs or this link for more information.

Vucko
  • 7,371
  • 2
  • 27
  • 45
0

Using FragmentStatePagerAdapter instead of FragmentPagerAdapter fixed this issue for me.

Mark Fonte
  • 261
  • 3
  • 8
0

I experienced the exact same thing and fixed it by using childFragmentManger instead of using getFragmentManager when initializing the tab layout adapter´. To me using FragmentStatePagerAdapter was not a viable solution as it caused a slight lag evertime the user navigated to one of the more heavy fragments (having a MapFragment embedded into it), due to it being recreated every time.

0

As said here and here, in the creation of ViewPagerAdapter you should use getChildFragmentManager() in the case of using Fragment inside Fragment, what happens when using the navigation system with tabs.

So, the line in HomeFragment:

ViewPagerAdapter adapter = new ViewPagerAdapter(getFragmentManager());

should be:

ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager());
Luís Alves
  • 81
  • 2
  • 4