ViewPager taking time to load Fragments containing ListViews
Asked Answered
C

2

6

Scope:

I am using a ViewPager inside a fragment(Schedule Fragment) which in turn shows 5 instances of a same fragment(ScheduleListSubFragment) containing different data in respective ListViews. And I am using FragmentPagerAdaper (ScheduleFragmentAdapter).

Code:

The code is as follows:

Schedule Fragment:

    public class ScheduleFragment extends Fragment{
ScheduleFragmentAdapter mAdapter;
ViewPager mPager;
PageIndicator mIndicator;
TitlePageIndicator indicator;

@Override
public void onResume() {
    Log.d(" onResume()------------------ScheduleFrament","oijlkjlijijoij");
    super.onResume();
}

public void setNstartAnimation(final View v, int id, int duration)
{
    Animation anim = AnimationUtils.loadAnimation(getActivity(), id);
    anim.setAnimationListener(new Animation.AnimationListener() {

        @Override
        public void onAnimationStart(Animation animation) {
            v.setVisibility(View.VISIBLE);
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onAnimationEnd(Animation animation) {
            // TODO Auto-generated method stub

        }
    });

    anim.setDuration(duration);
    v.startAnimation(anim);
}


@Override
public void onViewStateRestored(Bundle savedInstanceState) {
    Log.d(" onViewState Restored()------------------ScheduleFrament","oijlkjlijijoij");

    super.onViewStateRestored(savedInstanceState);
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Log.d(" onCreate()------------------ScheduleFrament","oijlkjlijijoij");

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.scheduled_list, null);

    MainActivity.setTouchModewithCurrentPage();

    Log.d(" onCreateView()------------------ScheduleFrament","oijlkjlijijoij");


    mAdapter = new ScheduleFragmentAdapter(getChildFragmentManager());
    prepareSlidingPager(v);

    final TextView tv = (TextView) v.findViewById(R.id.category_header);
    tv.setTypeface(Utils.getHeroFace(getActivity().getAssets()));
    setNstartAnimation(tv, R.anim.slide_in_top, 1000);

    return v;
}

private void prepareSlidingPager(View v)
{

        mPager = (ViewPager)v.findViewById(R.id.pager);

        mPager.setOffscreenPageLimit(4);

        mPager.setAdapter(mAdapter);
        mAdapter.notifyDataSetChanged();


        mIndicator = (TitlePageIndicator)v.findViewById(R.id.indicator);
        indicator = (TitlePageIndicator) mIndicator;
        mIndicator.setViewPager(mPager);
        mIndicator.setCurrentItem(getArguments().getInt("page"));

        mIndicator.setOnPageChangeListener(new pageListener());


        final float density = getResources().getDisplayMetrics().density;
        indicator.setBackgroundColor(0x18AF0000);
        indicator.setFooterColor(0xFFAA2222);

        //indicator.setFooterColor(0xFFAA33);

        indicator.setFooterLineHeight(2 * density); //1dp
        indicator.setFooterIndicatorHeight(3 * density); //3dp
        indicator.setFooterIndicatorStyle(IndicatorStyle.Underline);

        indicator.setTextColor(0xAA000000);
        indicator.setSelectedColor(0xFF000000);
        indicator.setSelectedBold(true);
}


public static ScheduleFragment newInstance(int currentPage)
{
    ScheduleFragment frag = new ScheduleFragment();
    Bundle bundle = new Bundle();
    bundle.putInt("page", currentPage);
    frag.setArguments(bundle);
    return frag;
}


@Override
public void onDetach() {
    super.onDetach();

    try {
        Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
        childFragmentManager.setAccessible(true);
        childFragmentManager.set(this, null);

    } catch (NoSuchFieldException e) {
        throw new RuntimeException(e);
    } catch (IllegalAccessException e) {
        throw new RuntimeException(e);
    }
}

}

