Android ListView başlıkları


122

Üzerinde bazı olaylar olan ListView var. Olaylar güne göre sıralanmıştır ve üzerinde her gün için tarih bulunan bir başlığa sahip olmak istiyorum ve ardından olaylar aşağıdan dinlenir.

Bu listeyi şu şekilde dolduruyorum:

ArrayList<TwoText> crs = new ArrayList<TwoText>();

crs.add(new TwoText("This will be header", event.getDate()));

for (Event event : events) {
    crs.add(new TwoText(event.getStartString() + "-" + event.getEndString(), event.getSubject()));
}

arrayAdapter = new TwoTextArrayAdapter(this, R.layout.my_list_item, crs);
lv1.setAdapter(arrayAdapter);

ve sınıfım TwoText şöyle görünüyor:

public class TwoText {
    public String classID;
    public String state;

    public TwoText(String classID, String state) {
        this.classID = classID;
        this.state = state;
    }
}

ve TwoTextArrayAdapter sınıfım şu şekilde görünür:

import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class TwoTextArrayAdapter extends ArrayAdapter<TwoText> {

    private ArrayList<TwoText> classes;
    private Activity con;
    TextView seperator;

    public TwoTextArrayAdapter(Activity context, int textViewResourceId, ArrayList<TwoText> classes) {
        super(context, textViewResourceId, classes);
        this.con = context;
        this.classes = classes;

    }

    @Override

    public View getView(int position, View convertView, ViewGroup parent) {

        View v = convertView;

        if (v == null) {

            LayoutInflater vi = (LayoutInflater) con.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            v = vi.inflate(R.layout.my_list_item, null);

        }

        TwoText user = classes.get(position);

        if (user != null) {

            TextView content1 = (TextView) v.findViewById(R.id.list_content1);

            TextView content2 = (TextView) v.findViewById(R.id.list_content2);

            if (content1 != null) {

                content1.setText(user.classID);
            }   
            if(content2 != null) {

                content2.setText(user.state);
            }
        }
        return v;
    }
}

ve bu my_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        style="?android:attr/listSeparatorTextViewStyle"
        android:id="@+id/separator"
        android:text="Header"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#757678"
        android:textColor="#f5c227" />

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

        <TextView
            android:id="@+id/list_content1"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_margin="5dip"
            android:clickable="false"
            android:gravity="center"
            android:longClickable="false"
            android:paddingBottom="1dip"
            android:paddingTop="1dip"
            android:text="sample"
            android:textColor="#ff7f1d"
            android:textSize="17dip"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/list_content2"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_margin="5dip"
            android:clickable="false"
            android:gravity="center"
            android:linksClickable="false"
            android:longClickable="false"
            android:paddingBottom="1dip"
            android:paddingTop="1dip"
            android:text="sample"
            android:textColor="#6d6d6d"
            android:textSize="17dip" />
    </LinearLayout>

</LinearLayout>

şu anda yaptığım şey, normal liste nesnesi gibi başlık ekliyorum, ancak bunun başlık olarak olmasını istiyorum ve benim durumumda üzerinde bir tarih var.

Başlık için xml dosyamda şu kod var:

<TextView
        style="?android:attr/listSeparatorTextViewStyle"
        android:id="@+id/separator"
        android:text="Header"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#757678"
        android:textColor="#f5c227" />

ve gereksiz olduğunda onu saklamayı ve gerekli olduğunda göstermeyi denedim ama kodumun geri kalanını mahvettim. Birkaç öğretici daha denedim ama aynı etkiyi yarattılar.

Biri bana bu kadar kolay yolu nasıl yapacağım konusunda rehberlik edebilir mi?

Yanıtlar:


334

İşte bunu nasıl, anahtarları var getItemViewType ve getViewTypeCount içinde Adaptersınıfında. getViewTypeCountListede kaç tür öğemiz olduğunu döndürür, bu durumda bir başlık öğemiz ve bir olay öğemiz var, yani iki. girdide getItemViewTypene tür Viewolduğumuzu döndürmelidir position.

Daha sonra Android, size doğru türde Viewgirişi convertViewotomatik olarak iletmekle ilgilenecektir .

İşte aşağıdaki kodun sonucu neye benziyor:

Öncelikle, iki liste öğesi türümüzün uygulayacağı bir arayüzümüz var

public interface Item {
    public int getViewType();
    public View getView(LayoutInflater inflater, View convertView);
}

Sonra bir listesini alan bir adaptörümüz var. Item

