2013-08-26 126 views
0

我都面临着以下问题:列表视图不填充其父

我想实现一个导航抽屉像在Gmail应用程序和一个其他应用程序的副标题:

VK

Gmail

正如您所看到的,我强调在每个清单末尾没有分隔线

所以我有采取的实现与堆栈overlfow副标题,我已经结束了这样的事情:

MyApp 如你所知,导航抽屉使用ListView和之所以分频器有因为副标题也是一个列表项目如此设置选项footerDividerEnabled为false不能解决问题。

所以我的下一个实现是把View的控制子标题和列表视图,然后添加到导航 - 抽屉的列表视图。

这里是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> 

但由于某些原因,列表视图不填整个屏幕: bad result

我已经尝试过许多xml_atributes的组合(即match_parent,wrap_content,fill_parent),唯一可用的是手动设置ListView layout_height(即layout_height =“625dp”)。

所以问题是: 我做错了什么?我怎样才能达到欲望的结果?为什么listview不扩展?

回答

2

首先,我认为你正在犯一个过度杀伤,将ListView加到ListView。 它很大程度上限制了首先使用ListView和可重用视图的目的,并且使您的布局非常复杂,因为您必须提供许多适配器和许多xml布局文件。

让我们来看一件事--可以包含任何你喜欢的视图,不仅仅是ListView

如果你的数据不适合one-ListView概念,也许你不应该使用它?坚持LinearLayouts。如果您有一些动态数据,则将其按addView方法添加到您的子LinearLayout(小节)中。如果您有静态导航,然后直接在布局xml文件中声明 - 您可以在不编译整个项目的情况下预览布局。

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

希望它有帮助,regs。

+0

它已经帮了很多! :)我重新设计了我的应用程序,所以在listview中没有更多的listview!非常感谢你 ! – tvoloshyn

0

我知道你已经接受了一个答案,但它不包括你的问题的第一部分。也就是说,如何在标题前摆脱分隔线。

首先,不知道你是如何实现你的ListView,以便它处理不同类型的项目(即标题和常规行),因此为那些正在挣扎的人提供一些参考。 ListView Headers answer对我来说最有帮助,但我也看了另外两个问题:Navigation Drawer With Headers SectionsSection Headers In Navigation Drawer Listview

其次,要正确使用ListView除法,即以在底部边框但使用android:dividerandroid:dividerHeight属性上的行项目不使用背景元素是很重要的。如果你想定制其外观read the documentation

接下来,我已经注意到在默认(正是您观察到并指向您的照片中)的常规项目和标题之间不会显示分隔线。尽管如此,我还没有在任何地方找到这个功能。

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

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