如何在Android中使用ViewPager创建图库?

时间:2015-11-16 09:00:11

标签: android android-fragments android-viewpager

我想使用ViewPager创建一个图库,并在this source code中精确解释ViewPager视图下方的缩略图。 但我的问题是,我的类是片段而不是Activity,类扩展DialogFragment。我很困惑如何做到这一点。我无法解决此错误:

  

对于Fragment

类型,方法getSupportFragmentManager()未定义

我知道我不能在Fragment中使用getSupportFragmentManager()但我也不能使用getFragmentManager()。如何解决这个问题?有人请帮忙。

我的适配器类:

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;

import java.util.List;

public class ViewPagerAdapter extends FragmentStatePagerAdapter {

    private List<Integer> images;

    public ViewPagerAdapter(FragmentManager fm, List<Integer> imagesList) {
        super(fm);
        this.images = imagesList;
    }

    @Override
    public Fragment getItem(int position) {
        return PageFragment.getInstance(images.get(position));
    }

    @Override
    public int getCount() {
        return images.size();
    }
}

适配器实例化:

ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager(), images);
viewPager.setAdapter(adapter);

4 个答案:

答案 0 :(得分:2)

我在这里所做的是创建了一个DummyFragment扩展DialogFragment并将所有代码从MainActivity移到Fragment,您可以检查文件,其余文件与您提供的代码链接相同

<强> MainActivity

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout_dummy);

    getSupportFragmentManager().beginTransaction().replace(R.id.container, DummyFragment.newInstance()).commit();

}

}

<强> layout_dummy.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout      xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

</FrameLayout>

DummyFragment //您的对话片段

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import java.util.ArrayList;

/**
* Created by Satyen on 11/16/15.
*/
public class DummyFragment extends DialogFragment {

View view;

private ArrayList<Integer> images;
private BitmapFactory.Options options;
private ViewPager viewPager;
private View btnNext, btnPrev;
private FragmentStatePagerAdapter adapter;
private LinearLayout thumbnailsContainer;
private final static int[] resourceIDs = new int[]{R.mipmap.a, R.mipmap.b,
        R.mipmap.c, R.mipmap.d, R.mipmap.e, R.mipmap.f, R.mipmap.g};

public static DummyFragment newInstance() {
    DummyFragment dummyFragment = new DummyFragment();
    return dummyFragment;
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    view = inflater.inflate(R.layout.activity_main, container, false);

    images = new ArrayList<>();

    //find view by id
    viewPager = (ViewPager) view.findViewById(R.id.view_pager);
    thumbnailsContainer = (LinearLayout) view.findViewById(R.id.container);
    btnNext = view.findViewById(R.id.next);
    btnPrev = view.findViewById(R.id.prev);

    btnPrev.setOnClickListener(onClickListener(0));
    btnNext.setOnClickListener(onClickListener(1));

    setImagesData();

    // init viewpager adapter and attach
    adapter = new ViewPagerAdapter(getChildFragmentManager(), images);
    viewPager.setAdapter(adapter);

    inflateThumbnails();
    return view;
}

private View.OnClickListener onClickListener(final int i) {
    return new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (i > 0) {
                //next page
                if (viewPager.getCurrentItem() < viewPager.getAdapter().getCount() - 1) {
                    viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
                }
            } else {
                //previous page
                if (viewPager.getCurrentItem() > 0) {
                    viewPager.setCurrentItem(viewPager.getCurrentItem() - 1);
                }
            }
        }
    };
}

private void setImagesData() {
    for (int i = 0; i < resourceIDs.length; i++) {
        images.add(resourceIDs[i]);
    }
}

private void inflateThumbnails() {
    for (int i = 0; i < images.size(); i++) {
        View imageLayout = getActivity().getLayoutInflater().inflate(R.layout.item_image, null);
        ImageView imageView = (ImageView) imageLayout.findViewById(R.id.img_thumb);
        imageView.setOnClickListener(onChagePageClickListener(i));
        options = new BitmapFactory.Options();
        options.inSampleSize = 3;
        options.inDither = false;
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), images.get(i), options );
        imageView.setImageBitmap(bitmap);
        //set to image view
        imageView.setImageBitmap(bitmap);
        //add imageview
        thumbnailsContainer.addView(imageLayout);
    }
}

private View.OnClickListener onChagePageClickListener(final int i) {
    return new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            viewPager.setCurrentItem(i);
        }
    };
}
}

答案 1 :(得分:1)

有一个用于为viewPager创建指示器的库,该指示器为viewPager中的每个图像显示一个小的预览,并能够实时删除项目。

很高兴看看: ThumbIndicator

enter image description here

答案 2 :(得分:0)

  

我的类是Fragment而不是Activity,类扩展   DialogFragment。我很困惑如何做到这一点。我无法解决这个问题   错误:

在这种情况下,您必须直接使用getFragmentManager()。如果您的Fragment来自支持包,Android将返回支持片段管理器。在这种情况下,我认为您可能想要使用getChildFragmentManager()

答案 3 :(得分:0)

您有多个选项。不确定哪种情况最适合您的情况。

1)。 (可能你需要的)fragment.getChildFragmentManager()将返回片段的嵌套片段管理器。它通常用于向其他片段添加/替换片段,因此分页是类似的情况。

2)getActivity().getFragmentManager() / getActivity().getSupportFragmentManager()将返回Activity的片段管理器(用于直接在activity布局上添加/替换片段