/*
* 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;
}
}
}