/* * Copyright (c) 2012 Daniel Huckaby * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.handlerexploit.prime.example.activities; import java.util.ArrayList; import java.util.List; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.AsyncTaskLoader; import android.support.v4.content.Loader; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView.ScaleType; import com.handlerexploit.prime.example.R; import com.handlerexploit.prime.example.adapters.LazyImageAdapter; import com.handlerexploit.prime.example.utils.Utilities; import com.handlerexploit.prime.example.utils.Utilities.Image; import com.handlerexploit.prime.example.utils.WrappedAsyncTaskLoader; import com.handlerexploit.prime.widgets.RemoteImageView; /** * This class implements and displays the {@link LazyImageAdapter} in the form * of a {@link ViewPager}. This example uses a {@link AsyncTaskLoader} internally * for generating our list of image urls. */ public class ViewPagerExample extends FragmentActivity implements LoaderCallbacks<List<Image>> { private PagerAdapter mPagerAdapter; private View mEmptyView; private ViewPager mViewPager; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.viewpager_content); mPagerAdapter = new PagerAdapter(this); mEmptyView = findViewById(R.id.progressContainer); mEmptyView.setVisibility(View.VISIBLE); mViewPager = (ViewPager) findViewById(android.R.id.list); mViewPager.setVisibility(View.GONE); mViewPager.setOffscreenPageLimit(5); mViewPager.setAdapter(mPagerAdapter); getSupportLoaderManager().initLoader(0, null, this); } @Override public Loader<List<Image>> onCreateLoader(int id, Bundle args) { return new WrappedAsyncTaskLoader<List<Image>>(this) { @Override public List<Image> loadInBackground() { return Utilities.getRandomLargeImages(ViewPagerExample.this); } }; } @Override public void onLoadFinished(Loader<List<Image>> loader, List<Image> images) { for (Image image : images) { Bundle bundle = new Bundle(); bundle.putString(ImageFragment.EXTRA_TITLE, image.title); bundle.putString(ImageFragment.EXTRA_URL, image.imageURL); mPagerAdapter.add(ImageFragment.class, bundle); } mEmptyView.setVisibility(View.GONE); mViewPager.setVisibility(View.VISIBLE); } @Override public void onLoaderReset(Loader<List<Image>> loader) { mPagerAdapter.clear(); mEmptyView.setVisibility(View.VISIBLE); mViewPager.setVisibility(View.GONE); } public static class ImageFragment extends Fragment { public static final String EXTRA_TITLE = "title"; public static final String EXTRA_URL = "url"; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Bundle arguments = getArguments(); Image image = new Image(); image.title = arguments.getString(EXTRA_TITLE); image.imageURL = arguments.getString(EXTRA_URL); RemoteImageView remoteImageView = new RemoteImageView(inflater.getContext()); remoteImageView.setScaleType(ScaleType.CENTER_CROP); remoteImageView.setImageURL(image.imageURL); return remoteImageView; } } public static class PagerAdapter extends FragmentStatePagerAdapter { private List<Holder> holderList = new ArrayList<Holder>(); private FragmentActivity fragmentActivity; public PagerAdapter(FragmentActivity fragmentActivity) { super(fragmentActivity.getSupportFragmentManager()); this.fragmentActivity = fragmentActivity; } public void clear() { holderList.clear(); notifyDataSetChanged(); } public void add(Class<? extends Fragment> className, Bundle params) { Holder holder = new Holder(); holder.className = className.getName(); holder.params = params; int position = holderList.size(); holderList.add(position, holder); notifyDataSetChanged(); } public Fragment getFragment(ViewPager viewPager, int position) { return (Fragment) instantiateItem(viewPager, position); } @Override public Fragment getItem(int position) { Holder currentHolder = holderList.get(position); return Fragment.instantiate(fragmentActivity, currentHolder.className, currentHolder.params); } @Override public int getCount() { return holderList.size(); } private class Holder { String className; Bundle params; } } }