Listview没有填写其父级

时间:2013-08-26 11:19:14

标签: android listview navigation-drawer

我遇到了以下问题:

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

VK

Gmail

正如您所看到的,我强调每个列表末尾没有分隔符

所以我已经采用了堆栈overlfow的副标题实现,我最终得到了类似的东西:

MyApp 如您所知,导航抽屉使用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没有填满整个屏幕: bad result

我尝试了很多xml_atributes的组合(即match_parent,wrap_content,fill_parent),唯一有效的是你手动设置ListView layout_height(即layout_height =“625dp”)。

所以问题是: 我做错了什么?我怎样才能达到预期效果?为什么listview没有扩展?

2 个答案:

答案 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 SectionsSection Headers In Navigation Drawer Listview

其次,正确使用ListView分隔符非常重要,即不要在行项目上使用背景元素,以便在底部使用边框,但使用android:divider和{{ 1}}属性。如果要自定义其外观read the documentation

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

最后,最后有一个棘手的问题。如果常规项目后面没有标题,则后面会跟一个分隔符。您需要将android:dividerHeight添加到android:footerDividersEnabled="false"

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