androidfragmentandroid-tabbed-activitytabbed-view

Same Fragment with listviews on different tabs



I would like to create an activity which shows 3 tabs. The first tab should show a user's uploaded photos the 2nd all the images a user liked, and 3rd the user's favorite images. All these data comes from a webservice.I would like to use the same fragment with it's layout file and call different URLs. The fragment implements a StringReader and populates a listview inside.
My problem is that I managed to load the Fragment in the first tab, but the second and third tabs remains empty. If I navigate to the last tab and started to navigate back, then the first tab remains empty and the second gets populated. I watched so many tutorials and red what I could reached but It seems that nothing has helped.
The Fragment instantiation in my Activity looks like this :

public class SectionsPagerAdapter extends FragmentPagerAdapter {

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

@Override
public Fragment getItem(int position) {
    // getItem is called to instantiate the fragment for the given page.
    // Return a PlaceholderFragment (defined as a static inner class below).
    switch (position) {
        case 0:
            return UsersSpheresFragment.newInstance();
        case 1:
            return UsersSpheresFragment.newInstance();
        case 2:
            return UsersSpheresFragment.newInstance();
        default:
            return  null;
    }
}

@Override
public int getCount() {
    // Show 3 total pages.
    return 3;
}

@Override
public CharSequence getPageTitle(int position) {
    switch (position) {
        case 0:
            return "SECTION 1";
        case 1:
            return "SECTION 2";
        case 2:
            return "SECTION 3";
    }
    return null;
}

}


my fragment is :

public class UsersSpheresFragment extends Fragment {

    CircleImageView userImageFragment;
    TextView userNameTextFragment;
    TextView nrOfSpheresFragment;
    LinearLayout loadingLayoutFragment;
    ListView listview_spheresFragment;
    public PhotosphereListAdapter adapter;
    TextView nrOfLikes;
    TextView nrOfSeens;

