在一个活动中实现SwipeView,SwipeRefreshlayout和Navigation Drawer

时间:2014-10-02 19:46:37

标签: android android-layout android-fragments

正如标题所示,我正在尝试同时实现所有这些功能。最初我有一个功能齐全的side-nav,带有SwipeRefreshLayout,它包含一个列表视图(使用自定义列表适配器)。然后我在SwipeRefreshLayout中添加了一个ViewPager,一切都很有用......除了我刷卡列表视图时有时候不会出现在新的'标签'中。大多数时候我看到第一页和列表视图,我向右滑动,没有,我向右滑动,什么都没有,我刷了,列表视图,我刷到开头,没什么。

我应该补充说,一切都是动态的,导航项是从我的服务器接收的(也是页数),每个页面都有一个带有不同列表项的自定义列表适配器。所有这些动态信息似乎都会在每页滑动等时正确接收和调整。

现在代码!

嵌入了swiperefreshlayout和view pager的抽屉布局。 “drawer.xml”

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"> 

    <android.support.v4.widget.SwipeRefreshLayout       xmlns:android="http://schemas.android.com/apk/res/android"    
   android:id="@+id/swipe_container"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical" >
    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

</android.support.v4.widget.SwipeRefreshLayout>
    <!-- As the main content view, the view below consumes the entire
         space available using match_parent in both dimensions. -->
     <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        />


    <!-- android:layout_gravity="start" tells DrawerLayout to treat
         this as a sliding drawer on the left side for left-to-right
         languages and on the right side for right-to-left languages.
         The drawer is given a fixed width in dp and extends the full height of
         the container. A solid background is used for contrast
         with the content view. -->
     <ListView
        android:id="@+id/left_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@color/grey_lighter"
        android:dividerHeight="1dp"
        android:background="#FFFFFF"/>
</android.support.v4.widget.DrawerLayout>

Listview,其中包含在活动“dashboard.xml”中动态创建的自定义列表项:

<?xml version="1.0" encoding="utf-8"?>


    <ListView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/LV_dashboard"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView1"
        android:layout_alignRight="@+id/textView1"
        android:layout_below="@+id/textView1" >

    </ListView>

现在进行片段活动:

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = this.getApplicationContext();
        navItems = new ArrayList<String>();
        this.setContentView(R.layout.drawer); 
        mMerchantIds = Session.get().getMerchID(); //array retrieved from cache used for api

        mCustomerPagerAdapter = new CustomerPagerAdapter(getSupportFragmentManager());


        // Set up the ViewPager, attaching the adapter.
        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mCustomerPagerAdapter);

        mTitle = mDrawerTitle = getTitle();

        mNavTitles = getResources().getStringArray(R.array.nav_array); //I realize this isn't dynamic, I haven't gotten around to that just yet.

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.left_drawer);
        connection = new WiselyRequest();

        // set a custom shadow that overlays the main content when the drawer opens
        mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
        // set up the drawer's list view with items and click listener
        mDrawerList.setAdapter(new ArrayAdapter<String>(this,
                R.layout.nav_item, mNavTitles));
        mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

        // enable ActionBar app icon to behave as action to toggle nav drawer
        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

        // ActionBarDrawerToggle ties together the the proper interactions
        // between the sliding drawer and the action bar app icon
        mDrawerToggle = new ActionBarDrawerToggle(
                this,                  /* host Activity */
                mDrawerLayout,         /* DrawerLayout object */
                R.drawable.ic_drawer,  /* nav drawer image to replace 'Up' caret */
                R.string.drawer_open,  /* "open drawer" description for accessibility */
                R.string.drawer_close  /* "close drawer" description for accessibility */
                ) {
            public void onDrawerClosed(View view) {
                getActionBar().setTitle(mTitle);
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }

            public void onDrawerOpened(View drawerView) {
                getActionBar().setTitle(mDrawerTitle);
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);

        if (savedInstanceState == null) {
            selectItem(0);
        }    
    }

这分为两部分,我们将从抽屉开始:

