2016-05-25 5 views
0

У меня есть Activity, который использует ViewPager, внутри этого ViewPager есть TouchImageView (ImageView, который определяет жесты и масштабирует/перемещает соответственно).OnClickListener в PagerAdapter

Теперь я хочу изменить некоторые элементы в пользовательском интерфейсе при щелчке изображения, но поскольку TouchImageView объявлен в PagerAdapter, я не могу его достичь, и если бы я установил что-то на стороне PagerAdapter, я бы не мог " t достичь компонентов пользовательского интерфейса, которые я хочу изменить (я также хотел бы использовать один и тот же адаптер где-то еще в моем приложении, когда я получил это работать). Я попытался настроить onClickListener на сам ViewPager, но это не срабатывает. Теперь я действительно не знаю, что делать.

Вот адаптер:

public class FullScreenImageAdapter extends PagerAdapter { 

    private ArrayList<MediaFile> images; 

    public FullScreenImageAdapter(ArrayList<MediaFile> images) { 
     this.images = images; 
    } 

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

    @Override 
    public View instantiateItem(ViewGroup container, int position) { 
     TouchImageView img = new TouchImageView(container.getContext()); 
     Bitmap bitmap = BitmapFactory.decodeFile(images.get(position).getPath()); 
     img.setImageBitmap(bitmap); 
     container.addView(img, ViewPager.LayoutParams.MATCH_PARENT, ViewPager.LayoutParams.MATCH_PARENT); 
     return img; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     container.removeView((View) object); 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     return view == object; 
    } 
} 

А вот метод, который взаимодействует с ним (в классе ProjectOverviewActivity):

private void viewPicture(final int position) { 
    View decorView = getWindow().getDecorView(); 
    statusBarVisibility = decorView.getSystemUiVisibility(); 
    // Hide the status bar. 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
     decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN); 
    } else { 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    } 

    FullScreenImageAdapter imageAdapter = new FullScreenImageAdapter(mediaFiles); 
    final ViewPager viewPager = (ViewPager) findViewById(R.id.image_pager); 
    viewPager.setAdapter(imageAdapter); 
    viewPager.setCurrentItem(position); 
    View fancyBox = findViewById(R.id.fancyBox); 
    fancyBox.setVisibility(View.VISIBLE); 
    viewPager.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      View btnClose = findViewById(R.id.fancyBoxBtnClose); 
      View btnPrev = findViewById(R.id.fancyBoxBtnPrev); 
      View btnNext = findViewById(R.id.fancyBoxBtnNext); 
      if (overlayButtonsVisible) { 
       btnClose.setVisibility(View.GONE); 
       btnPrev.setVisibility(View.GONE); 
       btnNext.setVisibility(View.GONE); 
      } else { 
       btnClose.setVisibility(View.VISIBLE); 
       if (viewPager.getCurrentItem() > 0) { 
        btnPrev.setVisibility(View.VISIBLE); 
       } 
       if (viewPager.getCurrentItem() < (mediaFiles.size() - 1)) { 
        btnNext.setVisibility(View.VISIBLE); 
       } 
      } 
      overlayButtonsVisible = !overlayButtonsVisible; 

     } 
    }); 

    View fancyBoxBtnClose = findViewById(R.id.fancyBoxBtnClose); 
    final View fancyBoxBtnPrev = findViewById(R.id.fancyBoxBtnPrev); 
    final View fancyBoxBtnNext = findViewById(R.id.fancyBoxBtnNext); 
    fancyBoxBtnClose.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      View decorView = getWindow().getDecorView(); 
      // Show the status bar. 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
       decorView.setSystemUiVisibility(statusBarVisibility); 
      } else { 
       getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, statusBarVisibility); 
      } 
      findViewById(R.id.fancyBox).setVisibility(View.GONE); 
      setViewAndChildrenEnabled(findViewById(R.id.layoutProjectOverview), true); 
      overlayButtonsVisible = false; 
     } 
    }); 
    fancyBoxBtnPrev.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      viewPager.setCurrentItem(viewPager.getCurrentItem() - 1); 
      if (viewPager.getCurrentItem() == 0) { 
       fancyBoxBtnPrev.setVisibility(View.GONE); 
      } 
     } 
    }); 
    fancyBoxBtnNext.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      viewPager.setCurrentItem(viewPager.getCurrentItem() + 1); 
      if (viewPager.getCurrentItem() == (mediaFiles.size() - 1)) { 
       fancyBoxBtnNext.setVisibility(View.GONE); 
      } 
     } 
    }); 
} 

ответ

0

Вы можете попробовать это

Update:

Я думаю Вы должны создать свой собственный ViewPager с GestureDetector

Пример:

public class ClickableViewPager extends ViewPager { 

    private OnItemClickListener mOnItemClickListener; 

    public ClickableViewPager(Context context) { 
     super(context); 
     setup(); 
    } 

    public ClickableViewPager(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setup(); 
    } 

    private void setup() { 
     final GestureDetector tapGestureDetector = new GestureDetector(getContext(), new TapGestureListener()); 

     setOnTouchListener(new OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       tapGestureDetector.onTouchEvent(event); 
       return false; 
      } 
     }); 
    } 

    public void setOnItemClickListener(OnItemClickListener onItemClickListener) { 
     mOnItemClickListener = onItemClickListener; 
    } 

    public interface OnItemClickListener { 
     void onItemClick(int position); 
    } 

    private class TapGestureListener extends GestureDetector.SimpleOnGestureListener { 

     @Override 
     public boolean onSingleTapConfirmed(MotionEvent e) { 
      if(mOnItemClickListener != null) { 
       mOnItemClickListener.onItemClick(getCurrentItem()); 
      } 
      return true; 
    } 
    } 
} 

, а затем в своей деятельности

ClickableViewPager viewPager = (ClickableViewPager) findViewById(R.id.viewPager); 
viewPager.setOnItemClickListener(new ClickableViewPager.OnItemClickListener() { 
      @Override 
      public void onItemClick(int position) { 
       // HADNLE YOUR CLICKS 
      } 
     }); 

SOURCE

+0

Это не будет работать, потому что мне нужно Acces UI компоненты из ProjectOverviewActivity, и я хотел бы использовать этот же адаптер в anothe r в моей заявке (когда я получаю эту работу) –

+0

Я пробовал ваше новое решение, но, к сожалению, слушатель не запускается. –