1
votes

I have MainActivity which add two tabs namely "A","B" both tabs send some request to server tab "A" is a fragment and Tab "B" is also a fragment ,problem is that when MainActivity start both tab send server request,by default tab1 is visible to user but what I want when tab 2 is visible then tab2 send request to server.pls help me .

mainactivity code:-

    m_TabLayout = (TabLayout) findViewById(R.id.tab_layout);// finding Id of tablayout
    m_ViewPager = (ViewPager) findViewById(R.id.pager);//finding Id of ViewPager
    m_TabLayout.addTab(m_TabLayout.newTab().setText("Deals"));// add deal listin tab
    m_TabLayout.addTab(m_TabLayout.newTab().setText("Stories"));
    m_TabLayout.setTabGravity(TabLayout.GRAVITY_FILL);// setting Gravity of Tab


    CDealMainListingPager m_oDealMainScreenPager = new CDealMainListingPager(getSupportFragmentManager(), m_TabLayout.getTabCount());
    m_ViewPager.setAdapter(m_oDealMainScreenPager);// adiing adapter to ViewPager
    m_ViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(m_TabLayout));// performing action of page changing
    m_TabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            m_ViewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });

tab2 code:-

    private View m_Main;

private String m_szMobileNumber, m_szEncryptedPassword;
private CAdscenMediaDealStorage m_Item;
private static ListView m_ListView;// declaring Listview variable..
private String TAG = CAdscendMediaDeal.class.getSimpleName();
Integer pubId = 105639;
Integer aswallId = 6453;
private ArrayList<CAdscenMediaDealStorage> s_oDataset;// declaring Arraylist variable
private CADscendDealAdapter m_oAdapter;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    m_Main = inflater.inflate(R.layout.adscend_deal_list, container, false);
    getDetail();
    init();

    return m_Main;

}

private void getDetail() {
    CLoginSessionManagement m_oSessionManagement = new CLoginSessionManagement(getActivity());// crating object of Login Session
    HashMap<String, String> user = m_oSessionManagement.getLoginDetails();// get String from Login Session
    m_szMobileNumber = user.get(CLoginSessionManagement.s_szKEY_MOBILE).trim();// getting password from saved preferences..........


}

public void init() {
    m_ListView = (ListView) m_Main.findViewById(R.id.dealList);
    s_oDataset = new ArrayList<>();
    m_ListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            try {
                String url = s_oDataset.get(position).getM_Link();
                if (!url.startsWith("http://") && !url.startsWith("https://"))
                    url = "http://" + url;
                Intent myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                startActivity(myIntent);

            } catch (ActivityNotFoundException e) {
                Toast.makeText(getActivity(), "No application can handle this request."
                        + " Please install a webbrowser", Toast.LENGTH_LONG).show();
                e.printStackTrace();
            }
        }
    });
}

@Override
public void onResume() {
    super.onResume();
    getAdscendDeal();
}

public void getAdscendDeal() {
    String url = "http://adsc.com/adwall/api/publisher/" + pubId + "/profile/" + aswallId + "/offers.json?subid1=" + m_szMobileNumber;

    JSONObject jsonObject = new JSONObject();
    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, jsonObject, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            Log.e(TAG, "Server Response::" + response);
            try {
                JSONArray post = response.optJSONArray("offers");
                for (int i = 0; i < post.length(); i++) {

                    JSONObject obj = post.getJSONObject(i);
                    m_Item = new CAdscenMediaDealStorage();
                    m_Item.setM_szHeaderText(obj.getString("name"));
                    m_Item.setM_szsubHeaderText(obj.getString("description"));
                    m_Item.setM_szDealValue(obj.getString("currency_count"));
                    m_Item.setM_szImageView(obj.getString("creative_url"));
                    m_Item.setM_Link(obj.getString("click_url"));
                    s_oDataset.add(m_Item);

                }
                if (!s_oDataset.isEmpty()) {
                    m_oAdapter = new CADscendDealAdapter(getActivity(), s_oDataset);// create adapter object and add arraylist to adapter
                    m_ListView.setAdapter(m_oAdapter);//adding adapter to recyclerview
                }


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

        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e(TAG, "Server Error::" + error);
        }
    });
    RequestQueue requestQueue = Volley.newRequestQueue(getActivity());
    requestQueue.add(jsonObjectRequest);
}
2

2 Answers

3
votes

When you set the viewpager adapter, onCreateView of Tab2 will also be called. Hence it sends the request.

Override the Fragment method : setUserVisibleHint

public class MyFragment extends Fragment {
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
       // Fragment is visible
      // make request here 
    }
    else {
     // Fragment is not visible
    }
}

}

0
votes

View pager retain some pages either side so that on sliding page shows without loading. The offset limit of ViewPager is by default 0.

setOffscreenPageLimit(int limit) : Set the number of pages that should be retained to either side of the current page in the view hierarchy in an idle state.

But setting viewpager.setOffscreenPageLimit(0) will not work

Warning : Requested offscreen page limit 0 too small; defaulting to 1 try to user this So user this

 public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        // load data here
    }else{
       // fragment is no longer visible
    }
}