private class DrawerItemClickListener implements ListView.OnItemClickListener {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                selectItem(position);
            }
        }

        private void selectItem(int position) {
            // update the main content by replacing fragments (this is not what the pager does)
            Fragment fragment = null;

            fragment = new CustomerFragment();
            Bundle args = new Bundle();
            args.putString(KEY_MERCHANT_ID, (mMerchantIds.get(position)));
            fragment.setArguments(args);
            FragmentManager fragmentManager = getSupportFragmentManager();
            fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();


            // update selected item and title, then close the drawer
            mDrawerList.setItemChecked(position, true);

            setTitle(mNavTitles[position]);



            mDrawerLayout.closeDrawer(mDrawerList);

        }

以下是查看分页器:

public class CustomerPagerAdapter extends FragmentPagerAdapter {

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

            @Override
            public Fragment getItem(int i) {
                Fragment fragment = new CustomerFragment();
                Bundle args = new Bundle();
                Log.d("Wisely", "merchants: "+mMerchantIds.get(i));
                args.putString(KEY_MERCHANT_ID, (mMerchantIds.get(i))); // Our object is just an integer :-P
                fragment.setArguments(args);
                return fragment;
            }

            @Override
            public int getCount() {
                // For this contrived example, we have a 100-object collection.
                return mMerchantIds.size(); //equal to the number of merchantss (that many customer objects) 
            }

            @Override
            public CharSequence getPageTitle(int position) {
                return "OBJECT " + (position + 1);
            }
        }

以下是抽屉和寻呼机正在使用的客户片段以及处理刷新的位置:

 public class CustomerFragment extends Fragment implements OnRefreshListener {
                private View rootView;
                SwipeRefreshLayout swipeLayout; 
                public CustomerFragment() {

                }

                @Override
                public View onCreateView(LayoutInflater inflater, ViewGroup container,
                    Bundle savedInstanceState) {
                    Bundle args = getArguments();
                    String merchantID = args.getString(KEY_MERCHANT_ID);
                    if(connection.checkConnectivity(getApplicationContext())){
                        getRecentCustomers(API.getRecentCustomers()+"?merchant_id="+merchantID); //api call works totally fine, and correctly sets up the adapter
                    }
                    else
                        Toast.makeText(DashboardActivity.this, "Need to be connected to the internet!", 4000).show();
                    rootView = inflater.inflate(R.layout.dashboard, container, false);//inflates the dashboard
                    swipeLayout = (SwipeRefreshLayout)findViewById(R.id.swipe_container);
                    swipeLayout.setOnRefreshListener(this);
                     swipeLayout.setColorScheme(android.R.color.holo_blue_bright, android.R.color.holo_green_light, android.R.color.holo_orange_light, android.R.color.holo_red_light);
                    registerClickCallback(rootView);

                    return rootView;    
                }

                @Override
                public void onRefresh() {
                    if(connection.checkConnectivity(getApplicationContext()))
                        reloadActivity(); //literally turns the activity on and off without animation
                    else
                        Toast.makeText(DashboardActivity.this, "Need to be connected to the internet!", 4000).show();
                }

我认为问题出现在我的布局中,而不是列表适配器或客户片段中似乎工作正常(每次我刷到新页面时都会调用api并将正确的数据放入列表视图中。我只是看不到它。我也意识到导航器不是动态的,但我现在更大的问题是能够在页面上浏览多个列表视图。当我更改我的customerFragment以使用一个简单的文本视图在它的数字,似乎工作正常,除了第一页永远不会消失,其他页面只是堆积在它上面(我认为这与抽屉中的framelayout有关,但删除它会破坏代码,因为我的唠叨抽屉依赖它)。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我认为,你必须创建自己的类来扩展DrawerLayout或ViewPager。 在课程内部,您必须覆盖方法:

onInterceptTouchEvent() - 在这里你评估TouchEvent并返回true,如果你正在拦截它(不传递给子视图)

你必须根据你想要达到的目标来调整拦截条件。

指南在这里: http://developer.android.com/training/gestures/viewgroup.html