如何更改 Viewpager 图像源(不同的相册)?

How can I change Viewpager image sources (different albums)?

我有 4 个相册,每个相册有 20 张图片。作为默认的第一个相册图像加载。我想在图像之间切换。我是用viewpager滑动的,但是不能把图片来源改成其他相册图片

如何使用抽屉项目选择或其他方式更改 resouorceIDs 列表?

这是我的MainActivty.java。我尝试将资源 ID 更改为 r1、r2、r3、r4、r5...

public class MainActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {

private BitmapFactory.Options options;
private ViewPager viewPager;
private FragmentStatePagerAdapter adapter;
private ArrayList<Integer> images;

public static int[] resourceIDs = new int[] {
        R.mipmap.p19,
        R.mipmap.p18,
        R.mipmap.p17,
        R.mipmap.p16,
        R.mipmap.p15,
        R.mipmap.p14,
        R.mipmap.p13,
        R.mipmap.p12,
        R.mipmap.p11,
        R.mipmap.p10,
        R.mipmap.p9,
        R.mipmap.p8,
        R.mipmap.p7,
        R.mipmap.p6,
        R.mipmap.p5,
        R.mipmap.p4,
        R.mipmap.p3,
        R.mipmap.p2,
        R.mipmap.p1,
        R.mipmap.p0
} ;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    images = new ArrayList<>();

    //find view by id
    viewPager = (ViewPager) findViewById(R.id.view_pager);
    setImagesData();


    // init viewpager adapter and attach
    adapter = new ViewPagerAdapter(getSupportFragmentManager(), images);
    viewPager.setAdapter(adapter);
    //right to left sliding
    viewPager.setCurrentItem(adapter.getCount() - 1);
}

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

抽屉代码如下:

private void displaySelectedScreen(int itemId) {

    //creating fragment object
    Fragment fragment = null;

    //initializing the fragment object which is selected
    switch (itemId) {
        case nav_album1:
            fragment = new Album1();
             images = new ArrayList<>();
             resourceIDs = new int[] {
                    R.mipmap.p5,
                    R.mipmap.p4,
                    R.mipmap.p3,
                    R.mipmap.p2,
                    R.mipmap.p1};


            adapter.notifyDataSetChanged();

            adapter = new ViewPagerAdapter(getSupportFragmentManager(), images);
            viewPager.setAdapter(adapter);
            //setContentView(R.layout.kdaria);
            break;
        case R.id.nav_album2:
            fragment = new Album2();

            images = new ArrayList<>();
             resourceIDs = new int[] {
                    R.mipmap.r5,
                    R.mipmap.r4,
                    R.mipmap.r3,
                    R.mipmap.r2,
                    R.mipmap.r1};


            adapter.notifyDataSetChanged();

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

        case R.id.nav_album3:
            fragment = new Album3();

            images = new ArrayList<>();
             resourceIDs = new int[] {
                    R.mipmap.s5,
                    R.mipmap.s4,
                    R.mipmap.s3,
                    R.mipmap.s2,
                    R.mipmap.s1};


            adapter.notifyDataSetChanged();

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

            break;
    }

这是您的代码。

private void displaySelectedScreen(int itemId) { 
    Fragment fragment = null; 
    switch (itemId) { 
        case R.id.nav_album2: 
            fragment = new Album2(); 
            images = new ArrayList<>(); 
            resourceIDs = new int[] { R.mipmap.r5, R.mipmap.r4, R.mipmap.r3, R.mipmap.r2, R.mipmap.r1}; 
            adapter.notifyDataSetChanged(); 
            break;

你在通知什么?您未对 adapter 数据进行任何更改。

如果您只想在 ViewPager 中显示不同的数据,您实际上需要更新 images 列表。然后就可以通知了。

private void displaySelectedScreen(int itemId) { 
    images.clear(); // Always clear
    List<Integer> newImages=new ArrayList<>();

    switch (itemId) { 
        case R.id.nav_album2: 
            newImages = Arrays.asList(
                R.mipmap.r5, R.mipmap.r4, R.mipmap.r3, R.mipmap.r2, R.mipmap.r1);
            break;
        case R.id_nav_album3:
            newImages = Arrays.asList(...);
            break;
        }

    images.addAll(newImages);
    adapter.notifyDataSetChanged(); // always notify
}

要点:

  1. 不要制作 images = new ArrayList<>() 因为您的适配器不再 "sees" images

  2. 您只需要一个适配器。您将一个引用更新为 images,您可以正确调用 notifyDataSetChanged()

  3. 您不需要重复那么多设置和创建适配器的代码。