Search code examples
androidandroid-fragmentsandroid-listviewandroid-tabspopulate

populate listview fragment tab android


My problem here is that my listview doesn't show when the activity loads.

Here is my activity code :

protected void onCreate(Bundle savedInstanceState) {
...
 TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
        tabLayout.addTab(tabLayout.newTab().setText("A"));
        tabLayout.addTab(tabLayout.newTab().setText("B"));
        tabLayout.addTab(tabLayout.newTab().setText("C"));
        tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

        getServices();

        final ViewPager viewPager = (ViewPager)       findViewById(R.id.pager);
        final PagerAdapter adapter = new PagerAdapter
                (getSupportFragmentManager(), tabLayout.getTabCount());
        viewPager.setAdapter(adapter);
        adapter.notifyDataSetChanged();
        viewPager.addOnPageChangeListener(new        TabLayout.TabLayoutOnPageChangeListener(tabLayout));

        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());
            }

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

            }

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

            }
        });
        adapter.notifyDataSetChanged();
  }





   public void getServices(){
    RequestQueue queue;
    queue = Volley.newRequestQueue(this);


    String url = "http://..."

    JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET,url,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    for(int i=0;i<response.length();i++){
                        try{

                            JSONObject jsonObjectService =        response.getJSONObject(i);
                            Service service = new Service(jsonObjectService);
                            serviceList.add(service);
                        }
                        catch(JSONException e){
                            e.printStackTrace();
                        }
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });

    queue.add(jsonArrayRequest);
}

And here my fragment :

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

    v = inflater.inflate(R.layout.fragment_tab_fragment1, container, false);

    activity = (SalonInformationsActivity) getActivity();
    listView = (ListView) v.findViewById(R.id.list_service);
    serviceList = activity.getServiceList();
    adapter = new ServiceListAdapter(activity, serviceList);
    listView.setAdapter(adapter);
    adapter.notifyDataSetChanged();
    activity.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            adapter.notifyDataSetChanged();
        }
    });

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
            ((SalonInformationsActivity)getActivity()).callSalon(v.findFocus());
            //Toast.makeText(getApplicationContext(), salonArrayList.get(position).getTel(), Toast.LENGTH_SHORT).show();
        }
    });
    return v;
}

I'm new to android and i don't know why the listview doesn't show. But if i clic on other tab then return to the tabA the listview appears with my listview updated. Any solution to get the listview fill when it starts ?


Solution

  • Your network call is taking time to return data that you add to your arraylist perform that network call in fragment instead of activity and once it is added to arraylist perform notifyDataSetChanged() on adapter

    In your current case fragment is getting created before newtwork data is returned so that arraylist size is 0

    and there is no need of this

     activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                adapter.notifyDataSetChanged();
            }
        });
    

    you can simply call adapter.notifyDataSetChanged();