2014-05-01 12 views
7

Obecnie piszę aplikację na Androida, która używa ListView z nagłówkami. Działa dobrze, ale nie tak jak chcę. Każda pozycja w ListView ma separator 1-2px na górze i na dole. Podobnie jak nagłówek - i na tym polega problem. Nie wygląda bardzo ładny ...Nagłówki ListView bez separatorów pozycji na liście

Ugly separators between items and headers

Ciekawostką jest to, że aplikacje systemowe (takie jak ustawienia, na przykład) nie ma takiego problemu.

Settings app

Oto mój przykład adapter:

setListAdapter(new BaseAdapter() { 
    @Override 
    public int getCount() { 
     return 10; 
    } 

    @Override 
    public Object getItem(int i) { 
     return i; 
    } 

    @Override 
    public long getItemId(int i) { 
     return i; 
    } 

    @Override 
    public View getView(int i, View view, ViewGroup viewGroup) { 
     View v = ((LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE)) 
       .inflate(i % 3 == 0 ? R.layout.list_header : android.R.layout.simple_list_item_1, viewGroup, false); 
     ((TextView)v.findViewById(android.R.id.text1)).setText("test"); 
     return v; 
    } 
}); 

A lista plików układ nagłówka:

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Hello, World" 
    style="?android:attr/listSeparatorTextViewStyle"> 

</TextView> 

Więc pytanie brzmi: jak się pozbyć separatorów poz między nagłówkami i zwykłe przedmioty, takie jak na przykład aplikacja Ustawienia?

EDYCJA: Po przeczytaniu odpowiedzi, chcę wyjaśnić jedną rzecz. Robię , a nie chcę całkowicie usunąć separatory. Chcę je usunąć tylko między elementami nagłówka i zwykłymi przedmiotami. Nie wystarczają mi również półśrodki takie jak "całkowite usunięcie separatorów i dodanie ich do niektórych elementów".

+1

Można zdecydowanie się, że wygląd za pomocą API preferencji i tworzenia 'PreferenceCategory' dla każdego nagłówka - Zakładam, że to, co robi aplikacja Ustawienia. – Ellis

+0

@ Eliis tak, masz rację - chociaż istnieją inne aplikacje systemowe, które zachowują się w ten sposób. Na przykład aplikacja Osoby - nie sądzę, aby korzystała z interfejsu API Preferencji w celu uzyskania takiego wyglądu. :) – m4tx

+0

Dobra uwaga, i nie wiem, jak mogą to zrobić. Być może wyciągnęli kod z interfejsów API Preferencji. – Ellis

Odpowiedz

-1

Usuń styl ustawionej na nagłówku TextView

stworzyć swój własny własny styl z wymaganego dzielnika i ustawić go TextView

<style name="CustomListSeperatorTextViewStyle" parent="Widget.TextView.ListSeparator"> 
<item name="android:background">@drawable/your_own_here</item> 

+0

To nie działa dla mnie. Zmienia tylko wygląd elementu listy, ale nie usuwa separatorów. – m4tx

-1

Moja Rezerwacja jest ze względu na styl masz ustaw z widokiem tekstowym, po prostu usuń styl nadziei, że to zadziała.

+1

Czy chodzi ci o usunięcie części "style ="? Android: attr/listSeparatorTextViewStyle ""? To nie działa (i nie widzę powodu, dlaczego powinien, ponieważ separatory są dodawane przez samą ListView, a nie przez elementy). – m4tx

+0

Spróbuj jeszcze raz. Sprawdź czy masz coś takiego w swoim xml, gdzie masz listę listView android: dividerHeight = "2.0dp" spróbuj ją usunąć. – Asheesh

-1

Właśnie znalazłem te parametry, które zdają się być to, czego potrzeba, można spróbować dodać je w ListView:

android:headerDividersEnabled="false" 
android:footerDividersEnabled="false" 

Dokumentacja jest dostępna here i pokazuje:

Przy ustawieniu false, ListView nie rysuje dzielnika po każdym widoku nagłówka. Wartością domyślną jest true.

+0

To tak naprawdę nie odpowiada na moje pytanie. Zaktualizowałem to teraz. – m4tx

+0

@ m4tx Również zaktualizowałem swoją odpowiedź. –

+0

Mimo to nadal nie odpowiada na moje pytanie. Te parametry są używane z widokami nagłówka i stopki, które są tylko widokami umieszczonymi na górze lub na dole listy ListView - ale naprawdę potrzebuję umieścić nagłówki sekcji faktycznie w środku ListView. – m4tx

0

Wygląda na to, że trzeba użyć niestandardowego widoku elementów dla dzielników i małego obejścia. Pozwól mi wyjaśnić, jak sobie z tym poradzić:

  • Nie używaj domyślnych dzielników, remove it.
  • Utwórz niestandardowy układ z numerem View, który będzie subline dla nagłówków.
  • Utwórz niestandardowy układ z numerem View, aby podzielić element na elementy.

Następnie, dwa rodzaje przekładek będą sklejane, aby wykonać tylko jedną podlinię dla części nagłówkowej, więc dzielniki powinny mieć taką samą wysokość, aby uzyskać dobrą podlinię. Pozwoli to uniknąć podziału między sekcje nagłówka, ale zachowując podział na liście elementów.

W związku z tym pozwól mi pokazać jakiś kod, aby to osiągnąć. Po pierwsze, nie zapomnij, aby uniknąć domyślnego dzielnik na ListView:

<ListView 
    android:id="@+id/listview" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:divider="@null" 
    android:dividerHeight="0dp"/> 

Tworzenie się układ artykuł z dzielnika w górę zestaw do 1dp (lub cokolwiek):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <!-- this is the divider for items --> 
    <View 
     android:layout_width="match_parent" 
     android:layout_height="1dp" 
     android:background="@android:color/darker_gray"/> 

    <!-- and the rest of item's content in another ViewGroup --> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:padding="10dp" 
     android:orientation="horizontal"> 

     <ImageView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:src="@mipmap/ic_launcher"/> 

     <TextView 
      android:id="@+id/item_text" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:paddingLeft="15dp" 
      android:textColor="@android:color/white"/> 
    </LinearLayout> 
</LinearLayout> 

Wreszcie układ nagłówka z dzielnikiem u dołu (o tej samej wysokości co dzielnik elementu):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <TextView 
     android:id="@+id/item_header" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:padding="10dp" 
     style="?android:attr/listSeparatorTextViewStyle"/> 

    <!-- this is the ("half-")divider for header section --> 
    <View 
     android:layout_width="match_parent" 
     android:layout_height="1dp" 
     android:background="@android:color/darker_gray"/> 
    <!-- this view above will be merged with item's dividers --> 
</LinearLayout> 

I daje to rezultat:

Powiązane problemy