2012-04-20 2 views
1

ViewPager (this question 참조)에서 onClick 이벤트가 실행되지 않으므로 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

는 대해서 itemClick 변경 내 아래 코드를 확인합니다.

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

+0

이 태그는 호출기를 사용하고 동시에 여러 페이지를 화면에 표시 할 때 매우 효과적입니다. –

1

당신은 또한

int position = mViewPager.getCurrentItem(); 

대신

하여 mViewPager에서
int position=(Integer) v.getTag();