Android:MainActivity / Fragment中的ListView / GridView重叠工具栏

时间:2017-07-13 13:41:36

标签: android listview android-fragments android-activity gridview

所以我最近一直在关注this教程,以便在我的HomePage中创建一个片段ListView。由于这不起作用(据我所知?),我将以下代码实现到我的主活动中,该活动包含导航抽屉。我试图简化您的理解以及我希望在下面实现的应用顺序:

  1. 用户登录应用
  2. 用户被带到"主要活动"它通过Intent
  3. 保存导航抽屉
  4. 用户可以选择导航抽屉中的各种片段(主页,收藏夹,帮助等)< - 由于列表视图与MainActivity完全重叠,包括允许的工具栏,因此不再起作用访问导航抽屉(我想在片段中显示#34; Home") - >
  5. 我还创建了Product类来保存ListView / GridView中的Image,Title和Description方法。我还创建了ListViewAdapter和GridViewAdapter类来扩展'产品'保存在ListView / GridView中。

    MainActivity.java:

    import android.content.SharedPreferences;
    import android.os.Bundle;
    import android.support.v4.app.FragmentTransaction;
    import android.support.design.widget.NavigationView;
    import android.support.v4.view.GravityCompat;
    import android.support.v4.widget.DrawerLayout;
    import android.support.v7.app.ActionBarDrawerToggle;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.ViewStub;
    import android.widget.AdapterView;
    import android.widget.GridView;
    import android.widget.ListView;
    import android.widget.Toast;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity
            implements NavigationView.OnNavigationItemSelectedListener {
    
        private ViewStub stubGrid;
        private ViewStub stubList;
        private ListView listView;
        private GridView gridView;
        private ListViewAdapter listViewAdapter;
        private GridViewAdapter gridViewAdapter;
        private List<Product> productList;
        private int currentViewMode = 0;
    
        static final int VIEW_MODE_LISTVIEW = 0;
        static final int VIEW_MODE_GRIDVIEW = 1;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
    
            DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
            ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                    this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
            drawer.setDrawerListener(toggle);
            toggle.syncState();
    
            NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
            navigationView.setNavigationItemSelectedListener(this);
    
            stubList = (ViewStub) findViewById(R.id.stub_list);
            stubGrid = (ViewStub) findViewById(R.id.stub_grid);
    
            // Inflate ViewStub before we get view
            stubList.inflate();
            stubGrid.inflate();
    
            listView = (ListView) findViewById(R.id.myListView);
            gridView = (GridView) findViewById(R.id.myGridView);
    
            // Get list of products
            getProductList();
    
            // Get current view mode in shared preferences
            SharedPreferences sharedPreferences = getSharedPreferences("View Mode", MODE_PRIVATE);
            currentViewMode = sharedPreferences.getInt("currentViewMode", VIEW_MODE_LISTVIEW); // Default view is ListView
    
            // Register item click
            //listView.setOnItemClickListener(onItemClick);
            //gridView.setOnItemClickListener(onItemClick);
    
            switchView();
        }
    
        private void switchView() {
            if (VIEW_MODE_LISTVIEW == currentViewMode) {
                // Display ListView
                stubList.setVisibility(View.VISIBLE);
                // Hide GridView
                stubGrid.setVisibility(View.GONE);
            } else {
                // Hide ListView
                stubList.setVisibility(View.GONE);
                // Display GridView
                stubGrid.setVisibility(View.VISIBLE);
            }
    
            setAdapters();
    
        }
    
        private void setAdapters() {
            if (VIEW_MODE_LISTVIEW == currentViewMode) {
                listViewAdapter = new ListViewAdapter(this, R.layout.list_item, productList);
                listView.setAdapter(listViewAdapter);
            } else {
                gridViewAdapter = new GridViewAdapter(this, R.layout.grid_item, productList);
                gridView.setAdapter(gridViewAdapter);
            }
        }
    
        @Override
        public void onBackPressed() {
            DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
            if (drawer.isDrawerOpen(GravityCompat.START)) {
                drawer.closeDrawer(GravityCompat.START);
            } else {
                super.onBackPressed();
            }
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
                case R.id.item_menu_1:
                    if (VIEW_MODE_LISTVIEW == currentViewMode) {
                        currentViewMode = VIEW_MODE_GRIDVIEW;
                    } else {
                        currentViewMode = VIEW_MODE_LISTVIEW;
                    }
                    // Switch view
                    switchView();
                    // Save view mode in share preferences
                    SharedPreferences sharePreferences = getSharedPreferences("ViewMode", MODE_PRIVATE);
                    SharedPreferences.Editor editor = sharePreferences.edit();
                    editor.putInt("currentViewMode", currentViewMode);
                    editor.commit();
    
                    break;
            }
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            int id = item.getItemId();
    
            //noinspection SimplifiableIfStatement
            /*
            if (id == R.id.action_settings) {
                return true;
            }
            */
    
            return super.onOptionsItemSelected(item);
        }
    
        @SuppressWarnings("StatementWithEmptyBody")
        @Override
        public boolean onNavigationItemSelected(MenuItem item) {
            // Handle navigation view item clicks here.
            int id = item.getItemId();
    
            if (id == R.id.first_fragment) {
                setTitle("Home");
                FirstFragment fragment = new FirstFragment();
                FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                fragmentTransaction.replace(R.id.frame, fragment, "fragment1");
                fragmentTransaction.commit();
            } else if (id == R.id.second_fragment) {
                setTitle("Favourites");
                SecondFragment fragment = new SecondFragment();
                FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                fragmentTransaction.replace(R.id.frame, fragment, "fragment2");
                fragmentTransaction.commit();
            } else if (id == R.id.third_fragment) {
                setTitle("Account");
                ThirdFragment fragment = new ThirdFragment();
                FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                fragmentTransaction.replace(R.id.frame, fragment, "fragment3");
                fragmentTransaction.commit();
            } else if (id == R.id.fourth_fragment) {
                setTitle("Help & Feedback");
                FourthFragment fragment = new FourthFragment();
                FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                fragmentTransaction.replace(R.id.frame, fragment, "fragment4");
                fragmentTransaction.commit();
            }
    
            DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
            drawer.closeDrawer(GravityCompat.START);
            return true;
        }
    
        public List<Product> getProductList() {
            // Pseudo code to get product, replace your code to get product here
            productList = new ArrayList<>();
            productList.add(new Product(R.drawable.nightclub, "Title 1", "This is description 1"));
            productList.add(new Product(R.drawable.nightclub, "Title 2", "This is description 2"));
            productList.add(new Product(R.drawable.nightclub, "Title 3", "This is description 3"));
            productList.add(new Product(R.drawable.nightclub, "Title 4", "This is description 4"));
            productList.add(new Product(R.drawable.nightclub, "Title 5", "This is description 5"));
            productList.add(new Product(R.drawable.nightclub, "Title 6", "This is description 6"));
            productList.add(new Product(R.drawable.nightclub, "Title 7", "This is description 7"));
            productList.add(new Product(R.drawable.nightclub, "Title 8", "This is description 8"));
            productList.add(new Product(R.drawable.nightclub, "Title 9", "This is description 9"));
            productList.add(new Product(R.drawable.nightclub, "Title 10", "This is description 10"));
    
            return productList;
        }
    
        /*
        AdapterView.OnItemClickListener onItemClick = new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                // Do something when u ser clicks an item
                Toast.makeText(getApplicationContext(), productList.get(position).getTitle() + " - " + productList.get(position).getDescription(), Toast.LENGTH_SHORT).show();
            }
        };*/
    }
    

    Content_Main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        tools:context="com.example.michael.whatsupldn.MainActivity"
        tools:showIn="@layout/app_bar_main">
    
        <FrameLayout
            android:id="@+id/frame"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:alpha="200"/>
    </LinearLayout>
    

    activity_main.xml中

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.v4.widget.DrawerLayoutx mlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        tools:openDrawer="start">
    
        <include
            layout="@layout/app_bar_main"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    
        <android.support.design.widget.NavigationView
            android:id="@+id/nav_view"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:fitsSystemWindows="true"
            app:headerLayout="@layout/nav_header_main"
            app:menu="@menu/activity_main_drawer"/>
    
        <ViewStub
            android:id="@+id/stub_list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:inflatedId="@+id/showlayout"
            android:layout="@layout/my_listview"/>
    
        <ViewStub
            android:id="@+id/stub_grid"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:inflatedId="@+id/showlayout"
            android:layout="@layout/my_gridview"/>
    
    </android.support.v4.widget.DrawerLayout>
    

    app_bar_main.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.example.michael.whatsupldn.MainActivity">
    
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="centerCrop"
            android:src="@drawable/london_skyline_dark"
            android:layout_alignParentTop="true"
            android:id="@+id/imageView"
            android:contentDescription="@string/london_skyline"/>
    
        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.AppBarOverlay">
    
            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:popupTheme="@style/AppTheme.PopupOverlay" />
    
        </android.support.design.widget.AppBarLayout>
    
        <include layout="@layout/content_main" />
    
    </android.support.design.widget.CoordinatorLayout>
    

    MainActivity的模拟器输出:

    预期产出: enter image description here

    带有碎片的导航抽屉:(我想将列表视图插入&#39; Home&#39;片段 enter image description here

    非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

首先,DrawerLayout最多可以保留two个子视图。 First视图包含屏幕的主contentyour primary layout when the drawer is hidden),Second视图包含navigation drawer的内容。

