我遇到了以下问题:
我正在尝试使用gmail应用程序和另一个应用程序中的子标题实现导航抽屉:
正如您所看到的,我强调每个列表末尾没有分隔符
所以我已经采用了堆栈overlfow的副标题实现,我最终得到了类似的东西:
如您所知,导航抽屉使用listview以及divider的原因,因为subheading也是一个列表项,因此将footerDividerEnabled设置为false并不能解决问题。
所以我的下一个实现是将View替换为subheading和listview,然后添加到navigation-drawer的listview。
以下是我的MainActivity源代码:
package com.myphun.radio;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import com.example.androidradio.R;
import com.myphun.ui.adapters.ListViewAdapter;
import com.myphun.ui.components.SlidingMenuLayout;
public class MainActivity extends ActionBarActivity
{
private SlidingMenuLayout mSlidingMenuLayout;
private ListView leftDrawerList;
private ListViewAdapter mAdapter;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSlidingMenuLayout = (SlidingMenuLayout) findViewById(R.id.main_sliding_menu);
leftDrawerList = (ListView) findViewById(R.id.left_drawer_list);
ViewArrayAdapter viewArrayAdapter = new ViewArrayAdapter(this);
View generic_drawer_view = View.inflate(this, R.layout.sliding_menu_general_section_layout, null);
viewArrayAdapter.add(generic_drawer_view);
ListView genericCategoriesListView = (ListView) generic_drawer_view.findViewById(R.id.general_drawer_list);
mAdapter = new ListViewAdapter(this);
mAdapter.addItem("Mercury", R.drawable.mercury);
mAdapter.addItem("Venus", R.drawable.venus);
mAdapter.addItem("Earth", R.drawable.earth);
mAdapter.addItem("Mars", R.drawable.mars);
mAdapter.addItem("Neptune", R.drawable.neptune);
mAdapter.addItem("Saturn", R.drawable.saturn);
mAdapter.addItem("Uranus", R.drawable.uranus);
mAdapter.addItem("Jupiter", R.drawable.jupiter);
genericCategoriesListView.setAdapter(mAdapter);
leftDrawerList.setAdapter(viewArrayAdapter);
}
}
class ViewArrayAdapter extends ArrayAdapter<View>
{
public ViewArrayAdapter(Context context)
{
super(context, 0, new ArrayList<View>());
}
public ViewArrayAdapter(Context context, List<View> viewsList)
{
super(context, 0, viewsList);
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
return getItem(position);
}
}
主要活动XML:
<com.myphun.ui.components.SlidingMenuLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_sliding_menu"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<!-- The main content view -->
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/textView122"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge" />
</FrameLayout>
<!-- The navigation drawer -->
<ListView
android:id="@+id/left_drawer_list"
android:layout_width="275dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#444444"
android:choiceMode="singleChoice"
android:divider="#555555"
android:dividerHeight="0dp"
android:footerDividersEnabled="false"
android:headerDividersEnabled="false" />
</com.myphun.ui.components.SlidingMenuLayout>
自定义视图:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/general_drawer_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/general_drawer_header"
android:layout_width="match_parent"
android:layout_height="62dp"
android:background="@drawable/list_selector"
android:gravity="bottom"
android:paddingBottom="5dp"
android:paddingRight="16dp"
android:text="Planets"
android:textColor="#FFFFFF"
android:textSize="25sp" />
<View
android:layout_width="fill_parent"
android:layout_height="1dp"
android:background="#ffffff" />
<ListView
android:id="@+id/general_drawer_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#EE444444"
android:choiceMode="singleChoice"
android:divider="#555555"
android:dividerHeight="1dp"
android:footerDividersEnabled="false"
android:headerDividersEnabled="false" />
</LinearLayout>
但由于某种原因,listview没有填满整个屏幕:
我尝试了很多xml_atributes的组合(即match_parent,wrap_content,fill_parent),唯一有效的是你手动设置ListView layout_height(即layout_height =“625dp”)。
所以问题是: 我做错了什么?我怎样才能达到预期效果?为什么listview没有扩展?
答案 0 :(得分:2)
首先,我认为你提出了一个过度杀手,将ListView
添加到ListView
。
它几乎违背了使用ListView
首先使用可重用视图的目的,并使你的布局变得非常复杂,因为你必须提供许多适配器和许多xml布局文件。
让我们直截了当 - NavigationDrawer
不仅可以包含您喜欢的任何视图ListView
。
如果您的数据不适合一个ListView概念,您可能根本不应该使用它?坚持LinearLayouts
。如果您有一些动态数据,请按addView
方法将其添加到子LinearLayout(部分)。如果你有静态导航然后直接在布局xml文件中声明 - 你有机会预览布局而不编译整个项目。
如果你想把很多项目都放到NavigationDrawer上,你应该重新思考应用程序的整个概念吗?导航基本上将成为内容,因此它不应该在NavigationDrawer
。
希望它有所帮助,regs。
答案 1 :(得分:0)
我知道您已经接受了答案,但它不包括您问题的第一部分。也就是说,如何在标题之前摆脱分隔符。
首先,不确定你是如何实现ListView
的,以便它处理不同类型的项目(即标题和常规行),以便为那些正在努力解决的问题提供一些参考。 ListView Headers answer对我最有帮助,但我还看了另外两个问题:Navigation Drawer With Headers Sections和Section Headers In Navigation Drawer Listview。
其次,正确使用ListView
分隔符非常重要,即不要在行项目上使用背景元素,以便在底部使用边框,但使用android:divider
和{{ 1}}属性。如果要自定义其外观read the documentation。
接下来,我注意到分隔符不显示在常规项目和标题默认情况下之间(正是您在图片中观察和指向的内容)。但我没有在任何地方找到此功能。
最后,最后有一个棘手的问题。如果常规项目后面没有标题,则后面会跟一个分隔符。您需要将android:dividerHeight
添加到android:footerDividersEnabled="false"
。
PS。您的问题与ListView
相关,而不是导航抽屉 - 如果您搜索前者,您肯定会获得更多结果。