2013-04-16 21 views
1

EDIT 2 這是我的適配器的情況下,它可以幫助任何人ViewPager與片段更新屏幕外的視圖,而不是主視圖的工作

public static class MyAdapter extends FragmentPagerAdapter { 
     public MyAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public int getCount() { 
      return sDrawables.length; 
     } 

     @Override 
     public Fragment getItem(int position) { 
      Bundle args = new Bundle(); 
      args.putInt(ImageViewFragment.POSITION_KEY, position); 
      return ImageViewFragment.newInstance(args); 
     } 


     @Override 
     public CharSequence getPageTitle(int position) { 
      String name = ""; 
      try{ 
      name = sNames[position]; 
      }catch(IllegalArgumentException e){ 
       name = "error"; 
      } 
      return name; 
     } 

     public int getItemPosition(){ 
      return POSITION_NONE; 
     } 
    } 

編輯 基於中美拉吉的只是改變的響應:

MainFragmentName fragment= (MainFragmentName)mViewPager.getChildAt(mPosition); 

爲:

ImageViewFragment fragment = (ImageViewFragment)mViewPager.getAdapter().instantiateItem(mViewPager, mViewPager.getCurrentItem()); 

我現在總是在尋呼機上的下一個項目進行更改,如果我正在朝那個方向進行更改,或者左側的其他項目正在進行更改。有關於此的任何想法?

,我發現了以下錯誤:

04-16 16:01:16.952: W/System.err(29027): java.lang.NullPointerException 
04-16 16:01:16.952: W/System.err(29027): at catalog.ImageViewFragment.onChangePicture(ImageViewFragment.java:165) 
04-16 16:01:16.952: W/System.err(29027): at catalog.MenuFragment.changeMainPic(MenuFragment.java:231) 
04-16 16:01:16.952: W/System.err(29027): at catalog.MenuFragment.access$6(MenuFragment.java:224) 
04-16 16:01:16.952: W/System.err(29027): at catalog.MenuFragment$1.onClick(MenuFragment.java:106) 
04-16 16:01:16.952: W/System.err(29027): at android.view.View.performClick(View.java:4202) 
04-16 16:01:16.952: W/System.err(29027): at android.view.View$PerformClick.run(View.java:17340) 
04-16 16:01:16.952: W/System.err(29027): at android.os.Handler.handleCallback(Handler.java:725) 
04-16 16:01:16.952: W/System.err(29027): at android.os.Handler.dispatchMessage(Handler.java:92) 
04-16 16:01:16.952: W/System.err(29027): at android.os.Looper.loop(Looper.java:137) 
04-16 16:01:16.952: W/System.err(29027): at android.app.ActivityThread.main(ActivityThread.java:5039) 
04-16 16:01:16.952: W/System.err(29027): at java.lang.reflect.Method.invokeNative(Native Method) 
04-16 16:01:16.952: W/System.err(29027): at java.lang.reflect.Method.invoke(Method.java:511) 
04-16 16:01:16.952: W/System.err(29027): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
04-16 16:01:16.952: W/System.err(29027): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
04-16 16:01:16.952: W/System.err(29027): at dalvik.system.NativeStart.main(Native Method) 

編輯完

我一直在一個目錄類似的應用程序爲Android,是相對簡單和繼電器上的片段支持V4。

想法是在視圖頁面上顯示一個圖像數組,視圖頁面的孩子是一個帶有ImageView的片段。

查看尋呼機被包含在另一個片段上,該片段覆蓋垂直滾動以顯示主圖片的不同圖片,並且當被點擊時主圖片將變爲所選圖片。

一切工作正常,但主要的圖片更新功能。當點擊垂直滾動視圖中的縮略圖時,主畫面會改變,但問題有時會改變,而不是當前頁面的主畫面改變,它會從離屏視圖改變畫面。

在那裏,我改變畫面中的部分代碼是這樣的:

