android - 在适配器的构造函数中传递 fragment

标签 android fragment android-viewpager

由于 onClick 事件从未在 ViewPager 上触发(参见 this question ),我打算将 onClickListener 设置为适配器中的项目容器。

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

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

但是我该如何处理 fragment 呢?将 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 */

}

最佳答案

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

 }

关于android - 在适配器的构造函数中传递 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10243909/

相关文章:

java - 如何将语音聊天功能添加到已经存在的视频 session 代码 WebRTC Android

通过 NDK 的 Android 客户端-服务器

android - Kotlin:不同 fragment 之间的通信

android - recyclerView.setOnScrollChangeListener 不工作

android - 如何在 Robolectric 的 ViewPager 上模拟拖动事件?

android - 无法为未附加到 FragmentManager 的 Fragment 设置MaxLifecycle : ViewPager

Android 应用程序,Activity 启动滞后于 viewpager

java - 在 View 上绘制简单文本

android - 发布应用后的 Logcat

android - 我可以在我的 android 应用程序中使用哪些控件?