所以我最近一直在关注this教程,以便在我的HomePage中创建一个片段ListView
。由于这不起作用(据我所知?),我将以下代码实现到我的主活动中,该活动包含导航抽屉。我试图简化您的理解以及我希望在下面实现的应用顺序:
Intent
我还创建了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>
带有碎片的导航抽屉:(我想将列表视图插入&#39; Home&#39;片段
非常感谢任何帮助!
答案 0 :(得分:1)
首先,DrawerLayout
最多可以保留two
个子视图。 First
视图包含屏幕的主content
(your primary layout when the drawer is hidden
),Second
视图包含navigation drawer
的内容。
<强> SOLUTION:强>
1。从ViewStub
布局移除ListView
和GridView
的{{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
,只使用GridView
与RecyclerView
不同的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
课程中,添加两个布局管理器(LinearLayoutManager
和GridLayoutManager
)。
如果您想展示
List
,请使用LinearLayoutManager
和Grid
GridLayoutManager
与RecyclerView
一起使用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的更多信息