2013-08-26 216 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比導航抽屜更相關 - 如果您搜索前者,您肯定會獲得更多結果。