public class TwoTextArrayAdapter extends ArrayAdapter<Item> {
    private LayoutInflater mInflater;

    public enum RowType {
        LIST_ITEM, HEADER_ITEM
    }

    public TwoTextArrayAdapter(Context context, List<Item> items) {
        super(context, 0, items);
        mInflater = LayoutInflater.from(context);
    }

    @Override
    public int getViewTypeCount() {
        return RowType.values().length;

    }

    @Override
    public int getItemViewType(int position) {
        return getItem(position).getViewType();
    }
@Override
public View getView(int position, View convertView, ViewGroup parent) {
   return getItem(position).getView(mInflater, convertView);
}

Performans İçin Daha İyi DÜZENLE .. kaydırma sırasında fark edilebilir

private static final int TYPE_ITEM = 0; 
private static final int TYPE_SEPARATOR = 1; 

public View getView(int position, View convertView, ViewGroup parent)  {
    ViewHolder holder = null;
    int rowType = getItemViewType(position);
    View View;
    if (convertView == null) {
        holder = new ViewHolder();
        switch (rowType) {
            case TYPE_ITEM:
                convertView = mInflater.inflate(R.layout.task_details_row, null);
                holder.View=getItem(position).getView(mInflater, convertView);
                break;
            case TYPE_SEPARATOR:
                convertView = mInflater.inflate(R.layout.task_detail_header, null);
                holder.View=getItem(position).getView(mInflater, convertView);
                break;
        }
        convertView.setTag(holder);
    }
    else
    {
        holder = (ViewHolder) convertView.getTag();
    }
    return convertView; 
} 

public static class ViewHolder {
    public  View View; } 
}

Ardından, uygulayan Itemve doğru düzenleri şişiren sınıflarımız var . Senin durumunda Headersınıf ve sınıf gibi bir şeye sahip olacaksın ListItem.

   public class Header implements Item {
    private final String         name;

    public Header(String name) {
        this.name = name;
    }

    @Override
    public int getViewType() {
        return RowType.HEADER_ITEM.ordinal();
    }

    @Override
    public View getView(LayoutInflater inflater, View convertView) {
        View view;
        if (convertView == null) {
            view = (View) inflater.inflate(R.layout.header, null);
            // Do some initialization
        } else {
            view = convertView;
        }

        TextView text = (TextView) view.findViewById(R.id.separator);
        text.setText(name);

        return view;
    }

}

Ve sonra ListItemsınıf

    public class ListItem implements Item {
    private final String         str1;
    private final String         str2;

    public ListItem(String text1, String text2) {
        this.str1 = text1;
        this.str2 = text2;
    }

    @Override
    public int getViewType() {
        return RowType.LIST_ITEM.ordinal();
    }

    @Override
    public View getView(LayoutInflater inflater, View convertView) {
        View view;
        if (convertView == null) {
            view = (View) inflater.inflate(R.layout.my_list_item, null);
            // Do some initialization
        } else {
            view = convertView;
        }

        TextView text1 = (TextView) view.findViewById(R.id.list_content1);
        TextView text2 = (TextView) view.findViewById(R.id.list_content2);
        text1.setText(str1);
        text2.setText(str2);

        return view;
    }

}

Ve basit Activitygörüntülemek için

public class MainActivity extends ListActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        List<Item> items = new ArrayList<Item>();
        items.add(new Header("Header 1"));
        items.add(new ListItem("Text 1", "Rabble rabble"));
        items.add(new ListItem("Text 2", "Rabble rabble"));
        items.add(new ListItem("Text 3", "Rabble rabble"));
        items.add(new ListItem("Text 4", "Rabble rabble"));
        items.add(new Header("Header 2"));
        items.add(new ListItem("Text 5", "Rabble rabble"));
        items.add(new ListItem("Text 6", "Rabble rabble"));
        items.add(new ListItem("Text 7", "Rabble rabble"));
        items.add(new ListItem("Text 8", "Rabble rabble"));

        TwoTextArrayAdapter adapter = new TwoTextArrayAdapter(this, items);
        setListAdapter(adapter);
    }

}

İçin düzen R.layout.header

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <TextView
        style="?android:attr/listSeparatorTextViewStyle"
        android:id="@+id/separator"
        android:text="Header"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#757678"
        android:textColor="#f5c227" />

</LinearLayout>

