2016-05-31 9 views
0

Я пытаюсь скрыть и показать представление при обращении к изображению, у меня есть 3 фрагмента в моем ViewPager, так что проблема в том, что когда я нахожусь в моем первом представлении и я нажимаю на изображение, оно работает отлично (мой взгляд спрятался), но когда я на Фрагменте нет. 2 или три, и я нажмите на ImageView он никогда не скрывает вид его только работает на моем первый фрагмент, это мой код:Проблема при скрытии вида на фрагменте ViewPager

public class MainActivity extends AppCompatActivity { 

    private static int[] imageArray; 

    static ImageLoader imageLoader; 
    static ArrayList<String> urlArray; 
    static DisplayImageOptions options; 
    static ProgressBar spinner; 

    static PhotoViewAttacher mAttacher; 
    static Boolean isToolBarShown = true; 

    static Button nextButton , previousButton; 

    static ViewPager viewPager ; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     urlArray = new ArrayList<>(); 

     urlArray.add("http://i.imgur.com/uLRgvM8.png"); 
     urlArray.add("http://i.imgur.com/LUuJ4FO.png"); 
     urlArray.add("http://i.imgur.com/7SSBNBA.jpg"); 


     // Create global configuration and initialize ImageLoader with this config 
     DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder() 
       .cacheInMemory(true) 
       .imageScaleType(ImageScaleType.EXACTLY) 
       .displayer(new FadeInBitmapDisplayer(300)).build(); 

     ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
       getApplicationContext()) 
       .defaultDisplayImageOptions(defaultOptions) 
       .memoryCache(new WeakMemoryCache()).build(); 

     ImageLoader.getInstance().init(config); 


     imageLoader = ImageLoader.getInstance(); 
     options = new DisplayImageOptions.Builder().cacheInMemory(true) 
       .cacheOnDisk(true) 
       .resetViewBeforeLoading(true).build(); 

//initialize image view 
     ImageView imageView = (ImageView) findViewById(R.id.imageView); 

     ImageFragmentPagerAdapter imageFragmentPagerAdapter = new ImageFragmentPagerAdapter(getSupportFragmentManager()); 
     viewPager = (ViewPager) findViewById(R.id.pager); 

     viewPager.setOffscreenPageLimit(1); 


     viewPager.setAdapter(imageFragmentPagerAdapter); 
    } 







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

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

     @Override 
     public Fragment getItem(int position) { 
      //SwipeFragment fragment = new SwipeFragment(); 
      return SwipeFragment.newInstance(position); 
     } 

    } 

    public static class SwipeFragment extends Fragment { 

     private int position; 
     private ImageView imageView; 
     private RelativeLayout relativeLayout; 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
      final View swipeView = inflater.inflate(R.layout.swipe_fragment, container, false); 

      imageView = (ImageView) swipeView.findViewById(R.id.imageView); 
      spinner = (ProgressBar) swipeView.findViewById(R.id.spinner); 
      relativeLayout = (RelativeLayout) swipeView.findViewById(R.id.tool_bar); 
      Bundle bundle = getArguments(); 
      nextButton = (Button)swipeView.findViewById(R.id.next_button); 
      previousButton = (Button)swipeView.findViewById(R.id.button_previous); 

      position = bundle.getInt("position"); 

      Toast.makeText(getContext(),"NEW PAGE CALLED",Toast.LENGTH_SHORT).show(); 
      if (isToolBarShown){ 

       relativeLayout.setVisibility(View.VISIBLE); 
      }else { 

       relativeLayout.setVisibility(View.GONE); 
      } 
      mAttacher = new PhotoViewAttacher(imageView); 



//   viewPager.OnPageChangeListener(new ViewPager.OnPageChangeListener() { 
//    @Override 
//    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
// 
// 
//    } 
// 
//    @Override 
//    public void onPageSelected(int position) { 
// 
//     loadImageView(position,imageView); 
// 
//    } 
// 
//    @Override 
//    public void onPageScrollStateChanged(int state) { 
// 
//    } 
//   }); 

      previousButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 

        viewPager.setCurrentItem(viewPager.getCurrentItem()-1,true); 
       } 

      }); 

      nextButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 

        viewPager.setCurrentItem(viewPager.getCurrentItem()+1,true); 
       } 

      }); 

      return swipeView; 
     } 





     public void loadImageView(int position, final ImageView imageView){ 

      imageLoader.displayImage(urlArray.get(position), imageView, options, new ImageLoadingListener() { 
       @Override 
       public void onLoadingStarted(String imageUri, View view) { 

       } 

       @Override 
       public void onLoadingFailed(String imageUri, View view, FailReason failReason) { 


        spinner.setVisibility(View.GONE); 
       } 

       @Override 
       public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 

        mAttacher = new PhotoViewAttacher(imageView); 

        mAttacher.setOnViewTapListener(new PhotoViewAttacher.OnViewTapListener() { 
         @Override 
         public void onViewTap(View view, float x, float y) { 

          if (view == imageView){ 
           if (relativeLayout.getVisibility() == View.VISIBLE){ 

            isToolBarShown = false; 
            relativeLayout.setVisibility(View.GONE); 

           }else { 

            isToolBarShown = true; 
            relativeLayout.setVisibility(View.VISIBLE); 
           } 

           Log.d("FUCK","WHAT THE FUCK, WHAT IS WRONG HERE"); 
          } 

         } 
        }); 


        if(mAttacher!=null){ 
         mAttacher.update(); 
        }else{ 
         mAttacher = new PhotoViewAttacher(imageView); 
        } 


        spinner.setVisibility(View.GONE); 
       } 

       @Override 
       public void onLoadingCancelled(String imageUri, View view) { 


        spinner.setVisibility(View.GONE); 
       } 
      }, new ImageLoadingProgressListener() { 
       @Override 
       public void onProgressUpdate(String imageUri, View view, int current, int total) { 

        spinner.setVisibility(View.VISIBLE); 
        spinner.setProgress((current*100)/total); 


       } 
      }); 

     } 



     static SwipeFragment newInstance(int position) { 
      SwipeFragment swipeFragment = new SwipeFragment(); 
      Bundle bundle = new Bundle(); 
      bundle.putInt("position", position); 
      swipeFragment.setArguments(bundle); 
      return swipeFragment; 
     } 


     @Override 
     public void setUserVisibleHint(boolean isVisibleToUser) { 
      super.setUserVisibleHint(isVisibleToUser); 
      if (isVisibleToUser) { 
       // load data here 
//    if (getView() != null) { 
//     isViewShown = true; 
//     // fetchdata() contains logic to show data when page is selected mostly asynctask to fill the data 
//     loadImageView(position , imageView); 
//    } else { 
//     isViewShown = false; 
//    } 
      } 
     } 





}} 

