2013-08-26 2 views
0

я столкнулся следующая проблема:ListView не заполняя его родитель

Я пытаюсь осуществить навигацию ящик с роликами, как один в приложение Gmail и одно другое приложение:

VK

Gmail

Как вы можете видеть, я Осроена, что нет делителей в конце каждого списка

SO я взял реализацию с подрубриками из стека 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> 

Но по какой-то причине, ListView не заполняет весь экран: bad result

Я пробовал много комбинаций xml_atributes (т. match_parent, wrap_content, fill_parent), и единственное, что работает, - это когда вы вручную устанавливаете ListView layout_height (т. е. layout_height = "625dp").

Вопрос в следующем: Что я делаю неправильно? Как я могу достичь желаемого результата? Почему listview не расширяется?

ответ

2

Прежде всего, я думаю, что вы совершаете переполнения, добавляя ListView к ListView. Это в значительной степени обезвреживает цель использования ListView с многоразовыми видами в первую очередь и делает ваш макет довольно сложным, поскольку вам нужно предоставить множество адаптеров и много файлов xml-layout.

Возьмем одну вещь прямо - NavigationDrawer может содержать любое представление, которое вам нравится не только ListView.

Если ваши данные не соответствуют концепции one-ListView, возможно, вы не должны использовать ее вообще? Придерживайтесь LinearLayouts. Если у вас есть динамические данные, добавьте его методом addView в ваш суб-LinearLayout (разделы). Если у вас есть статическая навигация, тогда объявляйте непосредственно в XML-файле макета - вы получаете возможность просмотреть макет без компиляции всего проекта.

Если вы хотите разместить много вещей в NavigationDrawer, возможно, вам стоит переосмыслить всю концепцию приложения? Навигация в основном станет содержанием, поэтому он не должен находиться в NavigationDrawer.

Надеюсь, что это поможет, regs.

+0

Это очень помогло! :) Я изменил свое приложение, поэтому в списке нет больше списка. Большое спасибо ! – tvoloshyn

0

Я знаю, что вы уже приняли ответ, но он не охватывает первую часть вашего вопроса. А именно, как избавиться от делителя перед заголовком.

Во-первых, не уверен, как вы внедрили свой ListView так, чтобы он обрабатывал различные типы элементов (например, заголовки и регулярные строки), поэтому несколько ссылок на тех, кто борется с этим. ListView Headers answer был наиболее полезен для меня, но я также рассмотрел еще два вопроса: Navigation Drawer With Headers Sections и Section Headers In Navigation Drawer Listview.

Во-вторых, важно правильно использовать ListView делитель, т.е. не использовать фоновый элемент на ваших элементов строк, чтобы иметь границу в нижней части, но использовать атрибуты android:divider и android:dividerHeight. Если вы хотите настроить внешний вид read the documentation.

Далее я заметил, что разделитель не отображается между обычным товаром и заголовком по умолчанию (именно то, что вы наблюдали и указывали на свои фотографии). Тем не менее, я не нашел эту функцию в любом месте.

Наконец, в конце есть сложный бит. Когда за регулярным элементом не следует заголовок, за ним следует разделитель. Вы должны добавить android:footerDividersEnabled="false" в ваш ListView.

PS. Ваша проблема больше связана с ListView, чем с навигационным ящиком - если вы ищете первый, вы обязательно получите больше результатов.

Смежные вопросы