    String userId="";
    String userName = "";

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view =  inflater.inflate(R.layout.my_spheres_fragment,container,false);
        return view;
    }

    // newInstance constructor for creating fragment with arguments
    public static UsersSpheresFragment newInstance() {
        UsersSpheresFragment fragmentFirst = new UsersSpheresFragment();
        return fragmentFirst;
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        userImageFragment = (CircleImageView) getActivity().findViewById(R.id.userImageFragment);
        userNameTextFragment = (TextView) getActivity().findViewById(R.id.userNameTextFragment);
        nrOfSpheresFragment = (TextView) getActivity().findViewById(R.id.nrOfSpheresFragment);
        loadingLayoutFragment = (LinearLayout) getActivity().findViewById(R.id.loadingLayoutFragment);
        listview_spheresFragment = (ListView) getActivity().findViewById(R.id.listview_spheresFragment);
        nrOfLikes = (TextView)getActivity().findViewById(R.id.nrOfLikes);
        nrOfSeens = (TextView)getActivity().findViewById(R.id.nrOfSeens);

        GlobalUserData userData = (GlobalUserData)getActivity().getApplication();
        Bundle bundle = this.getArguments();

        if (bundle != null) {
            userId = bundle.getString("userId","");
            userName = bundle.getString("userName","");
            userNameTextFragment.setText(userName);
        }
        else{
            if (userData.getUserImageLink().length() > 0) {
                LoadUserImage(userData.getName(), userData.getUserImageLink());
            }
            userNameTextFragment.setText(userData.getName());

        }
        //Log.i("TAG",userData.GetAllData());


        if (userId.length() > 0)
            loadImagesFromAPI(MainActivity.URL_DATA+"typ=mysphere&id="+userId);
        else
            loadImagesFromAPI(MainActivity.URL_DATA+"typ=mysphere&id="+userData.getUserId());

        listview_spheresFragment.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //send the photosphereId to the Panoviewer fragment
                Bundle bundle = new Bundle();
                bundle.putString("Id", view.getTag().toString());
                bundle.putString("Title", ((Photosphere) adapter.getItem(position)).getTitle());
                bundle.putString("Description", ((Photosphere) adapter.getItem(position)).getDescription());
                bundle.putString("ThumbUrl", ((Photosphere) adapter.getItem(position)).getImageUrl());
                bundle.putBoolean("ShowUserLink", userId.length() > 0 ? false : true);
                //create the fragment
                SimpleFragment fragment = new SimpleFragment();
                fragment.setArguments(bundle);
                FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
                transaction.replace(R.id.content_main, fragment);
                transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                transaction.addToBackStack(null);
                transaction.commit();

            }
        });

    }

    public void LoadUserImage(String userName, String imageUrl){
        ImageLoader imageLoader = CustomVolleyRequest.getInstance(getActivity()).getImageLoader();
        Bitmap bm =  imageLoader.get(imageUrl, ImageLoader.getImageListener(userImageFragment, android.R.color.white, android.R.color.white)).getBitmap();
        userImageFragment.setImageBitmap(bm);
        userNameTextFragment.setText(userName);
    }

    public void loadImagesFromAPI(final String Url) {
        loadingLayoutFragment.setVisibility(View.VISIBLE);
        StringRequest stringRequest = new StringRequest(com.android.volley.Request.Method.GET, Url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try {
                            ArrayList<Photosphere> photospheres = new ArrayList<>();
                            JSONObject jsonObject = new JSONObject(response);
                            if(jsonObject.isNull("userModel") || jsonObject.getJSONObject("userModel").isNull("OtherImages")){
                                loadingLayoutFragment.setVisibility(View.GONE);
                                nrOfSpheresFragment.setText("No images");
                            }
                            else {
                                if (userId.length() >0){
                                    LoadUserImage((jsonObject.getJSONObject("userModel")).getString("UserName"),(jsonObject.getJSONObject("userModel")).getString("ImgPath"));
                                }
                                photospheres = new WebServiceReader().processSpheresModelJsonData(jsonObject.getJSONObject("userModel"),"OtherImages");
                                loadingLayoutFragment.setVisibility(View.GONE);
                                //init adapter
                                adapter = new PhotosphereListAdapter(getActivity(), photospheres, (userId.length() > 0 ? false : true),true);
                                listview_spheresFragment.setAdapter(adapter);
                                nrOfSpheresFragment.setText(nrOfSpheresFragment.getText()+"("+listview_spheresFragment.getCount()+")");
                                nrOfLikes.setText((jsonObject.getJSONObject("userModel")).getString("TotalLikes"));
                                nrOfSeens.setText((jsonObject.getJSONObject("userModel")).getString("TotalViews"));
                            }

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        nrOfSpheresFragment.setText("An error occurred. Please try again!");
                    }
                }
        );

        RequestQueue requestQueue = Volley.newRequestQueue(getActivity());
        requestQueue.add(stringRequest);
    }



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


Update! It seems that all of the fragments are loaded and overwritten in the first tab.

nrOfSpheresFragment.setText(nrOfSpheresFragment.getText()+"("+listview_spheresFragment.getCount()+")");

this line of code updates a textview and I can see that the textview is updated 3 times (25)(10)(5) which means the number of results. Only the last result's listview is visible


Solution

  • I figured out what was the problem.
    When I used the fragment, (the fragment was created before, and used in other way) I didn't notice that when I initialize the controls in the page, I use getactivity() instead of rootview. So in order to make it work I changed those two as shown

       userImageFragment = (CircleImageView) view.findViewById(R.id.userImageFragment);
        userNameTextFragment = (TextView) view.findViewById(R.id.userNameTextFragment);
        nrOfSpheresFragment = (TextView) view.findViewById(R.id.nrOfSpheresFragment);
        loadingLayoutFragment = (LinearLayout) view.findViewById(R.id.loadingLayoutFragment);
        listview_spheresFragment = (ListView) view.findViewById(R.id.listview_spheresFragment);
        nrOfLikes = (TextView)view.findViewById(R.id.nrOfLikes);
        nrOfSeens = (TextView)view.findViewById(R.id.nrOfSeens);