пытается скрыть и показать RelativeView, если кто-нибудь знает, что случилось или отсутствует в моем коде, тогда, пожалуйста, исправьте меня

+0

Btw вопрос, почему в FragmentPagerAdapter в методе GetItem вы создаете SwipeFragment дважды конструктором и newInstance статический метод? –

+0

для получения позиции фрагмента –

+0

Но похоже, что вы возвращаете второй экземпляр SwipeFragment. Сначала создается без позиции. –

ответ

0

Установка ViewPager offscreenpagelimit Mayt поможет вам :)

mViewPager.setoffscreenpagelimit(2) 
//2 is important over here. 
+0

ОК, я пробовал это, ничего не случилось, но мне интересно, что заставляет вас думать, что установка заставки экрана может помочь в этом вопросе ?? –

1

Вы не предоставили весь код, но, как вы сказали в комментариях mAttacher ваш статический переменная извне SwipeFragment. Я думаю, что

  • RelativeLayout
  • вертушка
  • imageLoader

также статические члены из-за пределов SwipeFragment. Если они из вашего макета R.layout.swipe_fragment, вы должны использовать каждый экземпляр relativeLayout, spinner и imageLoader для SwipeFragment.

Теперь вы переходите к другому фрагменту, и вы его видите. Но экземпляры классов, упомянутых выше, из другого фрагмента. И поэтому он не работает для вас так, как должен. Попытайтесь это сделать. И вы можете предоставить больше кода.

Удачи вам!

+0

только что добавил весь мой код, пожалуйста, взгляните и попробуйте ваше предложение –

+0

Как я уже сказал, вы должны попытаться сделать эти экземпляры переменной SwipeFragment. И вы должны избегать того, чтобы хранить все как статические переменные. –

+0

да ладно, только из-за этих статических классов я бы пошел с потоком –

0
private final List<Fragment> mFragmentList = new ArrayList<>(); 
private final List<String> mFragmentTitleList = new ArrayList<>(); 

public void addFragment(Fragment fragment, String title) { 
     mFragmentList.add(fragment); 
     mFragmentTitleList.add(title); 
    } 

// использование функции выше, чтобы установить фрагмент,

Смежные вопросы