【问题标题】:Passing a Fragment in the constructor of an Adapter在适配器的构造函数中传递片段
【发布时间】:2012-04-20 09:51:58
【问题描述】:

由于不会在 ViewPager 上触发 onClick 事件(请参阅 this question),因此我将在适配器中将 onClickListener 设置为项目容器。

这个想法是,当一个项目被点击时,从适配器调用一个来自片段的方法,其中这个适配器被设置为ViewPager

对于Activity,我将传递上下文并使用此上下文调用方法(类似于((myActivity)context).itemContainerOnClick())。

但是我该如何处理 Fragment?将 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
    } 
}

页面适配器

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 */

}

【问题讨论】:

    标签: android fragment android-viewpager


    【解决方案1】:

    使用 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 */
    
     }
    

    【讨论】:

    • 当您使用寻呼机并同时在屏幕上显示多个页面时,该标签的效果非常好。
    【解决方案2】:

    您还可以通过

    从您的 mViewPager 中获取当前页面的位置
    int position = mViewPager.getCurrentItem();
    

    而不是

    int position=(Integer) v.getTag();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-31
      • 1970-01-01
      相关资源
      最近更新 更多