Saya memiliki ListView yang memiliki beberapa jenis acara di dalamnya. Acara diurutkan berdasarkan hari, dan saya ingin memiliki header dengan tanggal di atasnya untuk setiap hari, dan kemudian acara didengarkan di bawah ini.
Berikut adalah cara saya mengisi daftar itu:
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);
dan beginilah tampilan kelas TwoText saya:
public class TwoText {
public String classID;
public String state;
public TwoText(String classID, String state) {
this.classID = classID;
this.state = state;
}
}
dan beginilah tampilan kelas TwoTextArrayAdapter saya:
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;
}
}
dan ini adalah 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>
apa yang saya lakukan saat ini adalah bahwa saya menambahkan header hanya sebagai objek daftar biasa, tetapi saya suka itu sebagai header dan dalam kasus saya memiliki tanggal di atasnya.
Saya memiliki kode ini di xml saya untuk header:
<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" />
dan saya mencoba menyembunyikannya saat tidak perlu dan menampilkannya saat diperlukan, tetapi saya baru saja mengacaukan kode lainnya. Saya mencoba beberapa tutorial lagi tetapi mereka juga memiliki efek yang sama.
Adakah yang bisa membimbing saya tentang cara melakukan cara mudah itu?
Anda mungkin mencari ExpandableListView yang memiliki header (grup) untuk memisahkan item (anak).
Tutorial bagus tentang subjek: di sini .
sumber
onGroupClick
yang hanya menangani klik pada "tajuk" dan Anda tidak perlu menonaktifkan klik atau sesuatu seperti ini, cukup batalkan tindakan penciutan dan setel semua grup untuk diperluas dari awal.ExpandableListView
yang terbaik dalam banyak kasus. Namun saya memiliki situasi di mana saya terkadang ingin menampilkan daftar datar, dan daftar dengan tajuk di lain waktu dalam Aktivitas saya. Sayangnya,ExpandableListAdapter
antarmuka tidak memperluasListAdapter
antarmuka jadi untuk polimorfisme saya terpaksa menggunakan solusi @ antew.Sebagai alternatif, ada pustaka pihak ketiga yang dirancang khusus untuk kasus penggunaan ini. Dimana Anda perlu membuat header berdasarkan data yang disimpan di adaptor. Mereka disebut adaptor Rolodex dan digunakan dengan
ExpandableListViews
. Mereka dapat dengan mudah disesuaikan untuk berperilaku seperti daftar normal dengan header.Menggunakan objek OP
Event
dan mengetahui header didasarkan padaDate
terkait dengannya ... kodenya akan terlihat seperti ini:Aktivitas
Adaptor
sumber
Apa yang saya lakukan untuk menjadikan Date (misal 01 Desember 2016) sebagai header. Saya menggunakan perpustakaan StickyHeaderListView
https://github.com/emilsjolander/StickyListHeaders
Konversikan tanggal menjadi panjang dalam milis [jangan sertakan waktu] dan jadikan sebagai ID header.
sumber
Berikut adalah contoh proyek , berdasarkan jawaban rinci dan bermanfaat antew, yang mengimplementasikan
ListView
dengan beberapa header yang menggabungkan pemegang tampilan untuk meningkatkan kinerja pengguliran.Dalam proyek ini, objek yang direpresentasikan di
ListView
are instance dari salah satu kelasHeaderItem
atau kelasRowItem
, keduanya merupakan subkelas dari kelas abstrakItem
. Setiap subkelasItem
terkait dengan tipe tampilan berbeda di adaptor kustomItemAdapter
,. MetodegetView()
padaItemAdapter
delegasi penciptaan pandangan untuk setiap item daftar ke individualgetView()
metode di keduaHeaderItem
atauRowItem
, tergantung padaItem
subclass digunakan pada posisi dilewatkan kegetView()
metode pada adaptor. SetiapItem
subclass menyediakan view holdernya sendiri.Pemegang tampilan diimplementasikan sebagai berikut. The
getView()
metode padaItem
subclass memeriksa apakahView
objek yang dilewatkan kegetView()
metode padaItemAdapter
nol. Jika demikian, tata letak yang sesuai akan dimekarkan, dan objek view holder dibuatkan instance-nya dan dikaitkan dengan tampilan yang dimekarkan melaluiView.setTag()
. JikaView
objeknya bukan null, maka objek view holder sudah dikaitkan dengan tampilan tersebut, dan view holder diambil melaluiView.getTag()
. Cara penggunaan view holder dapat dilihat dalam cuplikan kode berikut dariHeaderItem
:Implementasi lengkap ListView berikut ini. Ini kode Java:
Ada juga dua tata letak item daftar, satu untuk setiap subkelas Item. Berikut adalah tata letak yang
header
digunakan oleh HeaderItem:Dan inilah tata letaknya
row
, yang digunakan oleh RowItem:Berikut adalah gambar dari sebagian ListView yang dihasilkan:
sumber