ScheduleListSubFragment

    public class ScheduleListSubFragment extends Fragment implements OnItemClickListener, UpdateableFragment{

long startDate;
long endDate;


private ListView eventlist;
private listadapter adapter;
private List events;
private MyDB db;



@Override
public void onResume() {

    Utils.log("on resume......subfragment");



    super.onResume();
}

@Override
public void onSaveInstanceState(Bundle outState) {
    Log.v(" OnsaveInstanceState()------------------","oijlkjlijijoij");
    super.onSaveInstanceState(outState);
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    db=new MyDB(this.getActivity());

    db.open();
    events=db.getScheduleEntries_bytime(getArguments().getLong("start_time"), getArguments().getLong("end_time"));
    db.close();
    if(events!=null)
    {
    adapter=new listadapter(getActivity(), android.R.layout.simple_expandable_list_item_1, events);

    }
    Log.d(" onCreate()------------------sublist schedule","oijlkjlijijoij");

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    return inflater.inflate(R.layout.eventslist_subfragment_layout, null);

}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onViewCreated(view, savedInstanceState);

    Log.d(" onViewCreated()------------------sublist schedule","asdfasdf");// Toast.LENGTH_SHORT).show();

    eventlist=(ListView)view.findViewById(R.id.Event_list);
    eventlist.setOnItemClickListener(this);
    //new updateViewTask().execute(new Object());
    fetcheventdata();

}

private class updateViewTask extends AsyncTask<Object, Object, Object>
{

    @Override
    protected Object doInBackground(Object... params) {
        //try{Thread.sleep(2000);}catch(Exception e){e.printStackTrace();}
        publishProgress(new Object());
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    protected void onProgressUpdate(Object... values) {
        // TODO Auto-generated method stub
        super.onProgressUpdate(values);

    }


}

public static ScheduleListSubFragment newInstance(long starttime, long endtime)
{
    ScheduleListSubFragment frag = new ScheduleListSubFragment();
    Bundle bundle = new Bundle();

    bundle.putLong("start_time", starttime);
    bundle.putLong("end_time", endtime);
    frag.setArguments(bundle);

    return frag;
}



 private void fetcheventdata()
    {


        if(events!=null)
        {
        eventlist.setAdapter(adapter);

        adapter.notifyDataSetChanged();
        Utils.log(".list size: subframgment:"+events.size()+"");//, duration)
        }
        else
            Toast.makeText(getActivity(), "No Events Yet", Toast.LENGTH_LONG);

        //Toast.makeText(getActivity(), events.size(), Toast.LENGTH_LONG).show();



    }


 private class listadapter extends ArrayAdapter<Event>
    {
        private List items;

        public listadapter(Context context, int textViewResourceId,
                List objects){
            super(context, textViewResourceId, objects);
            items=new ArrayList();
            items=objects;

        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            View v=convertView;

            ScheduleEntryViewHolder viewHolder=null;
            if(v==null)
            {
                LayoutInflater vi=(LayoutInflater)getActivity().getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
                v=vi.inflate(R.layout.schedule_entry, null);

                viewHolder = new ScheduleEntryViewHolder();

                viewHolder.nameView=(TextView)v.findViewById(R.id.Name);
                viewHolder.nameView.setTypeface(Utils.getHeroFace(getActivity().getAssets()));
                viewHolder.nameView.setTextColor(getResources().getColor(R.color.black));


                viewHolder.roundView=(TextView)v.findViewById(R.id.Round);
                viewHolder.roundView.setTypeface(Utils.getHeroFace(getActivity().getAssets()));

                Utils.log("entry "+position+"th in listview");

                viewHolder.venueView=(TextView)v.findViewById(R.id.Venue);
                viewHolder.venueView.setTypeface(Utils.getHeroFace(getActivity().getAssets()));
                viewHolder.venueView.setTextColor(getResources().getColor(R.color.darkgrey));

                viewHolder.timeView=(TextView)v.findViewById(R.id.time);
                viewHolder.timeView.setTextColor(getResources().getColor(R.color.black));


                viewHolder.categoryView=(TextView)v.findViewById(R.id.cat_name_view);
                viewHolder.favView = (ImageView) v.findViewById(R.id.favourite_view);



                v.setTag(viewHolder);
            }
            else
                viewHolder = (ScheduleEntryViewHolder) v.getTag();

            ScheduleEntry scheduleentry=(ScheduleEntry)items.get(position);
            if(scheduleentry!=null)
            {

                viewHolder.nameView.setText(scheduleentry.getEventName());
                viewHolder.venueView.setText(scheduleentry.getVenue());
                viewHolder.roundView.setText("("+scheduleentry.getRoundName()+")");
                viewHolder.timeView.setText(Html.fromHtml("<b>"+scheduleentry.getStartTime12()+"-"+scheduleentry.getEndTime12()+"</b><br></br>"+scheduleentry.getStartDate()));

                if(scheduleentry.getFav_status().equals("1"))
                    viewHolder.favView.setVisibility(View.VISIBLE);
                else
                    viewHolder.favView.setVisibility(View.INVISIBLE);

                viewHolder.categoryView.setText(scheduleentry.getCategory());
                viewHolder.categoryView.setBackgroundColor(Utils.getColorforCategory(scheduleentry.getCategory().toUpperCase(), getActivity()));
            }
            return v;
        }

    }