请参阅Documentation

<强> SOLUTION:

1。ViewStub布局移除ListViewGridView的{​​{1}}。

activity_Main

2。而不是// activity_Main.xml <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayoutx mlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:openDrawer="start"> <include layout="@layout/app_bar_main" android:layout_width="match_parent" android:layout_height="match_parent" /> <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" app:headerLayout="@layout/nav_header_main" app:menu="@menu/activity_main_drawer"/> </android.support.v4.widget.DrawerLayout> ListView,只使用GridViewRecyclerView不同的LayoutManager。使用LinearLayoutManager表示列表,GridLayoutManager表示网格。假设您使用FirstFragment作为HomeFragment。在FirstFragment布局XML中,添加RecyclerView以显示列表或网格。

// first_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_height="match_parent"
    android:layout_width="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clipToPadding="false" />

</RelativeLayout>

3。FirstFragment课程中,添加两个布局管理器(LinearLayoutManagerGridLayoutManager)。

  

如果您想展示List,请使用LinearLayoutManager和      Grid GridLayoutManagerRecyclerView一起使用toggleListGrid()。通过调用方法FirstFragment切换视图。

更新您的//FirstFragment.java ......... ............... RecyclerView mRecyclerView; RecyclerView.LayoutManager mGridLayoutManager; RecyclerView.LayoutManager mLinearLayoutManager; boolean isList = false; // By default list will be shown @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Required for option menu setHasOptionsMenu(true); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.first_fragment, null); //REFERENCE mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view); // Layout manager mGridLayoutManager = new GridLayoutManager(getActivity(), 2); mLinearLayoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false); // Set layout manager toggleListGrid(); // Set adapter to RecyclerView ............... .................... return rootView; } public void toggleListGrid() { isList = !isList; if(isList) mRecyclerView.setLayoutManager(mLinearLayoutManager); else mRecyclerView.setLayoutManager(mGridLayoutManager); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // Inflate the menu; this adds items to the action bar if it is present. inflater.inflate(R.menu.main, menu); super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) { case R.id.item_menu_1: { // Change view toggleListGrid(); return true; } default: return super.onOptionsItemSelected(item); } } ......... ................... ,如下所示:

RecyclerView.Adapter

4。添加RecyclerView以填充BlogController上的数据。

这是一个关于RecyclerView的好教程: Android NavigationView – Fragments With RecyclerView

希望这会有所帮助〜

答案 1 :(得分:0)

您应该在app:layout_behavior="@string/appbar_scrolling_view_behavior"stub_list ViewStub xml声明中添加这行代码stub_list,该声明应将其直接放置在appbar下方;您可以在 CoordinatorLayout和应用栏部分下阅读有关here的更多信息