canScroll不会在自定义ViewPager上调用

时间:2016-05-31 11:32:51

标签: android-fragments android-viewpager

我有一个非常疯狂的问题。

我想阻止我的自定义ViewPager滚动覆盖canScroll(View v, boolean checkV, int dx, int x, int y)方法。

如果我使用ProductsFragment,它的效果非常好。即使我在同一ViewPager中多次使用它,它也能完美运行。

问题是现在,如果我使用另一个片段canScroll将不会触发该特定片段。 但我想在我的应用程序中使用不同的片段:D

ViewPager:

public class LockableViewPager extends ViewPager {

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


@Override
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
    Log.i("tag","id: "+getContext().getResources().getResourceEntryName(v.getId()));

    return super.canScroll(v, checkV, dx, x, y);
}

适配器:

public class AppointmentPagerAdapter extends FragmentPagerAdapter {

public AppointmentPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int position) {
    switch (position) {
        case 2:
            return new ProductsFragment(); //this works
        case 3:
            return new ProductsFragment(); //this works
        case 1:
            return new InfoFragment(); //this works Not
        case 0:
            return new ScheduleFragment(); //this works Not
        default:
            return null;
    }
}

@Override
public int getCount() {
    return 4;
}

@Override
public CharSequence getPageTitle(int position) {
    return null;
}

ProductsFragment:

public class ProductsFragment extends Fragment {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

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

    View rootView= inflater.inflate(R.layout.fragment_products, container, false);


    ProductsRecycleAdapter adapter=new ProductsRecycleAdapter(getDummyData(), new ProductsRecycleAdapter.ClickHandler() {
        @Override
        public void addToCart(int position) {
            Log.i("log","addToCart: "+position);
        }

        @Override
        public void clicked(int position) {
            Log.i("log","clicked: "+position);
        }
    });

    RecyclerView recyclerView= (RecyclerView) rootView.findViewById(R.id.frag_products_recycle);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(adapter);

    return rootView;
}


@Override
public void onAttach(Context context) {
    super.onAttach(context);
}

@Override
public void onDetach() {
    super.onDetach();

}

ScheduleFragment:

public class ScheduleFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}

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

    View rootView=inflater.inflate(R.layout.fragment_schedule, container, false);


    return rootView;
}


@Override
public void onAttach(Context context) {
    super.onAttach(context);
}

@Override
public void onDetach() {
    super.onDetach();

}

}

LogCat上的输出应该是例如:

    tag: id: act_appointment_pager
    tag: id: fragment_products
    tag: id: frag_products_recycle
    tag: id: act_appointment_pager
    tag: id: fragment_products
    tag: id: frag_products_recycle
    tag: id: act_appointment_pager
    tag: id: fragment_products
    tag: id: frag_products_recycle

但是除了ProductsFragment之外,其他片段没有输出。

是的,视图有ID。

这不奇怪吗?^^

我希望你能指出我正确的方向。

编辑: 我忘记了切入点......

  @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_appointment);

    setupToolbar();

    AppointmentPagerAdapter adapter=new AppointmentPagerAdapter(getSupportFragmentManager());
    LockableViewPager pager= (LockableViewPager) findViewById(R.id.act_appointment_pager);
    pager.setAdapter(adapter);

}

1 个答案:

答案 0 :(得分:1)

最后我想出来了,也许有人想知道如何。

设置正确。 如果片段没有滚动内容,则方法canScroll(View v, boolean checkV, int dx, int x, int y)将不会触发。

我添加了一些滚动内容,现在可以使用了。

但是如果片段中有一个scolling内容和一个非滚动内容,该方法只会触发滚动内容。

因此,如果您在非滚动内容处滑动,则该方法将被忽略。

此外,您应该为布局中的每个视图提供一个ID。

我认为这里所说的内容没有记录,但如果我对此错了,请纠正我。