İçin düzen R.layout.my_list_item

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/list_content1"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_margin="5dip"
        android:clickable="false"
        android:gravity="center"
        android:longClickable="false"
        android:paddingBottom="1dip"
        android:paddingTop="1dip"
        android:text="sample"
        android:textColor="#ff7f1d"
        android:textSize="17dip"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/list_content2"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_margin="5dip"
        android:clickable="false"
        android:gravity="center"
        android:linksClickable="false"
        android:longClickable="false"
        android:paddingBottom="1dip"
        android:paddingTop="1dip"
        android:text="sample"
        android:textColor="#6d6d6d"
        android:textSize="17dip" />

</LinearLayout>

İçin düzen R.layout.activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

</RelativeLayout>

Ayrıca daha meraklı hale gelebilir ve kullanabilir ViewHolders, eşzamansız olarak yükleyebilir veya istediğiniz her şeyi yapabilirsiniz.


5
Buradaki çözümünüzü beğendim, ancak bir ArrayAdapter genişlettiğiniz için, kendi Öğe Listenizi izlememelisiniz. ArrayAdapter'da dahili olarak izleneni kullanmanız yeterlidir. Aksi takdirde, Öğelerinizi depolamak için bellek miktarını iki katına
çıkarırsınız

3
Mükemmel çözüm. Bunu yalnızca başlıklar tıklanabilir değilse (bir yapıcıda ayarlanabilir) @Override public boolean isEnabled (int position) {return (getItem (position) .getViewType () == RowType.LIST_ITEM .ordinal ()); }
dwbrito

2
liste görünümü kaydırıldığında satırlar rastgele hale geliyor mu? Biri lütfen yol gösterebilir mi
i_raqz

1
Google bunu neden sadece 3 satırlık bir kodla gerçekleştiremiyor?
Ojonugwa Jude Ochalifu

4
Bu cevap, SO'da bulduğum en iyi cevaplardan biri - açık, özlü ve iyi açıklanmış. Bununla birlikte, ListView sonuçlarının yarı rastgele bir sırada olmasıyla ilgili bir sorun yaşadım (ilk başlık ve öğeler tamam, ardından karışıktı), sorunun ne olduğunu bulmayı başardım. 'EDIT Better For Performance .. altındaki kod bloğu kaydırırken farkedilebilir' benim için karışıklık yarattı - bunu Custom ArrayAdapter sınıfından kaldırmak sorunu benim için çözdü. Rastgele sonuçlar alan herkese bunu denemelerini tavsiye ederim. Yine de mükemmel bir cevap için teşekkürler. Bana gerçekten yardım etti!
blueprintchris

9

Muhtemelen öğeleri (alt öğeleri) ayırmak için başlıklara (gruplara) sahip bir ExpandableListView arıyorsunuz .

Konuyla ilgili güzel eğitim: burada .


Genişletilebilir olmalarını istemiyorum
Rohit Malish

Tek sorun buysa, görünümlerin genişletilmesini / daraltılmasını önlemek için onItemClick yöntemini geçersiz kılabilirsiniz.
Saito Mea

Ama yine de başka amaçlar için tıklanabilir olmaları için onlara ihtiyacım var
Rohit Malish

Err ... Aslında onGroupClicksadece "başlıklara" tıklamayı işleyen ve tıklamayı veya bunun gibi bir şeyi devre dışı bırakmanıza gerek olmadığını söylemeyi kastettim , sadece herhangi bir daraltma eylemini iptal edin ve tüm grupları baştan genişletilecek şekilde ayarlayın.
Saito Mea

ExpandableListViewÇoğu durumda en iyisinin bu olduğuna katılıyorum . Bununla birlikte, Aktivitemde bazen düz bir liste ve diğer zamanlarda başlıkları olan bir liste görüntülemek istediğim bir durum var. Ne yazık ki, ExpandableListAdapterarayüz arayüzü genişletmiyor, ListAdapterbu yüzden polimorfizm için @ antew'in çözümünü kullanmak zorunda kalıyorum.
tytk

3

Alternatif olarak, sadece bu kullanım durumu için tasarlanmış güzel bir 3. taraf kitaplığı var . Bu nedenle, adaptörde depolanan verilere göre başlıklar oluşturmanız gerekir. Rolodex adaptörleri olarak adlandırılırlar ve birlikte kullanılırlar ExpandableListViews. Başlıkları olan normal bir liste gibi davranacak şekilde kolayca özelleştirilebilirler.

OP'nin Eventnesnelerini kullanmak ve başlıkların Datekendisiyle ilişkili olana dayandığını bilmek ... kod şuna benzer:

Aktivite

    //There's no need to pre-compute what the headers are. Just pass in your List of objects. 
    EventDateAdapter adapter = new EventDateAdapter(this, mEvents);
    mExpandableListView.setAdapter(adapter);

