FragmentPagerAdapter.java revision ea2c91b0198855073983b4a8437aa71cbd83872f
1ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn/*
2ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn * Copyright (C) 2011 The Android Open Source Project
3ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn *
4ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
5ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn * you may not use this file except in compliance with the License.
6ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn * You may obtain a copy of the License at
7ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn *
8ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
9ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn *
10ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn * Unless required by applicable law or agreed to in writing, software
11ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
12ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn * See the License for the specific language governing permissions and
14ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn * limitations under the License.
15ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn */
16ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn
17ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackbornpackage android.support.v13.app;
18ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn
19ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackbornimport android.app.Fragment;
20ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackbornimport android.app.FragmentManager;
21ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackbornimport android.app.FragmentTransaction;
22ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackbornimport android.os.Parcelable;
23ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackbornimport android.support.v13.view.PagerAdapter;
24ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackbornimport android.util.Log;
25ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackbornimport android.view.View;
26ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn
27ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackbornpublic abstract class FragmentPagerAdapter implements PagerAdapter {
28ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    private static final String TAG = "FragmentPagerAdapter";
29ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    private static final boolean DEBUG = false;
30ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn
31ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    private final FragmentManager mFragmentManager;
32ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    private FragmentTransaction mCurTransaction = null;
33ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn
34ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    public FragmentPagerAdapter(FragmentManager fm) {
35ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn        mFragmentManager = fm;
36ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    }
37ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn
38ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    /**
39ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn     * Return the Fragment associated with a specified position.
40ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn     */
41ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    public abstract Fragment getItem(int position);
42ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn
43ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    @Override
44ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    public void startUpdate() {
45ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    }
46ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn
47ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    @Override
48ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    public Object instantiateItem(int viewId, int position) {
49ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn        if (mCurTransaction == null) {
50ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn            mCurTransaction = mFragmentManager.beginTransaction();
51ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn        }
52ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn
53ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn        // Do we already have this fragment?
54ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn        String name = makeFragmentName(viewId, position);
55ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn        Fragment fragment = mFragmentManager.findFragmentByTag(name);
56ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn        if (fragment != null) {
57ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn            if (DEBUG) Log.v(TAG, "Attaching item #" + position + ": f=" + fragment);
58ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn            mCurTransaction.attach(fragment);
59ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn        } else {
60ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn            fragment = getItem(position);
61ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn            if (DEBUG) Log.v(TAG, "Adding item #" + position + ": f=" + fragment);
62ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn            mCurTransaction.add(viewId, fragment, makeFragmentName(viewId, position));
63ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn        }
64ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn
65ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn        return fragment;
66ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    }
67ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn
68ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    @Override
69ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    public void destroyItem(int position, Object object) {
70ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn        if (mCurTransaction == null) {
71ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn            mCurTransaction = mFragmentManager.beginTransaction();
72ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn        }
73ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn        if (DEBUG) Log.v(TAG, "Detaching item #" + position + ": f=" + object
74ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn                + " v=" + ((Fragment)object).getView());
75ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn        mCurTransaction.detach((Fragment)object);
76ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    }
77ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn
78ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    @Override
79ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    public void finishUpdate() {
80ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn        if (mCurTransaction != null) {
81ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn            mCurTransaction.commit();
82ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn            mCurTransaction = null;
83ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn            mFragmentManager.executePendingTransactions();
84ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn        }
85ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    }
86ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn
87ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    @Override
88ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    public boolean isViewFromObject(View view, Object object) {
89ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn        return ((Fragment)object).getView() == view;
90ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    }
91ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn
92ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    @Override
93ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    public Parcelable saveState() {
94ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn        return null;
95ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    }
96ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn
97ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    @Override
98ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    public void restoreState(Parcelable state) {
99ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    }
100ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn
101ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    private static String makeFragmentName(int viewId, int index) {
102ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn        return "android:switcher:" + viewId + ":" + index;
103ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn    }
104ea2c91b0198855073983b4a8437aa71cbd83872fDianne Hackborn}