0

我遇到了以下问题:

我正在尝试实现一个导航抽屉,其中包含 gmail 应用程序中的子标题和另一个应用程序中的子标题:

VK

邮箱

如您所见,我已经强调每个列表的末尾没有分隔符

所以我采用了来自堆栈溢出的子标题的实现,我最终得到了这样的结果:

我的应用 如您所知,导航抽屉使用列表视图,之所以有分隔符,是因为副标题也是一个列表项,因此将选项 footerDividerEnabled 设置为 false 并不能解决问题。

所以我的下一个实现是把包含子标题和列表视图的视图放在导航抽屉的列表视图中。

这是我的 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")。

所以问题是:我做错了什么?我怎样才能达到期望的结果?为什么列表视图不扩展?

4

2 回答 2

2

ListView首先,我认为您在添加ListView. 它几乎首先破坏了使用ListView可重用视图的目的,并使您的布局非常复杂,因为您必须提供许多适配器和许多 xml 布局文件。

让我们弄清楚一件事 -NavigationDrawer不仅可以包含您喜欢的任何视图ListView

如果您的数据不适合 one-ListView 概念,也许您根本不应该使用它?坚持LinearLayouts。如果您有一些动态数据,则通过addView方法将其添加到您的子线性布局(部分)。如果您有静态导航,则直接在布局 xml 文件中声明 - 您有机会在不编译整个项目的情况下预览布局。

如果你想把很多项目放到 NavigationDrawer 中,也许你应该重新考虑应用程序的整个概念?导航基本上将成为内容,因此它不应该在NavigationDrawer.

希望它有所帮助,regs。

于 2013-08-26T12:04:08.030 回答
0

我知道你已经接受了一个答案,但它不包括你问题的第一部分。即,如何去掉标题前的分隔线。

首先,不确定您是如何实现您的ListView,以便它处理不同类型的项目(即标题和常规行),因此为那些正在努力解决的人提供一些参考。ListView Headers的回答对我最有帮助,但我也看了另外两个问题:Navigation Drawer With Headers SectionsSection Headers In Navigation Drawer Listview

其次,正确使用分隔线很重要ListView,即不要在行项目上使用背景元素,以便在底部有边框,而是使用android:dividerandandroid:dividerHeight属性。如果您想自定义其外观,请阅读文档

接下来,我注意到默认情况下,常规项目和标题之间没有显示分隔线(正是您在图片中观察到并指向的内容)。不过,我还没有在任何地方发现此功能。

最后,最后有一个棘手的地方。当常规项目后面没有标题时,后面会跟一个分隔符。您需要添加android:footerDividersEnabled="false"到您的ListView.

PS。您的问题与导航抽屉有关,而ListView不是与导航抽屉有关 - 如果您搜索前一个,您肯定会得到更多结果。

于 2013-09-06T08:37:18.120 回答