Adaptör

private class EventDateAdapter extends NFRolodexArrayAdapter<Date, Event> {

    public EventDateAdapter(Context activity, Collection<Event> items) {
        super(activity, items);
    }

    @Override
    public Date createGroupFor(Event childItem) {
        //This is how the adapter determines what the headers are and what child items belong to it
        return (Date) childItem.getDate().clone();
    }

    @Override
    public View getChildView(LayoutInflater inflater, int groupPosition, int childPosition,
                             boolean isLastChild, View convertView, ViewGroup parent) {
        //Inflate your view

        //Gets the Event data for this view
        Event event = getChild(groupPosition, childPosition);

        //Fill view with event data
    }

    @Override
    public View getGroupView(LayoutInflater inflater, int groupPosition, boolean isExpanded,
                             View convertView, ViewGroup parent) {
        //Inflate your header view

        //Gets the Date for this view
        Date date = getGroup(groupPosition);

        //Fill view with date data
    }

    @Override
    public boolean hasAutoExpandingGroups() {
        //This forces our group views (headers) to always render expanded.
        //Even attempting to programmatically collapse a group will not work.
        return true;
    }

    @Override
    public boolean isGroupSelectable(int groupPosition) {
        //This prevents a user from seeing any touch feedback when a group (header) is clicked.
        return false;
    }
}

1

Başlık olarak Tarihi (ör. 01 Aralık 2016) yapmak için ne yaptım. StickyHeaderListView kitaplığını kullandım

https://github.com/emilsjolander/StickyListHeaders

Tarihi milis cinsinden uzuna çevirin [saati eklemeyin] ve bunu başlık kimliği yapın.

@Override
public long getHeaderId(int position) {
    return <date in millis>;
}

1

İşte antew'in ayrıntılı ve yararlı cevabına dayanan örnek bir proje , ListViewkaydırma performansını iyileştirmek için görüntü sahiplerini içeren birden çok başlık içeren bir proje .

Bu projede, içinde temsil edilen nesneler , her ikisi de soyut sınıfın alt sınıfları olan ListViewya sınıfın HeaderItemya da sınıfın örnekleridir.RowItemItem . Her bir alt sınıf Item, özel bağdaştırıcıda farklı bir görünüm türüne karşılık gelir ItemAdapter. Yöntem getView()ile ItemAdapterdelege bireyselleştirilmiş her liste öğesinin görünümün oluşturulduğu getView()iki ilgili yöntem HeaderItemya da RowItembağlı olarak, Itemgeçirilen konumunda kullanılan alt sınıfına getView()adaptör üzerindeki yöntem. Her biriItem alt sınıfın kendi görüntü tutucusu vardır.

Görüntü sahipleri aşağıdaki gibi uygulanır. getView()üzerinde yöntemleriItem sınıflardakiView , getView()yönteme iletilen nesnenin ItemAdapterboş olup olmadığını kontrol eder . Öyleyse, uygun düzen şişirilir ve bir görüntü tutucu nesne somutlaştırılır ve aracılığıyla şişirilmiş görünüm ile ilişkilendirilir View.setTag(). Eğer Viewnesne boş değil, daha sonra bir görünüşüdür tutucu nesne zaten görüntüsü ile ilişkili ve görünümü tutucu ile alınır View.getTag(). Görünüm sahiplerinin kullanım şekli aşağıdaki kod parçacığında şuradan görülebilir HeaderItem:

@Override
View getView(LayoutInflater i, View v) {
    ViewHolder h;
    if (v == null) {
        v = i.inflate(R.layout.header, null);
        h = new ViewHolder(v);
        v.setTag(h);
    } else {
        h = (ViewHolder) v.getTag();
    }
    h.category.setText(text());
    return v;
}

private class ViewHolder {
    final TextView category;

    ViewHolder(View v) {
        category = v.findViewById(R.id.category);
    }
}

ListView’un tam uygulaması aşağıdaki gibidir. İşte Java kodu:

