elma
elma

Reputation: 53

Android: call adapter directly in viewpager or call fragment per page?

this question is related with this one that I asked before.

I create a viewpager in MainActivity.java like this:

final ViewPager viewPager = (ViewPager) findViewById(R.id.vp_horizontal_ntb);
viewPager.setAdapter(new PagerAdapter() {
    @Override
    public int getCount() {
        return 5;
    }

    @Override
    public boolean isViewFromObject(final View view, final Object object) {
        return view.equals(object);
    }

    @Override
    public void destroyItem(final ViewGroup container, final int position, final Object object) {
        ((ViewPager) container).removeView((View) object);
    }

    @Override
    public Object instantiateItem(final ViewGroup container, final int position) {
        if(position==0) { 
          // here is important!
        } else if(position == 1) {

        }
            ...
    } 
});

Now I want fill each page with some json RecyclerView data list.(get json from network).

each page has independent data list.

For first time, I create a fragment for each page like this:

if (position == 0) {
    final View view = LayoutInflater.from(getActivity().getBaseContext()).inflate(R.layout.fragment_tab0, null, false);
    tabFragment.MyAdapter adapter = new tabFragment.MyAdapter(getActivity().getSupportFragmentManager());
    adapter.addFragment(new tab0Fragment(), getResources().getString(R.string.tab0));
    container.addView(view);
    return view;
}

(so for 5 page, I have 5 fragment.

DEMO

But My application run slow (laggy) when I swipe pages.(with tap buttom is normal)

So I tried write an Adapter class directly for each page like this:

if (position == 0) {
    final View view = LayoutInflater.from(getBaseContext()).inflate(R.layout.item_vp_list, null, false));
    final RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.rv);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(getBaseContext(), LinearLayoutManager.VERTICAL, false));
    recyclerView.setAdapter(new Tab0RecycleAdapter());
    container.addView(view);
    return view;
 }

with top code,my application run fast again with swap pages!

Is it important to create fragment per each page?

why I must use fragment?(because some programmer recommended it in viewpager)

my method (second method without fragment) is true or false for a real application?

(I am noob and this is my first app)

Upvotes: 0

Views: 525

Answers (1)

aneurinc
aneurinc

Reputation: 1238

  • Now I want fill each page with some json RecyclerView data list.(get json from network).

If you perform this network task on the UI thread, it will block and could cause laggy performance. This could be the reason your pages load slowly. You should perform network tasks on a separate thread.

  • So I tried write an Adapter class directly for each page like this

You only need one adapter per recycler view. If you want to support multiple views within the same adapter, override getItemViewType(). Example here: https://stackoverflow.com/a/26245463/7395923

  • Is it important to create fragment per each page?
  • Why I must use fragment? (because some programmer recommended it in view pager)

It is possible to use a view pager without fragments. Base on your previous question (linked at the top), it does seem overkill to load an entire fragment just to inflate a view. Here is a link to an example of a view pager without fragments: https://stackoverflow.com/a/18710626/7395923

I hope this helps.

Upvotes: 1

Related Questions