Android中VerticalViewPager中片段内的ListView

时间:2014-02-23 14:41:54

标签: android android-fragments

我正在使用Jack Wharton的Android DirectionalViewPager(https://github.com/JakeWharton/Android-DirectionalViewPager)来垂直滚动片段。我有两个片段,其中一个有47deg的SwipeListView(https://github.com/47deg/android-swipelistview)。问题是当用户使用SwipeListView在片段上时,他无法滚动列表,因为因为DirectionalViewPager而暂时更改为另一个片段。

问题

  1. ¿我可以用不同的方式捕获SwipeListView的滚动事件,以便与DirectionalViewPager的滚动一起工作吗?

  2. ¿用一根手指滚动更改列表视图内部并用两根手指在DirectionalViewPager内滚动是可行的吗?如果可能,¿我该怎么做?

  3. ¿你有什么其他建议可以解决这个问题吗?

  4. 我非常感谢你的帮助。

    谢谢

    ComprasActivity.java

    package com.easyshopping.activities;
    
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentActivity;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentStatePagerAdapter;
    
    import com.directionalviewpager.DirectionalViewPager;
    import com.easyshopping.easyshopping.R;
    
    
    public class ComprasActivity extends FragmentActivity {
    
        // Fragments
        public static Fragment[] fragmentos = new Fragment[2];
    
        /**
         * The number of pages (wizard steps) to show in this demo.
         */
        private static final int NUM_PAGES = 2;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_compras);
    
            // Set up the pager
            final DirectionalViewPager pager = (DirectionalViewPager) findViewById(R.id.pager);
            pager.setAdapter(new ScreenSlidePagerAdapter(getSupportFragmentManager()));
            pager.setOrientation(DirectionalViewPager.VERTICAL);
    
        }
    
        /**
         * A simple pager adapter that represents 5 ScreenSlidePageFragment objects,
         * in sequence.
         */
        private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
    
            public ScreenSlidePagerAdapter(FragmentManager fm) {
                super(fm);
                fragmentos[1] = new ShoppingListFragment();
                fragmentos[0] = new CameraTestFragment();
    
            }
    
            @Override
            public Fragment getItem(int position) {
                return fragmentos[position];
    
            }
    
            @Override
            public int getCount() {
                return NUM_PAGES;
            }
        }
    }
    

    ShoppingListFragment.java

    package com.easyshopping.activities;
    
    import java.util.ArrayList;
    import com.easyshopping.easyshopping.R;
    import com.fortysevendeg.swipelistview.BaseSwipeListViewListener;
    import com.fortysevendeg.swipelistview.SwipeListView;
    import android.annotation.TargetApi;
    import android.os.Build;
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    public class ShoppingListFragment extends Fragment {
    
        SwipeListView myListView;
        ArrayList<String> myStringArray1;
        ShoppingListAdapter adapter;
    
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
        }
    
        @TargetApi(Build.VERSION_CODES.HONEYCOMB)
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_shoppinglist, container, false);
    
            myListView = (SwipeListView) rootView.findViewById(R.id.shoppingList);
    
            myStringArray1 = new ArrayList<String>();
            myStringArray1.add("something");
            myStringArray1.add("something");
            myStringArray1.add("something");
            myStringArray1.add("something");
            myStringArray1.add("something");
            myStringArray1.add("something");
            myStringArray1.add("something");
            myStringArray1.add("something");
            myStringArray1.add("something");
            myStringArray1.add("something");
            myStringArray1.add("something");
            myStringArray1.add("something");
            myStringArray1.add("something");
    
            adapter = new ShoppingListAdapter(getActivity(), myStringArray1);
            myListView.setAdapter(adapter);
    
            myListView.setSwipeListViewListener(new BaseSwipeListViewListener() {
                @Override
                public void onOpened(int position, boolean toRight) {
                }
    
                @Override
                public void onClosed(int position, boolean fromRight) {
                }
    
                @Override
                public void onListChanged() {
                }
    
                @Override
                public void onMove(int position, float x) {
                    Log.d("MOVE_LIST", "pos: " + position + "; float: " + x);
                }
    
                @Override
                public void onStartOpen(int position, int action, boolean right) {
                    Log.d("swipe", String.format("onStartOpen %d - action %d", position, action));
                }
    
                @Override
                public void onStartClose(int position, boolean right) {
                    Log.d("swipe", String.format("onStartClose %d", position));
                }
    
                @Override
                public void onClickFrontView(int position) {
                    Log.d("swipe", String.format("onClickFrontView %d", position));
                }
    
                @Override
                public void onClickBackView(int position) {
                    Log.d("swipe", String.format("onClickBackView %d", position));
                }
    
                @Override
                public void onDismiss(int[] reverseSortedPositions) {
                    for (int position : reverseSortedPositions) {
                        myStringArray1.remove(position);
                    }
                    adapter.notifyDataSetChanged();
                }
    
            });
    
            return rootView;
    
        }
    
    }
    

1 个答案:

答案 0 :(得分:0)

在我对您的问题发表评论之后,我调查了我链接到的一个库。事实证明this one *支持垂直ViewPager中的垂直滚动内容。对于你的问题:

  

我可以用不同的方式捕获SwipeListView的滚动事件   如何与DirectionalViewPager的滚动一起工作?

您可以继承ViewPager并覆盖onInterceptTouchEvent(),阻止ViewPager移动到下一页,直到ListView到达其最后一个子项。

  

用一根手指滚动以更改列表视图内部是可行的   并用两根手指在DirectionalViewPager内滚动?如果   那是可能的,¿我怎么能这样做?

有可能,但我强烈建议你不要这样做。考虑一下您的用户和可用性。同样,关键是使用onInterceptTouchEvent()

  

您还有其他建议可以解决这个问题吗?

是。使用不同的库,就像我之前建议的那样。 This VerticalViewPager已经为您处理了。请参阅源代码的this line以了解其工作原理。您正在使用的DirectionalViewPager已弃用。

* 这并不意味着其他库也不支持垂直滚动,这意味着我只检查了其中一个。