import android.app.ListActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class MainActivity extends ListActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setListAdapter(new ItemAdapter(getItems()));
    }

    class ItemAdapter extends ArrayAdapter<Item> {
        final private List<Class<?>> viewTypes;

        ItemAdapter(List<Item> items) {
            super(MainActivity.this, 0, items);
            if (items.contains(null))
                throw new IllegalArgumentException("null item");
            viewTypes = getViewTypes(items);
        }

        private List<Class<?>> getViewTypes(List<Item> items) {
            Set<Class<?>> set = new HashSet<>();
            for (Item i : items) 
                set.add(i.getClass());
            List<Class<?>> list = new ArrayList<>(set);
            return Collections.unmodifiableList(list);
        }

        @Override
        public int getViewTypeCount() {
            return viewTypes.size();
        }

        @Override
        public int getItemViewType(int position) {
            Item t = getItem(position);
            return viewTypes.indexOf(t.getClass());
        }

        @Override
        public View getView(int position, View v, ViewGroup unused) {
            return getItem(position).getView(getLayoutInflater(), v);
        }
    }

    abstract private class Item {
        final private String text;

        Item(String text) {
            this.text = text;
        }

        String text() { return text; }

        abstract View getView(LayoutInflater i, View v);
    }

    private class HeaderItem extends Item {
        HeaderItem(String text) {
            super(text);
        }

        @Override
        View getView(LayoutInflater i, View v) {
            ViewHolder h;
            if (v == null) {
                v = i.inflate(R.layout.header, null);
                h = new ViewHolder(v);
                v.setTag(h);
            } else {
                h = (ViewHolder) v.getTag();
            }
            h.category.setText(text());
            return v;
        }

        private class ViewHolder {
            final TextView category;

            ViewHolder(View v) {
                category = v.findViewById(R.id.category);
            }
        }
    }

    private class RowItem extends Item {
        RowItem(String text) {
            super(text);
        }

        @Override
        View getView(LayoutInflater i, View v) {
            ViewHolder h;
            if (v == null) {
                v = i.inflate(R.layout.row, null);
                h = new ViewHolder(v);
                v.setTag(h);
            } else {
                h = (ViewHolder) v.getTag();
            }
            h.option.setText(text());
            return v;
        }

        private class ViewHolder {
            final TextView option;

            ViewHolder(View v) {
                option = v.findViewById(R.id.option);
            }
        }
    }

    private List<Item> getItems() {
        List<Item> t = new ArrayList<>();
        t.add(new HeaderItem("Header 1"));
        t.add(new RowItem("Row 2"));
        t.add(new HeaderItem("Header 3"));
        t.add(new RowItem("Row 4"));

        t.add(new HeaderItem("Header 5"));
        t.add(new RowItem("Row 6"));
        t.add(new HeaderItem("Header 7"));
        t.add(new RowItem("Row 8"));

        t.add(new HeaderItem("Header 9"));
        t.add(new RowItem("Row 10"));
        t.add(new HeaderItem("Header 11"));
        t.add(new RowItem("Row 12"));

        t.add(new HeaderItem("Header 13"));
        t.add(new RowItem("Row 14"));
        t.add(new HeaderItem("Header 15"));
        t.add(new RowItem("Row 16"));

        t.add(new HeaderItem("Header 17"));
        t.add(new RowItem("Row 18"));
        t.add(new HeaderItem("Header 19"));
        t.add(new RowItem("Row 20"));

        t.add(new HeaderItem("Header 21"));
        t.add(new RowItem("Row 22"));
        t.add(new HeaderItem("Header 23"));
        t.add(new RowItem("Row 24"));

        t.add(new HeaderItem("Header 25"));
        t.add(new RowItem("Row 26"));
        t.add(new HeaderItem("Header 27"));
        t.add(new RowItem("Row 28"));
        t.add(new RowItem("Row 29"));
        t.add(new RowItem("Row 30"));

        t.add(new HeaderItem("Header 31"));
        t.add(new RowItem("Row 32"));
        t.add(new HeaderItem("Header 33"));
        t.add(new RowItem("Row 34"));
        t.add(new RowItem("Row 35"));
        t.add(new RowItem("Row 36"));

        return t;
    }

}

Ayrıca, her bir Öğe alt sınıfı için bir tane olmak üzere iki liste öğesi düzeni vardır. headerHeaderItem tarafından kullanılan düzen şu şekildedir:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#FFAAAAAA"
    >
    <TextView
        android:id="@+id/category"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="4dp"
        android:textColor="#FF000000"
        android:textSize="20sp"
        android:textStyle="bold"
        />
 </LinearLayout>

Ve işte rowRowItem tarafından kullanılan düzen :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?android:attr/listPreferredItemHeight"
    >
    <TextView
        android:id="@+id/option"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="15sp"
        />
</LinearLayout>

İşte ortaya çıkan ListView'ün bir kısmının bir görüntüsü:

Birden çok başlığa sahip ListView

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.