 @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
        eventnotifierapp app=(eventnotifierapp)getActivity().getApplication();

        db.open();
        app.crntEvent=db.getEvent( ((ScheduleEntry)events.get(pos)).getEventName()  );

        db.close();
        //startActivity(new Intent(this.getActivity(), EventDescription.class));

        EventDescriptionFragment frag = EventDescriptionFragment.NewInstance();
        ((MainActivity)getActivity()).OpenNextFragment(frag);

    }



@Override
public void update(long start, long end) {
    Toast.makeText(getActivity(), "finally.... ------------------------------called", Toast.LENGTH_SHORT).show();
    fetcheventdata();

}

}

ScheduleFragmentAdapter

  public class ScheduleFragmentAdapter extends FragmentPagerAdapter{
    String cat_name;
    protected static final String[] CONTENT = new String[] { "All", "Thursday, Feb 27", 
        "Friday, Feb 28", "Saturday, Mar 1", "Sunday, Mar 2", };

    private List<Fragment> fragments;
    private static long startdates[]={day1start, day2start, day3start, day4start};
    private static long enddates[]={day1end, day2end, day3end, day4end};

    private int mCount = CONTENT.length;
    private int mindex=0;


    public void setmIndex(int i)
    {
        mindex=i;
    }

    public ScheduleFragmentAdapter(FragmentManager fm) {
        super(fm);

        fragments = new ArrayList<Fragment>();
        fragments.add(ScheduleListSubFragment.newInstance(day1start, day4end));
        fragments.add(ScheduleListSubFragment.newInstance(day1start, day1end));
        fragments.add(ScheduleListSubFragment.newInstance(day2start, day2end));
        fragments.add(ScheduleListSubFragment.newInstance(day3start, day3end));
        fragments.add(ScheduleListSubFragment.newInstance(day4start, day4end));


    }





    @Override
    public int getItemPosition(Object item) {
        Log.v("getItemPosition() callled......", "yeah-----------------");

        return super.getItemPosition(item);
    }





    @Override
    public Fragment getItem(int position) {

        Log.v("getItem() callled......", "getItem() ...........");
        return fragments.get(position);


    }

    @Override
    public int getCount() {
        return mCount;
    }

    @Override
    public CharSequence getPageTitle(int position) {
      return CONTENT[position % CONTENT.length];
    }
}

Problem

So, coming to the problem. Whenever I replace the ScheduleFragment on my Frame in my Activity, it takes a lot of time for this fragment to come up. To add into your knowledge; It nearly hangs the main Thread.

To prevent this from annoying the user, I made an asynctask that shows the progress bar for 3 seconds. But since the main thread also gets stuck for these 3 minutes, the progress bar comes and also stucks(means the circle is not rotating) for 3 minutes and then disappears.

So guys Please help me out how can I make this ViewPager loading to be efficient. By efficient I mean, How can I load the data in 'ScheduleListSubFragment instances' asynchronously so that the main thread doesn't get stuck.

Supplementary knowledge

  1. In my ListView item, I have 6 textViews and 1 ImageView, because of which, perhaps the view generation is taking time.
Canonicity answered 1/8, 2014 at 6:54 Comment(1)
Struck with the similar issue did you find any solution ?Chromic
C
3

Replacing mPager.setOffscreenPageLimit(4); for mPager.setOffscreenPageLimit(1); should make the first load quicker as you dont need to load the 5 fragments at once, they will be loaded as you swipe.

Cudlip answered 1/8, 2014 at 7:8 Comment(2)
already tried that... but that makes the swipe action very slower.Canonicity
have you got any solution for the same?Yammer
E
2

Extend FragmentStatePagerAdapter instead of FragmentPagerAdapter... https://developer.android.com/reference/android/support/v4/app/FragmentStatePagerAdapter.html

Extract:

This version of the pager is more useful when there are a large number of pages, working more like a list view. When pages are not visible to the user, their entire fragment may be destroyed, only keeping the saved state of that fragment.

This helps loading viewPager fragments faster, as fragments are created/destroyed only when they're required.

You may also want to use RecyclerView instead of ListView, to achieve loading just the visible cells and recycling the hidden ones.

Exercitation answered 24/7, 2017 at 18:31 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.