Saya tahu ini ide yang buruk, tetapi saya menggunakan RecyclerView di dalam item RecyclerView lain untuk menampilkan daftar item yang berisi daftar.

Saya berhasil membuatnya bekerja dan mengubahnya sejauh yang saya bisa, tetapi saya masih mendapatkan lonjakan green itu ketika daftar dengan jumlah item yang lebih besar mulai ditampilkan dan digambar di layar.

GPU profiling Samsung Galaxy S6

Paku tersebut menghasilkan jeda yang nyata saat melempar item dan bahkan lebih jelas saat menggunakan sesuatu yang lebih lambat dan lebih tua dari Samsung Galaxy S6.

Saya melakukan beberapa logging, dan tampaknya ViewHolders outer sedang didaur ulang dan adaptor inner RecyclerView dibuat hanya 5 kali jadi itu pasti waktu menggambar yang mematikan kinerja.

Saya telah berhasil membatasi pembuatan ViewHolders inner RecyclerView baru dengan menyetel jumlah maksimum ViewHolders di RecycledViewPool tetapi itu hanya membantu sedikit.

Saya tahu bahwa RecyclerView bagian dalam tidak memiliki "bawah" yang dapat diandalkan untuk menghitung kapan harus menampilkan item baru sehingga harus segera menggambar setiap item dan itu mungkin alasan utama mengapa seseorang tidak boleh menggunakan pengaturan ini. (Saya sadar ketika saya menulis pertanyaan ini.. terima kasih bebek karet dunia).

Apakah ada cara ini dapat diubah lebih jauh atau dapatkah Anda menyarankan cara membuatnya bekerja menggunakan beberapa pengaturan berbeda selain RecyclerView di dalam item RecyclerView lain?

Saya akan memberikan info lebih lanjut jika diperlukan.

Terima kasih

-1
rexxar 10 Maret 2017, 14:17

2 jawaban

Jawaban Terbaik

Saya berhasil mendapatkan kinerja yang lebih baik dengan membuat RecycledViewPool bersama, seperti yang dilakukan dalam proyek @Raghunandan yang ditautkan di komentar.

Aplikasi Android Google I/O - Shared RecycledViewsPool

Saya juga mengatur jumlah tampilan maksimum ke Pool yang benar-benar berhasil, sekarang saya hanya perlu menemukan cara untuk menggunakan kembali pendengar saya dan menghindari membuat yang baru, tapi itu masalah yang berbeda.

Terima kasih semua untuk menanggapi. Saya akan memposting lebih banyak jika saya menemukan sesuatu yang berguna di masa depan.

-1
rexxar 10 Maret 2017, 15:09

Solusi terbaik adalah beralih kembali ke ListView dan menggunakan ExpandableListView antarmuka, atau untuk mengimplementasikannya sendiri di RecyclerView.

Seperti yang Anda sebutkan - daftar komponen gulir tidak pernah merupakan solusi yang baik. Berikut adalah contoh adaptor tampilan daftar yang dapat diperluas sehingga Anda memiliki gagasan tentang apa yang diperlukan:

public class MyExpandableListAdapter extends BaseExpandableListAdapter {

    ...

    @Override
    public Object getChild(int listPosition, int childListPosition) { 
        //return an item that would have been in one of the nested recyclers
        //(listPosition = parent, childListPosition = nested item number)
       return getGroup(listPosition).getChildren().get(childListPosition);
    }

    @Override
    public int getChildrenCount(int listPosition) {
        //presuming the parent items contain the children
        return getGroup(listPosition).getChildren().size();
    }

    @Override
    public Object getGroup(int listPosition) {
        //group is the parent items (the tope level recycler view items)
        return mData.get(listPosition);
    }

    @Override
    public int getGroupCount() {
        return mData.size();
    }

    @Override
    public View getGroupView(int listPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.list_item, parent, false);
        }
        MyDataType item = getGroup(listPosition);
        //set the fields (or better yet, use viewholder pattern)
        return convertView;
    }

    @Override
    public View getChildView(int listPosition, final int expandedListPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.list_item, parent, false);
        }
        MyDataType item = getChild(listPosition, expandedListPosition);
        //set the fields (or better yet, use viewholder pattern)
        return convertView;
    }

}
2
Nick Cardoso 10 Maret 2017, 11:38