2017-02-26 67 views
0

我有4个相册,每个相册有20个图像。作为默认的第一张专辑图像加载。我想在图像之间切换。我使用viewpager进行滑动,但我无法将图像的来源更改为其他相册图像。如何更改Viewpager图片来源(不同的相册)?

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

这是我的MainActivty.java。我试图改变resourceIDs到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; 
    } 
+0

你是什么意思“与抽屉项目选择”...你的问题显示没有抽屉相关的代码 –

+0

我有一个抽屉与4项。当我选择第一个项目时,我想更新数组列表到相册图像。 –

+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. 您不需要重复如此多的设置和创建适配器代码。

+1

非常感谢cricket_007。它工作完美。 –

+0

很酷。不过,我不确定你在用这个'fragment'变量做什么。似乎未被使用。 –

+0

没错。我删除了它们。再次感谢。很大的帮助。 –