2012-04-20 53 views
1

由於onClick事件從未在ViewPager(請參閱this question)上觸發,因此我要將onClickListener設置爲適配器中的項容器。在適配器的構造函數中傳遞片段

這個想法是,當一個項目被點擊時,從適配器調用一個來自該適配器被設置爲ViewPager的片段的方法。

對於Activity我會傳遞上下文並使用此上下文調用方法(如((myActivity)context).itemContainerOnClick())。

但是我該如何處理碎片?我可以面對將Fragment作爲參數傳遞給適配器構造函數的任何問題嗎?

感謝

片段

public class MyFragment extends Fragment { 

    ViewPager mViewPager; 

    int mPosition = 0; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     view = (RelativeLayout) inflater.inflate(R.layout.my_fragment_container, container, false); 

     ViewPager viewPager = (ViewPager) view.findViewById(R.id.viewpager); 

     mViewPager.setAdapter(new MyAdapter(getActivity(), myObjectArray); 

     mViewPager.setOnPageChangeListener(new OnPageChangeListener() { 

      @Override 
      public void onPageSelected(int position) { 
       mPosition = position; 
      } 

      @Override 
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} 

      @Override 
      public void onPageScrollStateChanged(int state) {} 
     }); 

     mViewPager.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // I want to start some activity, passing mPosition 
       // but this is never called 
      } 
     }); 


     return view; 
    } 

    // Alternative to mViewPager.setOnClickListener, called from the adapter 
    public void onViewPagerClick() 
    { 
     // start some activity, passing mPosition 
    } 
} 

PageAdapter

class MyAdapter extends PagerAdapter { 

    private MyObject[] mItemArray; 
    private Context mContext; 

    public SejoursWidgetAdapter(Context context, MyObject[] itemArray) { 
     mContext = context; 
     mItemArray = itemArray; 
    } 

    @Override 
    public Object instantiateItem(View collection, int position) { 

     LayoutInflater inflater = (LayoutInflater) collection.getContext() 
     .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     View row = inflater.inflate(R.layout.item, null);  

     // Add click listener here because setting it directly on the ViewPager does not work (onClick not triggered)  
     row.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // How can I call MyFragment's onViewPagerClick() ? 
      } 
     }); 

     ((ViewPager) collection).addView(row);   


     return row; 
    } 

    /* More stuff */ 

} 

回答

3

檢查我下面的代碼與項目單擊更改。

class MyAdapter extends PagerAdapter { 

    private MyObject[] mItemArray; 
    private Context mContext; 

public SejoursWidgetAdapter(Context context, MyObject[] itemArray) { 
    mContext = context; 
    mItemArray = itemArray; 
} 

@Override 
public Object instantiateItem(View collection, int position) { 

    LayoutInflater inflater = (LayoutInflater) collection.getContext() 
    .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    View row = inflater.inflate(R.layout.item, null);  
    row .setTag(position); 
    // Add click listener here because setting it directly on the ViewPager does not work (onClick not triggered)  
    row.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // How can I call MyFragment's onViewPagerClick() ? 

      int position=(Integer) v.getTag(); 
    Log.v("Log_tag", "Here image is clicked"+ position); 
     //now you known which Page is click you can do what you want. 
     } 
    }); 

    ((ViewPager) collection).addView(row);   


    return row; 
} 

/* More stuff */ 

} 
+0

不回答這個問題,但解決我的問題! – jul 2012-04-22 11:23:24

+0

當您使用尋呼機並一次在屏幕上顯示多個頁面時,該標籤非常有用。 – 2014-02-27 18:01:37

1

您還可以通過

int position = mViewPager.getCurrentItem(); 

,而不是

獲取當前頁面的位置從mViewPager
int position=(Integer) v.getTag();