private void changeMainPic(String sName){ 

    try{ 
     if(mViewPager != null){ 
      String tName = sName.replace("_s.jpg", ".jpg"); 


      mainIv = (ImageView)mViewPager.getChildAt(mPosition).findViewById(R.id.mainImageView); 

      InputStream is2 = getActivity().getAssets().open(tName); 
      Bitmap bm2 = BitmapFactory.decodeStream(is2); 
      mainIv.setImageBitmap(bm2); 
      is2.close(); 
     } 
    }catch(Exception e){ 
     e.printStackTrace(); 
     Log.e("Pictures","error on main iv "+e); 
    } 
} 

的什麼是錯的任何想法?如果你需要代碼的其他部分,請告訴我。

非常感謝你提前給大家

大衛

+0

,您是否試圖重寫'getItemPosition(Object對象)'在適配器並返回'POSITION_NONE'? –

+0

對不起Lalit Poptani,但我真的不明白我在哪裏需要做到這一點? – David

+0

在ViewPager的Adapter類中。 –

回答

1

只要改變在本changeMainPic(String sName)

內活動,

private void changeMainPic(String sName){ 
    try{ 
     if(mViewPager != null){ 
      String tName = sName.replace("_s.jpg", ".jpg"); 
      MainFragmentName fragment= (MainFragmentName)mPagerAdapter.getChildAt(mPosition); 
      fragment.onChangePicture(tName);//Call a public function inside of fragment 

     } 
    }catch(Exception e){ 
     e.printStackTrace(); 
     Log.e("Pictures","error on main iv "+e); 
    } 
} 

內部片段的,

ImageView mainIv=null; 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) 
{ 
     View view = inflater.inflate(R.layout.layout, container, false); 
     mainIv=(ImageView)view.findViewById(R.id.mainImageView); 
     return view; 
} 
public void onChangePicture(tName) 
    { 
      InputStream is2 = getActivity().getAssets().open(tName); 
      Bitmap bm2 = BitmapFactory.decodeStream(is2); 
      mainIv.setImageBitmap(bm2); 
      is2.close(); 
    } 

編輯 - 2 在您的活動中實施OnPageChangeListener(即,E,Activity implements OnPageChangeListener)然後你逐漸然後覆蓋功能,

public void onPageScrollStateChanged(int arg0) 
    {} 
    public void onPageScrolled(int arg0, float arg1, int arg2) 
    {} 
    public void onPageSelected(int position) 
    { 
     mPosition=position; 
    } 

編輯 - 3 編輯適配器...

public static class MyAdapter extends FragmentPagerAdapter { 
     private FragmentManager fragmentManager=null; 
     public MyAdapter(FragmentManager fm) { 
      super(fm); 
      fragmentManager=fm; 
     } 

     @Override 
     public int getCount() { 
      return sDrawables.length; 
     } 

     @Override 
     public Fragment getItem(int position) { 
      Bundle args = new Bundle(); 
      args.putInt(ImageViewFragment.POSITION_KEY, position); 
      fragmentManager.beginTransaction().commitAllowingStateLoss(); 
      return ImageViewFragment.newInstance(args); 
     } 
     @Override 
     public CharSequence getPageTitle(int position) { 
      String name = ""; 
      try{ 
      name = sNames[position]; 
      }catch(IllegalArgumentException e){ 
       name = "error"; 
      } 
      return name; 
     } 

     public int getItemPosition(){ 
      return POSITION_NONE; 
     } 
    } 
+0

感謝您的回放,但它確實有很大的意義,但作爲mViewPager。 getChildAt()返回一個視圖,它不能被視爲片段,除非我丟失了一些東西。 – David

+0

對不起,我已更新。我只是編輯你的代碼而不看這是一個視圖尋呼機。只要將視圖尋呼機改爲mPagerAdapter,然後工作正常.. –

+0

當這工作正常,然後upvote和打勾答案.. –