Saya menghadapi masalah yang sangat umum: Saya menyusun sebuah aktivitas dan sekarang ternyata aktivitas tersebut harus menampilkan beberapa item di dalamnya ScrollView
. Cara normal untuk melakukannya adalah dengan menggunakan yang ada ListAdapter
, hubungkan ke a ListView
dan BOOM Saya akan memiliki daftar item saya.
TETAPI Anda tidak boleh menempatkan bersarang ListView
di a ScrollView
karena mengacaukan pengguliran - bahkan Android Lint mengeluhkannya.
Jadi, inilah pertanyaan saya:
Bagaimana cara menghubungkan ListAdapter
ke a LinearLayout
atau yang serupa?
Saya tahu solusi ini tidak akan diskalakan untuk banyak item tetapi daftar saya sangat pendek (<10 item) sehingga penggunaan kembali tampilan tidak terlalu diperlukan. Dari segi kinerja, saya bisa hidup dengan menempatkan semua tampilan langsung ke LinearLayout
.
Satu solusi yang saya dapatkan adalah menempatkan layout aktivitas saya yang ada di bagian headerView dari ListView
. Tapi ini terasa seperti menyalahgunakan mekanisme ini, jadi saya mencari solusi yang lebih bersih.
Ide ide?
UPDATE: Untuk menginspirasi arah yang benar, saya menambahkan contoh tata letak untuk menunjukkan masalah saya:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/news_detail_layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:visibility="visible">
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFF"
>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:paddingLeft="@dimen/news_detail_layout_side_padding"
android:paddingRight="@dimen/news_detail_layout_side_padding"
android:paddingTop="@dimen/news_detail_layout_vertical_padding"
android:paddingBottom="@dimen/news_detail_layout_vertical_padding"
>
<TextView
android:id="@+id/news_detail_date"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:gravity="center_horizontal"
android:text="LALALA"
android:textSize="@dimen/news_detail_date_height"
android:textColor="@color/font_black"
/>
<Gallery
android:id="@+id/news_detail_image"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:paddingTop="5dip"
android:paddingBottom="5dip"
/>
<TextView
android:id="@+id/news_detail_headline"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:gravity="center_horizontal"
android:text="Some awesome headline"
android:textSize="@dimen/news_detail_headline_height"
android:textColor="@color/font_black"
android:paddingTop="@dimen/news_detail_headline_paddingTop"
android:paddingBottom="@dimen/news_detail_headline_paddingBottom"
/>
<TextView
android:id="@+id/news_detail_content"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:text="Here comes a lot of text so the scrollview is really needed."
android:textSize="@dimen/news_detail_content_height"
android:textColor="@color/font_black"
/>
<!---
HERE I NEED THE LIST OF ITEMS PROVIDED BY THE EXISTING ADAPTER.
They should be positioned at the end of the content, so making the scrollview smaller is not an option.
---->
</LinearLayout>
</ScrollView>
</LinearLayout>
UPDATE 2 Saya mengubah headline agar lebih mudah dipahami (mendapat downvote, doh!).
sumber
Jawaban:
Anda mungkin harus menambahkan item Anda secara manual ke
LinearLayout
:EDIT : Saya menolak pendekatan ini ketika saya perlu menampilkan sekitar 200 item daftar non-sepele, ini sangat lambat - Nexus 4 membutuhkan sekitar 2 detik untuk menampilkan "daftar" saya, itu tidak dapat diterima. Jadi saya beralih ke pendekatan Flo dengan header. Ini bekerja lebih cepat karena tampilan daftar dibuat sesuai permintaan saat pengguna menggulir, bukan pada saat tampilan dibuat.
Lanjutkan: Penambahan tampilan manual ke tata letak lebih mudah untuk dikodekan (sehingga bagian dan bug yang berpotensi kurang bergerak), tetapi mengalami masalah kinerja, jadi jika Anda memiliki 50 tampilan atau lebih, saya menyarankan untuk menggunakan pendekatan tajuk.
Contoh. Pada dasarnya tata letak aktivitas (atau fragmen) berubah menjadi seperti ini (tidak diperlukan ScrollView lagi):
Kemudian di
onCreateView()
(Saya akan menggunakan contoh dengan fragmen) Anda perlu menambahkan tampilan header dan kemudian menyetel adaptor (saya menganggap ID sumber daya header adalahheader_layout
):sumber
ListAdapter
danListView
melakukan lebih banyak keajaiban di balik layar yang kemudian tidak saya lakukan secara manual.notifyDataSetChanged
? Ini berfungsi dengan baik pada adaptor lain yang telah saya sambungkanListView
, tetapi tampaknya tidak berfungsi dengan adaptor yang telah saya sambungkanLinearLayout
.Saya akan tetap menggunakan solusi tampilan header. Tidak ada yang salah dengan itu. Saat ini saya melaksanakan suatu kegiatan dengan menggunakan pendekatan yang sama persis.
Jelas sekali, "bagian item" lebih dinamis daripada statis (memvariasikan jumlah item vs. memperbaiki jumlah item, dll.) Jika tidak, Anda tidak akan berpikir untuk menggunakan adaptor sama sekali. Jadi, ketika Anda membutuhkan adaptor, gunakan ListView.
Mengimplementasikan solusi yang mengisi LinearLayout dari adaptor pada akhirnya tidak lain adalah membangun ListView dengan tata letak khusus.
Hanya 2 sen saya.
sumber
ListView
. Tidak yakin saya suka pekerjaan tambalan ini.Setel tampilan Anda ke main.xml onCreate, lalu perbesar dari row.xml
main.xml
row.xml
sumber
Saya menggunakan kode berikut yang mereplikasi fungsionalitas adaptor dengan
ViewGroup
danTabLayout
. Hal yang baik tentang ini adalah jika Anda mengubah daftar dan mengikat lagi, ini hanya akan memengaruhi item yang diubah:Pemakaian:
Untuk
ViewGroups
:Karena
TabLayout
saya punya ini:sumber