如何更改Viewpager图像源(不同的专辑)?

时间:2017-02-26 19:37:54

标签: android android-viewpager slideshow

我有4张专辑,每张专辑有20张图片。作为默认首张专辑图片加载。我想在图像之间切换。我使用viewpager进行滑动,但我无法将图像源更改为其他相册图像。

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

这是我的MainActivty.java。我尝试将resourceID更改为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;
    }

1 个答案:

答案 0 :(得分:0)

所以这是你的代码。

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<>(),因为您的适配器不再“看到”images

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

  3. 您无需重复设置和创建适配器的代码。