<p>Xamarin.Forms.CollectionView Spec</p>

Dibuat pada 27 Jun 2018  ·  178Komentar  ·  Sumber: xamarin/Xamarin.Forms

KoleksiLihat

Desain dan implementasi Forms ListView saat ini sangat kompleks dan menantang untuk dipelihara, sementara seringkali tidak memberikan fleksibilitas yang diinginkan pengguna. Karena kerumitan implementasi dan persyaratan kompatibilitas mundur, bug ListView mungkin sulit ditemukan dan diperbaiki.

Tujuan dari upaya CollectionView adalah untuk mengatasi masalah ini dengan menyederhanakan API dan merangkul kemampuan kontrol pembuatan daftar platform asli. Untuk itu:

  • CollectionView menghapus konsep Sel sepenuhnya. Meskipun nyaman dalam beberapa kasus, konsep Sel memperkenalkan banyak kerumitan ke dalam implementasi asli ListView. Segala sesuatu yang mungkin dengan Sel dapat dicapai dengan DataTemplates yang dapat digunakan kembali.

  • CollectionView mengurangi permukaan API. Beberapa properti dan acara dari ListView tidak tersedia di CollectionView. Beberapa di antaranya mudah diganti dalam DataTemplates; yang lain sangat spesifik untuk platform tertentu dan tidak pernah benar-benar termasuk. Daftar perubahan ini dapat ditemukan di bawah.

  • CollectionView bertujuan untuk lebih fleksibel dengan tidak membuat asumsi tentang tata letak. Ini memungkinkan kami untuk mendukung tata letak yang telah lama diminta oleh pengguna (misalnya, HorizontalListView) dan yang sudah disediakan oleh implementasi asli.

_Catatan: Tidak ada dalam dokumen ini yang harus dianggap sebagai indikasi bahwa ListView saat ini akan dihapus atau akan berhenti dipertahankan. Upaya ini hanya bertujuan untuk memberikan kontrol alternatif yang akan lebih mudah melayani kebutuhan banyak pengguna Formulir._

_Catatan: Tidak ada dalam spesifikasi ini yang dijamin final; semua fitur, implementasi, dan antarmuka dapat berubah._

Status penyelesaian saat ini dari fitur yang ditentukan di bawah ini

Mendukung API

Untuk memberikan daftar yang lebih modern kepada pengguna, upaya CollectionView akan menyertakan beberapa API pendukung:

  • FontIconSource - menggunakan mesin terbang terukur sebagai ikon; tujuannya adalah untuk mendukung mesin terbang di mana pun Formulir saat ini mendukung gambar. Ini jelas merupakan fitur yang diinginkan di banyak bagian Formulir, tetapi juga sangat penting untuk mendukung gerakan menggesek kontekstual di CollectionView (lihat spesifikasi FontIconSource ).

  • SwipeView - Menyediakan dukungan untuk menggesek elemen untuk menjalankan atau mengungkapkan tindakan lebih lanjut (lihat spesifikasi SwipeView ).

Spesifikasi Tata Letak

Spesifikasi ini memberikan pengembang untuk menentukan apakah item yang akan ditata dalam daftar vertikal, daftar horizontal, atau kotak. Semua kelas asli yang mendasarinya mendukung jenis tata letak ini. (Perhatikan bahwa di iOS, spesifikasi ini mengasumsikan penggunaan UICollectionView daripada UITableView.)

Spesifikasi yang diberikan ke CollectionView dipetakan ke tata letak asli di setiap perender. Misalnya, jika tata letak kisi ditentukan, di iOS perender akan (secara default) menggunakan UICollectionViewFlowLayout. Di Android, defaultnya adalah GridLayoutManager; di UWP, GridView.

Formulir tidak berpartisipasi dalam tata letak item di pengulang (di luar menghasilkan item Tampilan itu sendiri); bagian tata letak ini sepenuhnya asli.

Pemilihan metode tata letak yang akan digunakan di setiap penyaji akan dapat dimodifikasi oleh pengguna; jika pengguna lebih suka menggunakan StaggeredGridLayoutManager di Android, ini dapat dicapai dengan memodifikasi metode pemilihan dan mengembalikan pengelola tata letak yang diinginkan.

Penghapusan ListView API

  • IsPullToRefreshEnabled - ini sekarang ditangani oleh RefreshView.
  • IsRefreshing - ini sekarang ditangani oleh RefreshView.
  • RefreshCommand - ini sekarang ditangani oleh RefreshView.
  • HasUnevenRows - ini sekarang ItemSizingStrategy.
  • RowHeight - ini sekarang ditentukan oleh item pertama yang akan ditata.
  • SeparatorVisibility - CollectionView tidak menyertakan pemisah bawaan; pengguna dapat menyediakan ini (jika diinginkan) di templat mereka.
  • SeparatorColor - CollectionView tidak menyertakan pemisah bawaan; pengguna dapat menyediakan ini (jika diinginkan) di templat mereka.
  • GroupShortName - properti ini ada untuk mendukung daftar lompatan dan zoom semantik; CollectionView fase 1 tidak mendukung fitur ini.

API

Item Konteks

ContextItem menyediakan cara untuk menentukan interaksi kontekstual, sering ditampilkan sebagai bagian dari menu konteks.

public class ContextItem
{
    public static readonly BindableProperty TextProperty;
    public string Text { get; set; }

    public static readonly BindableProperty CommandProperty;
    public ICommand Command { get; set; }

    public static readonly BindableProperty CommandParameterProperty;
    public object CommandParameter { get; set; }

    public static readonly BindableProperty IsEnabledProperty;
    public bool IsEnabled { get; set; }

    public static readonly BindableProperty IconProperty;
    public ImageSource Icon { get; set; }

    public event EventHandler Invoked;
}

Properti

| API | Deskripsi |
| ------------- | ------------- |
| Teks | Mendapatkan atau mengatur deskripsi teks yang ditampilkan pada item. |
| Perintah | Mendapat atau menetapkan perintah untuk dieksekusi saat item ini dipanggil. |
| CommandParameter | |
| Diaktifkan | Mendapatkan atau menetapkan nilai yang menunjukkan apakah pengguna dapat berinteraksi dengan item konteks. |
| Ikon | Mendapatkan atau mengatur konten grafis dari item. |

Acara

| API | Deskripsi |
| ------------- | ------------- |
| Dipanggil | Terjadi ketika interaksi pengguna menunjukkan bahwa perintah yang diwakili oleh item ini harus dijalankan. |

Menu Konteks

Menyediakan cara untuk menentukan sekumpulan interaksi yang akan ditampilkan dalam menu konteks. ContextMenu dapat disediakan untuk VisualElement apa pun, dan diaktifkan/ditampilkan sesuai dengan konvensi platform asli.

public static class ContextMenu
{
    public static readonly BindableProperty MenuItemsProperty =
            BindableProperty.CreateAttached("MenuItems", typeof(ContextMenuItems), typeof(VisualElement));
}


public class ContextMenuItems : IList<ContextItem>
{
}

Segarkan Tampilan

Pindah ke #5882

SeleksiMode

Menyediakan perilaku mode pemilihan untuk CollectionView.

public enum SelectionMode 
{
    None,
    Single,
    Multiple
}

SeleksiChangedEventArgs

public class SelectionChangedEventArgs : EventArgs
{
    public IReadOnlyList<object> PreviousSelection { get; }
    public IReadOnlyList<object> CurrentSelection { get; }
}

Properti

| API | Deskripsi |
| ------------- | ------------- |
| Pilihan Sebelumnya | Mendapatkan daftar item yang dipilih sebelum pilihan diubah. |
| Pilihan Saat Ini | Mendapatkan daftar item yang dipilih setelah pemilihan berubah. |

Tata Letak Barang

Antarmuka penanda untuk menunjukkan bahwa kelas pelaksana menentukan tata letak yang digunakan oleh CollectionView untuk mengatur itemnya.

public interface IItemsLayout {}

Orientasi Tata Letak Item

Menghitung kemungkinan orientasi untuk ItemsLayout . Saat item ditambahkan, CollectionView meluas ke arah orientasi.

public enum ItemsLayoutOrientation
{
    Vertical,
    Horizontal
}

Tata Letak Item

Kelas dasar untuk tata letak item yang disediakan Formulir.

public abstract class ItemsLayout : IItemsLayout
{
    public ItemsLayoutOrientation Orientation { get; }

    protected ItemsLayout(ItemsLayoutOrientation orientation);

    public static readonly BindableProperty SnapPointsAlignmentProperty;
    public SnapPointsAlignment SnapPointsAlignment { get; set; }

    public static readonly BindableProperty SnapPointsTypeProperty;
    public SnapPointsType SnapPointsType { get; set; }  

    public static readonly BindableProperty ItemSpacingProperty;
    public Thickness ItemSpacing {get; set;}
}

Properti

| API | Deskripsi |
| ------------- | ------------- |
| Orientasi Tata Letak Item | Menentukan arah perluasan CollectionView saat item ditambahkan. |
| SnapPointsType | Menentukan perilaku titik jepret saat menggulir tampilan. |
| SnapPointsAlignment | Menentukan bagaimana titik jepret disejajarkan dengan item dalam tampilan. |
| Spasi Item | Menentukan ruang kosong di sekitar setiap item. |

DaftarItemsLayout

public class ListItemsLayout : ItemsLayout
{
    public ListItemsLayout(ItemsLayoutOrientation orientation) : base (orientation);

    public static readonly IItemsLayout VerticalList = new ListItemsLayout(ItemsLayoutOrientation.Vertical); 
    public static readonly IItemsLayout HorizontalList = new ListItemsLayout(ItemsLayoutOrientation.Horizontal); 
}

Anggota Statis

| API | Deskripsi |
| ------------- | ------------- |
| Daftar Vertikal | Menentukan daftar kolom tunggal di mana daftar tumbuh secara vertikal saat item baru ditambahkan. |
| Daftar Horisontal | Menentukan daftar baris tunggal di mana daftar tumbuh secara horizontal saat item baru ditambahkan. |

Tata Letak Item Grid

Mendefinisikan tata letak multi-baris atau multi-kolom.

public class GridItemsLayout : ItemsLayout
{
    public static readonly BindableProperty SpanProperty;
    public int Span { get; set; }

    public GridItemsLayout([Parameter("Span")] int span, [Parameter("Orientation")] ItemsLayoutOrientation orientation) : base (orientation);
}

Penyelarasan SnapPoints

Menghitung kemungkinan penyelarasan untuk titik jepret dalam ListItemsLayout .

public enum SnapPointsAlignment
{
    Start,
    Center,
    End
}

Nilai Enum

| API | Deskripsi |
| ------------- | ------------- |
| Mulai | Titik jepret disejajarkan dengan tepi depan item. |
| Pusat | Titik jepret disejajarkan dengan bagian tengah item. |
| Akhir | Titik jepret disejajarkan dengan trailing edge item. |

Jenis SnapPoints

Menghitung kemungkinan perilaku untuk titik jepret dalam ListItemsLayout .

public enum SnapPointsType
{
    None,
    Optional,
    Mandatory,
    OptionalSingle,
    MandatorySingle,
}

Nilai Enum

| API | Deskripsi |
| ------------- | ------------- |
| Tidak ada | Menggulir tidak terkunci ke item. |
| Opsional | Konten terkunci ke titik jepret terdekat ke tempat pengguliran secara alami akan berhenti di sepanjang arah inersia, jika ada titik jepret yang cukup dekat. |
| Wajib | Konten selalu terkunci ke titik jepret terdekat ke tempat pengguliran secara alami akan berhenti di sepanjang arah inersia. |
| OpsionalSingle | Perilaku yang sama seperti Opsional, tetapi hanya menggulir satu item dalam satu waktu. |
| WajibTunggal | Perilaku yang sama seperti Wajib, tetapi hanya menggulir satu item dalam satu waktu. |

Properti

| API | Deskripsi |
| ------------- | ------------- |
| Rentang | Menentukan jumlah item untuk ditata dalam arah yang dibatasi. |

ItemSizingStrategy

Memberikan kemungkinan strategi pengukuran item untuk digunakan oleh CollectionView.

public enum ItemSizingStrategy
{
    MeasureAllItems,    
    MeasureFirstItem
}

Nilai Enum

| API | Deskripsi |
| ------------- | ------------- |
| UkurSemuaItem | Setiap item diukur secara individual. |
| MeasureFirstItem | Hanya item pertama yang diukur; semua item berikutnya diasumsikan memiliki ukuran yang sama dengan yang pertama. |

ItemMemperbaruiMode Gulir

Mendefinisikan konstanta yang menentukan perilaku pengguliran item saat memperbarui.

public enum ItemsUpdatingScrollMode
{
    KeepItemsInView,
    KeepScrollOffset,
    KeepLastItemInView
}

Nilai Enum

| API | Deskripsi |
| ------------- | ------------- |
| KeepItemsInView | Menyesuaikan offset gulir untuk mempertahankan item pertama yang terlihat di area pandang saat item ditambahkan. |
| KeepScrollOffset | Mempertahankan offset gulir relatif terhadap awal daftar saat item ditambahkan. |
| KeepLastItemInView | Menyesuaikan offset gulir untuk mempertahankan item terakhir yang terlihat di area pandang saat item ditambahkan. |

KoleksiLihat

Menampilkan daftar item.

public class CollectionView : View
{
    public static readonly BindableProperty ItemsLayoutProperty;
    public IItemsLayout ItemsLayout { get; set; }

    public static readonly BindableProperty ItemsSourceProperty;
    public IEnumerable ItemsSource { get; set; }

    public static readonly BindableProperty ItemTemplateProperty;
    public DataTemplate ItemTemplate { get; set; }

    public static readonly BindableProperty ItemsUpdatingScrollMode;
    publio ItemsUpdatingScrollMode ItemsUpdatingScrollMode { get; set; }

    public static readonly BindableProperty HeaderProperty;
    public object Header { get; set; }

    public static readonly BindableProperty HeaderTemplateProperty;
    public DataTemplate HeaderTemplate { get; set; }

    public static readonly BindableProperty IsHeaderStickyProperty;
    public bool IsHeaderSticky { get; set; }

    public static readonly BindableProperty FooterProperty;
    public object Footer { get; set; }

    public static readonly BindableProperty FooterTemplateProperty;
    public DataTemplate FooterTemplate { get; set; }

    public static readonly BindableProperty IsFooterStickyProperty;
    public bool IsFooterSticky { get; set; }

    public static readonly BindableProperty EmptyViewProperty;
    public object EmptyView { get; set; }

    public static readonly BindableProperty EmptyViewTemplateProperty;
    public DataTemplate EmptyViewTemplate { get; set; }

    public static readonly BindableProperty GroupDisplayBindingProperty;
    public BindingBase GroupDisplayBinding { get; set; }

    public static readonly BindableProperty GroupHeaderTemplateProperty;
    public DataTemplate GroupHeaderTemplate { get; set; }

    public static readonly BindableProperty GroupFooterTemplateProperty;
    public DataTemplate GroupFooterTemplate { get; set; }

    public static readonly BindableProperty ItemSizingStrategy;
    public bool ItemSizingStrategy { get; set; }

    public static readonly BindableProperty IsGroupingEnabledProperty;
    public bool IsGroupingEnabled { get; set; }

    public static readonly BindableProperty SelectionModeProperty;
    public SelectionMode SelectionMode { get; set; }

    public static readonly BindableProperty SelectedItemProperty;
    public object SelectedItem { get; set; }

    public static readonly BindableProperty SelectedItemsProperty;
    public IList<object> SelectedItems { get; set; }

    public static readonly BindableProperty SelectionChangedCommandProperty;
    public ICommand SelectionChangedCommand;

    public static readonly BindableProperty SelectionChangedCommandParameterProperty;
    public object SelectionChangedCommandParameter;

    public static readonly BindableProperty RemainingItemsThresholdProperty;
    public int RemainingItemsThreshold { get; set; }

    public void ScrollTo(object item, object group = null, 
        ScrollToPosition position = ScrollToPosition.MakeVisible, bool animate = true);

    public void ScrollTo(int index, int groupIndex = -1, 
        ScrollToPosition position = ScrollToPosition.MakeVisible, bool animate = true);

    public event EventHandler<SelectionChangedEventArgs> SelectionChanged;

    public event EventHandler<EventArgs> RemainingItemsThresholdReached; 
}

Properti

| API | Deskripsi |
| ------------- | ------------- |
| Tata Letak Item | Mendapatkan atau menetapkan spesifikasi tata letak untuk daftar. |
| ItemSizingStrategy | Petunjuk pengguna yang dapat diberikan ke kontrol untuk meningkatkan kinerja. Jika ini diatur ke MeasureAllItems (default), setiap item akan diukur satu per satu. Dalam situasi di mana ukuran item dimaksudkan untuk seragam, nilai ini dapat diatur ke MeasureFirstItem ; hanya item pertama yang akan diukur, dan semua item berikutnya akan diberikan ukuran yang sama dengan yang pertama. |
| ItemTemplat | Mendapatkan atau menyetel DataTemplate yang digunakan untuk menampilkan setiap item.|
| ItemMemperbaruiMode Gulir | Mendapatkan atau menetapkan nilai yang menentukan perilaku pengguliran saat item diperbarui. |
| IsGropingEnabled | Mendapatkan atau menetapkan nilai yang menunjukkan apakah data yang mendasarinya harus ditampilkan dalam grup. |
| Tajuk | Mendapatkan atau menyetel string, pengikatan, atau tampilan yang akan ditampilkan di bagian atas kontrol. |
| Templat Header | Mendapatkan atau menyetel templat data yang akan digunakan untuk memformat Header. |
| IsHeaderSticky | Menentukan apakah header tetap di tempatnya saat pengguna menggulir. Standarnya adalah True |
| Catatan Kaki | Mendapatkan atau menyetel string, binding, atau tampilan yang akan ditampilkan di bagian bawah kontrol. |
| FooterTemplat | Mendapatkan atau menyetel templat data yang akan digunakan untuk memformat Footer. |
| IsFooterSticky | Menentukan apakah footer tetap di tempatnya saat pengguna menggulir. Standarnya adalah True |
| Tampilan Kosong | Mendapatkan atau menetapkan string, binding, atau tampilan yang akan ditampilkan saat ItemsSource kosong. |
| EmptyViewTemplate | Mendapatkan atau menyetel templat data yang akan digunakan untuk memformat EmptyView. |
| GroupHeaderTemplat | Mendapatkan atau menetapkan DataTemplate untuk header grup. |
| GroupFooterTemplat | Mendapatkan atau menetapkan DataTemplate untuk footer grup.* |
| ItemSumber | Daftar objek yang akan ditampilkan dalam kontrol. |
| Mode Pilihan | Mendapatkan atau menyetel perilaku pemilihan untuk kontrol. |
| Item Terpilih | Mendapatkan atau menetapkan item yang dipilih untuk SelectionMode dari Single . Jika item yang dipilih dihapus dari sumber item, SelectedItem akan disetel ke null . |
| Item Terpilih | Mendapatkan atau menetapkan item yang dipilih untuk SelectionMode dari Multiple . Jika item yang dipilih dihapus dari sumber item, item tersebut akan dihapus dari SelectedItems dan SelectionChanged akan dinaikkan. |
| SelectionChangedCommand | Mendapat atau mengatur ICommand untuk dieksekusi ketika pilihan berubah. |
| SelectionChangedCommandParameter | Mendapatkan atau menetapkan parameter untuk SelectionChangedCommand. |
| GroupDisplayBinding | Mendapatkan atau menyetel pengikatan yang akan digunakan untuk menampilkan header grup. |
| RemainingItemsThreshold | Menentukan ambang batas item yang belum terlihat di CollectionView di mana acara RemainingItemsThresholdReached akan dimunculkan. Nilai defaultnya adalah -1, artinya event tidak akan pernah dimunculkan. A 0, acara akan dimunculkan ketika item terakhir yang saat ini ada di ItemsSource ditampilkan. Pada nilai yang lebih besar dari 0, acara akan dimunculkan ketika ItemsSource saat ini berisi jumlah item yang belum di-scroll. |

Metode

| API | Deskripsi |
| ------------- | ------------- |
| ScrollTo(item objek, grup objek = null, posisi ScrollToPosition = ScrollToPosition.MakeVisible, bool animate = true) | Menggulir item yang ditentukan ke tampilan. |
| ScrollTo(int index, int groupIndex = -1, ScrollToPosition position = ScrollToPosition.MakeVisible, bool animate = true) | Menggulir item pada indeks yang ditentukan ke tampilan. |

Acara

| API | Deskripsi |
| ------------- | ------------- |
| PilihanDiubah | Dibesarkan saat properti SelectedItem atau SelectedItems berubah. Ini termasuk perubahan yang terjadi sebagai akibat dari mengubah properti SelectionMode . |
| RemainingItemsThresholdReached | Dibesarkan ketika CollectionView digulir cukup jauh sehingga hanya item RemainingItemsThreshold belum ditampilkan. Acara ini dapat ditangani untuk memuat lebih banyak item. |

Skenario

Aplikasi Obrolan

Pengembang memiliki aplikasi yang memiliki klien obrolan. Pesan muncul di bagian bawah daftar dan gulir ke atas dari layar. Bagaimana pengembang mencapai UI ini dengan API yang diusulkan?

Untuk mencapai perilaku ini, pengembang harus menyetel properti CollectionView.ItemsUpdatingScrollMode ke KeepLastItemInView . Jika posisi gulir pengguna berada di akhir CollectionView, item baru akan muncul di bagian bawah dan akan digulir ke tampilan. Jika posisi gulir pengguna berada di tempat lain, item baru akan muncul di bagian bawah tetapi posisi gulir tidak akan berubah.

Jepret ke yang terdekat

Aplikasi pengembang menampilkan daftar cantuman real estat. Saat pengguna menggulir daftar, pengguliran harus lancar hingga pengguna berhenti. Saat menggulir berhenti, antarmuka aplikasi harus menjepret gulir (animasi) sehingga daftar paling atas sejajar sempurna dengan bagian atas halaman. Snap harus selalu dalam arah yang menghasilkan gerakan paling sedikit.

Untuk mencapai perilaku ini, pengembang harus menggunakan ListItemLayout dengan pengaturan berikut:

  • Orienation : Vertical
  • SnapPointsAlignment : Start
  • SnapPointsType : Mandatory

Tampilan Tabel

Pengembang ingin membuat ulang halaman pengaturan menggunakan tampilan seperti TableView.

Pengembang ingin menggunakan ListItemsLayout dengan Orientasi Vertikal. ItemsTemplate harus disetel ke DataTemplate yang membuat ulang tampilan dan nuansa sel tabel. Jika antarmuka "pengaturan" dimaksudkan untuk menangani lebih dari satu jenis pengaturan (misalnya, jika beberapa sel dimaksudkan untuk mengaktifkan/menonaktifkan pengaturan dan yang lain dimaksudkan untuk menavigasi ke layar pengaturan sekunder), maka pengembang mungkin ingin buat DataTemplateSelector yang mengimplementasikan DataTemplate untuk pengaturan on/off (dengan sakelar sakelar) dan DataTemplate untuk navigasi (dengan TapGesture yang mendorong halaman pengaturan sekunder ke tumpukan navigasi).

Gulir Tak Terbatas

Pengembang memiliki aplikasi yang menampilkan umpan "berita". Umpan "berita" memiliki jumlah item potensial yang tidak terbatas sehingga ketika pengguna mendekati akhir kumpulan data yang dimuat saat ini, aplikasi perlu melakukan panggilan asinkron ke server untuk memuat lebih banyak data. Sangat penting bagi aplikasi untuk memuat data sebelum pengguna melihat ruang kosong atau dihentikan dari menggulir dalam batas latensi/bandwidth jaringan. Bagaimana pengembang mencapai ini dengan API yang diusulkan?

Untuk mencapai ini, pengembang harus mengatur properti RemainingItemsThreshold dan menangani acara RemainingItemsThresholdReached . Saat event dimunculkan, handler dapat membuat panggilan asinkron ke server untuk memuat lebih banyak data ke ItemsSource mendasarinya.

collectionview blocker roadmap enhancement ➕

Komentar yang paling membantu

Bagaimana dengan acara Scrolling untuk mendukung header paralaks

Semua 178 komentar

Bagaimana dengan acara Scrolling untuk mendukung header paralaks

Ada banyak cinta tentang ini.

FontIkonSumber

Untuk FontIconSource meskipun kami benar-benar membutuhkan cara untuk tidak menggunakan nilai Unicode (jika kami tidak mau). Jika Anda melihat FontIconSource dengan nilai f370 Anda tidak tahu apa yang seharusnya.

Di sisi lain, jika saya dapat memilih dan memilih Font Ikon apa yang saya gunakan dan memberikan Formulir cara untuk mengonversi fa-app-store-ios menjadi unicode yang setara dengan f370 , sekarang saya dapat mengetahuinya secara sekilas bahwa ikon yang saya gunakan berasal dari Font Awesome dan itu adalah ikon App Store iOS. Saya tidak bermaksud mengatakan bahwa Formulir harus memiliki pemahaman itu untuk setiap font yang tersedia yang dipanggang (atau apa pun dalam hal ini), yang dapat berasal dari beberapa inti publik atau ditambahkan ke Toolkit Komunitas, dll. cara menggunakan nama yang bermakna.

Terakhir saya berharap kami bisa mendapatkan Ekstensi XAML yang dipanggang untuk ini sehingga Anda mungkin memiliki sesuatu seperti:

<Image Source="{FontIcon fa-app-store-ios,Color={StaticResource primaryColor}}" />

Menu

Seperti yang saya diskusikan dengan @davidortinau sebelumnya, akan sangat ideal jika kita dapat mencampur dan mencocokkan pada Menu Konteks untuk mencapai hasil yang sesuai. Beberapa konteks yang baik tentang hal ini adalah memikirkan klien email di mana Anda mungkin mendapatkan satu menu saat Anda menggeser ke kiri dan menu lainnya saat Anda menggeser ke kanan. Skenario lain yang ingin saya lihat didukung adalah pendekatan menu sel seperti yang ditunjukkan dalam dokumen untuk iOS CollectionView .

Acara

Saya pikir aman untuk mengatakan saya bias, tetapi sebagian besar komunitas mengikuti pola desain MVVM. Memiliki event SelectionChanged & RemainingItemsThresholdReached keduanya penting untuk API, tetapi akan sangat bagus jika kita dapat menemukan cara untuk mendukung OOB ini dengan event handler versi ViewModel... ICommand.

Karena RemainingItemsThresholdReached baru saja mengirimkan EventArgs lama, saya pikir kita dapat dengan aman menganggap meneruskan null ke perintah harus baik-baik saja karena kita hanya perlu menjalankan perintah. Untuk SelectionChanged, saya cenderung berpikir akan lebih penting untuk mengetahui item baru, vs item lama jadi cukup meneruskan item baru OOB ke SelectionChangedCommand seharusnya baik-baik saja. Ini mungkin tidak mengenai setiap kasus penggunaan, tetapi setidaknya memberikan jumlah minimum overhead yang perlu ditambahkan pengembang dengan beberapa EventToCommandBehavior.

Sampel sempurna yang mematikan tampilan daftar saat ini membuat kontrol Kalender di mana:
-hari (sel) dapat memiliki banyak gaya:
sebagai hari promosi, ulang tahun, hari cacat / tidak ada penjualan / hari libur bank ...
ikon tertanam dengan font khusus yang berbeda di dalamnya, sel memiliki bayangan jika dipilih, gaya lain saat di r
kemarahan, lainnya ketika di awal dan akhir jangkauan
-Memilih kemarahan tanggal dimungkinkan
-tajuk bulan dan gaya tajuk yang disesuaikan
-tajuk bulan memiliki tombol yang memungkinkan beberapa tampilan/tindakan/tampilan khusus pada bulan ini

Bagaimana kalau menambahkan GroupFooterTemplate?

Ini sangat dibutuhkan dalam Formulir :-) CollectionView akan menghilangkan solusi yang mahal, mengatasi batasan, dan mungkin meningkatkan kinerja di hampir setiap aplikasi Formulir yang saya buat dalam 5 tahun terakhir. Pendekatan yang tepat juga - memanfaatkan dan mengekspos kekuatan platform asli.

Jika hanya ada SATU peningkatan yang bisa saya minta untuk Formulir, ini dia.
(sebenarnya, saya melakukannya pada tahun 2017 sebagai tanggapan atas @davidortinau)

Ini benar-benar luar biasa dan sudah lama ditunggu-tunggu! API bersih dan mudah (terima kasih telah mengganti nama HasUnevenRows !).

Acara scrolling sangat dibutuhkan, seperti yang disarankan oleh @dhaligas. Untuk animasi paralaks tetapi juga untuk menyembunyikan tombol aksi mengambang saat menggulir misalnya.

FontIconSource adalah ide yang bagus. Mungkin bagus untuk memberikan daftar ikon default, dengan unicode dipetakan untuk setiap platform (mirip dengan iOS atau UWP).

Ini terdengar seperti apa yang dibutuhkan. API terlihat jauh lebih bersih, memiliki banyak tampilan/wadah yang terstruktur dengan cara ini akan membantu menjaga kode lebih bersih dan sederhana.

Komentar saya sejauh ini:

@dansiegel Perintah ketika Ambang Batas Item Tersisa terpenuhi akan diterima. Tidak yakin itu diperlukan untuk SelectedItems - semua yang Anda katakan (diberitahu tentang perubahan, apa yang telah berubah, dan bahkan mengapa) ditangani secara otomatis selama SelectedItems adalah ObservableCollection (atau apa pun yang mengimplementasikan INotifyCollectionChanged). Saya lebih suka memiliki kode sesedikit mungkin di CollectionView untuk menjaga kompleksitas.

Menggulir: Saya sepenuhnya setuju tentang acara pengguliran. Kami bisa mendapatkannya saat ini untuk Android, tetapi untuk iOS Anda harus membungkus UITableViewSource dan membajak metode Scrolled.

Yang paling penting bagi saya adalah ekstensibilitas. Tolong jangan gunakan kelas internal untuk adaptor dan TableViewSources, dan mohon di perender asli ekspos metode "CreateAdapter" dan "CreateViewSource" (dan serupa untuk platform lain) di mana kita dapat membuat tipe kita sendiri jika kita mau. Kami memiliki ListAdapter kustom untuk dukungan drag and drop di Android, dan seperti yang disebutkan sebelumnya, sebuah UITableViewSources kustom untuk scrolling dan drag and drop. Ini bukan kode yang saya suka karena ada pembungkus kelas internal dll.

Ini tidak hanya berlaku untuk adapter/viewsources. Secara umum di API baru, harap tambahkan poin di mana kami dapat memperluas perilaku jika perlu.

Saya pikir ini adalah fitur yang sangat hebat dan penting!
iOS sudah menggunakan nama UICollectionView, yang dapat menyebabkan kebingungan dan hasil google yang salah saat mencari CollectionView. Apakah ini masalah?

Untuk menghindarinya, pada dasarnya saya menyukai segala sesuatu tentang spesifikasi CollectionView . Mungkin ada baiknya membagi beberapa hal menjadi masalah terpisah, karena saya memiliki pemikiran tentang mereka, karena saya yakin banyak orang lain melakukannya dan saya dapat melihat percakapan semakin sulit untuk diikuti. Sebagai contoh:

Ini dapat ditambahkan nanti, tetapi sesuatu seperti:

public class MultipleFontIconsSource : ImageSource
{
    public List<FontIconSource> Icons { get; set; }
}

akan berguna, untuk mendukung ikon susun: https://fontawesome.com/how-to-use/on-the-web/styling/stacking-icons

Umpan balik saya:

  1. Saya tidak akan menempatkan kemampuan pemilihan item di kelas CollectionView. Sebagai gantinya, saya akan menambahkan kelas dasar abstrak ListCollectionView yang berasal dari CollectionView yang memiliki kemampuan khusus:
public class CollectionView : View
{
   // Common capabilities related to a view capable of displaying a list of items
    public static readonly BindableProperty ItemsLayoutProperty;
    public IItemsLayout ItemsLayout { get; set; }

    public static readonly BindableProperty ItemsSourceProperty;
    public IEnumerable ItemsSource { get; set; }
}

public class ListCollectionView : CollectionView
{
     // Item selection capabilities and other capabilities 

    public static readonly BindableProperty SelectionModeProperty;
    public SelectionMode SelectionMode { get; set; }

    public static readonly BindableProperty SelectedItemProperty;
    public object SelectedItem { get; set; }

    public static readonly BindableProperty SelectedItemsProperty;
    public IList<object> SelectedItems { get; set; }

    public static readonly BindableProperty SelectedItemsProperty;
    public IList<object> SelectedItems { get; set; }
}

Ide saya adalah memiliki CollectionView yang mirip dengan ItemsControl di Windows XAML. ItemsControl mengambil instance Panel yang memposisikan item. Di Formulir, kita akan memiliki CollectionView dan IItemsLayout.
Secara default, jika tidak ada IItemLayout yang diberikan, tata letak default dapat berupa tata letak tumpukan. Dengan cara ini pada dasarnya kita dapat menggabungkan ItemsSource dengan StackPanel dari Windows XAML, atau dengan kata lain, StackLayout !

Selain pemilihan item, ada kemampuan lain yang tidak saya masukkan ke dalam CollectionView, saya akan menambahkannya ke ListCollectionView. Misalnya, CollectionView seharusnya tidak memiliki pengguliran. Dengan cara ini akan mencakup utas ini

  1. Saya akan mengganti nama antarmuka IItemsLayout menjadi ICollectionViewLayout. Kerangka kerja sudah memiliki Layout dan ItemsView . Itu akan menjadi nama yang lebih panjang, tetapi ICollectionViewLayout adalah indikasi kuat untuk apa, ini khusus untuk CollectionView, bukan cara umum untuk menampilkan item.

  2. Saya akan mengganti nama kelas ItemsLayout menjadi OrientedCollectionViewLayout. Ini adalah indikasi kuat untuk apa kelas dasar abstrak sebenarnya, semua kelas turunan menata item dengan cara yang berorientasi. Selain itu, menggunakan "Berorientasi" dalam nama memberikan opsi di masa mendatang untuk menambahkan kelas dasar abstrak yang disebut hanya "CollectionViewLayout". jika beberapa fungsi umum baru diperlukan untuk semua kelas tata letak tampilan koleksi, bukan hanya kelas yang memiliki orientasi.

  3. Menghapus ViewCell dan hanya menggunakan DataTemplate sangat disambut, ini meningkatkan penggunaan kembali.

  1. Bisakah Anda membagikan detail lebih lanjut tentang RefreshView?
    Saya berasumsi RefreshView entah bagaimana harus memetakan ke UIRefreshControl di iOS? Bagaimana cara kerjanya di Android dan UWP?

Jika ada yang tertarik, saya membuat beberapa pembaruan untuk komentar pertama saya di atas.

Saya setuju dengan @andreinitescu bahwa akan lebih baik jika memiliki cara untuk memiliki koleksi non-scrolling. Saya netral jika itu berarti memecahnya menjadi beberapa kelas atau mungkin memiliki sesuatu seperti properti ScrollMode. Saya akan tunduk pada mereka yang memiliki lebih banyak pengalaman desain API daripada saya sendiri dalam hal itu. Tetapi cukup sepele untuk mengimplementasikan daftar item berbasis StackLayout Anda sendiri dengan DataTemplate atau pemilih template, jadi mungkin itu tidak diperlukan.

Meskipun saya menyukai gagasan untuk mengontrol fungsi gulir, saya juga tidak menemukan kasus penggunaan yang menarik untuk "Koleksi" non-gulir yang mencakup semua fitur lanjutan ListView atau CollectionView yang diusulkan dari atas kepala saya. Kasus penggunaan saya untuk daftar non-gulir selalu diselesaikan oleh daftar item sepele. Alasan normal saya untuk tidak menggunakan ListView adalah karena saya tidak ingin seleksi atau saya ingin menyusun daftar secara horizontal. Kedua kasus tersebut tampaknya tercakup dalam spesifikasi yang diusulkan. Saya akan tertarik dengan contoh penggunaan apa pun yang dimiliki orang lain tanpa gulir.

@bmacombe Saya setuju dengan Anda bahwa "sederhana" untuk mengimplementasikan StackLayout yang dapat diikat, tetapi bukan itu yang saya pikirkan. Ini adalah fungsi yang sangat umum, mengapa tidak memilikinya dalam kerangka kerja? Dan dengan beberapa perencanaan, saya pikir itu bisa dilakukan. Seperti yang sudah saya katakan di atas, itu bisa diselesaikan dengan hanya menyebarkan fungsionalitas di dua kelas, kelas dasar (mirip dengan ItemsControl di Windows XAML) dan CollectionView (ListView). Idealnya harus ada kelas Selector dalam hierarki (lihat https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.controls.primitives.selector )

Saya akan mengatakan alasan sepele untuk memiliki opsi non-scrolling adalah bahwa beberapa halaman perlu memiliki ScrollView untuk seluruh halaman, dan daftar item.

Jika Anda melakukannya, saat ini tidak disarankan untuk meletakkan ListView di ScrollView. CollectionView yang dapat diikat yang dapat Anda masukkan ke sana, yang masih berpotensi memiliki semua fitur ListView, adalah sesuatu yang saya perlukan berkali-kali.

Saya menulis hal yang sama dengan BindableStack yang dilakukan orang lain, tetapi yang dipanggang dalam satu akan jauh lebih baik untuk dikerjakan.

@adammeaney Itu masuk akal dan saya telah melakukan hal serupa sekarang setelah saya memikirkannya.

@andreinitescu Saya tidak setuju akan sangat bagus untuk memilikinya. Saya pikir semua orang berada di halaman yang sama untuk apa yang dibutuhkan, hanya bagaimana cara terbaik untuk melakukannya. Saya baik-baik saja dengan salah satu pendekatan selama ada opsi "tidak ada gulir" dari beberapa jenis.

Dalam kerangka kerja saya sendiri, saya selalu bolak-balik dalam membangun banyak fitur menjadi satu kontrol atau memiliki banyak kelas serupa dengan fungsi tambahan. Saya akan baik-baik saja dengan tim Formulir memutuskan untuk mengimplementasikannya yang terbaik, terutama mengingat implementasi platform yang mendasarinya.

@bmacombe Dengan beberapa perencanaan, saya berharap kita bisa mendapatkan dua burung dengan satu batu.
Misalnya, sebuah instance dari kelas CollectionView bekerja dengan cara yang saya sebutkan, jika tidak memiliki set IItemLayout, itu bisa saja dipetakan oleh mekanisme penyaji ke UIStackView asli di iOS atau StackPanel di UWP atau LinearLayout di Android. Atau, agar lebih mudah diimplementasikan, bisa saja menggunakan StackLayout yang ada untuk mengatur tampilan.

Kesan saya adalah bahwa ListView baru harus bertujuan untuk memperbaiki tantangan dengan ListView yang ada tetapi juga memberikan solusi untuk utas "RepeatableBinder" di sini

Kami ingin melihat di mana ListView2 mendarat sebelum mendorong spesifikasi ini ke depan. Ini berisi banyak komponen yang dibutuhkan yang sama dan akan lebih baik untuk menghindari duplikasi.

Saya tidak melihat bagaimana menempatkan semua fungsionalitas di CollectionView seperti yang disarankan oleh spesifikasi di sini akan melakukan pekerjaan dengan benar.

2680 Bisa ditambahkan ke spesifikasi ini? Sehubungan dengan pengaktifan ScrollBar.

@andreinitescu

Bisakah Anda membagikan detail lebih lanjut tentang RefreshView?
Saya berasumsi RefreshView entah bagaimana harus memetakan ke UIRefreshControl di iOS? Bagaimana cara kerjanya di Android dan UWP?

Di UWP, kami kemungkinan akan menggunakan RefreshContainer . Di Android, mungkin SwipeRefreshLayout .

@krdmllr

iOS sudah menggunakan nama UICollectionView, yang dapat menyebabkan kebingungan dan hasil google yang salah saat mencari CollectionView. Apakah ini masalah?

Ini masalah, tapi bukan masalah baru. Kami memiliki masalah yang sama dengan GestureRecognizer, ListView, Grid, dan banyak hal lainnya di Formulir. Kami berjuang dengan ini sedikit secara internal; hanya ada begitu banyak kemungkinan nama untuk "sekelompok item di layar".

"CollectionView" tidak bertentangan dengan apa pun yang saat ini kami miliki di Formulir, tidak bertentangan dengan nama kontrol UWP mana pun (seperti halnya "ListView"), dan tidak _ persis_ seperti UICollectionView (karena awalan "UI"). Ini tidak 100% ideal untuk tujuan pencarian, tetapi kami merasa itu adalah ekspresi terbaik dari maksud kontrol.

Konon, jika seseorang mengusulkan nama alternatif yang langsung membuat kita jatuh cinta, saya dengan senang hati melakukan pencarian dan penggantian.

(Saya ingin menamakannya "ListView2ColonRevengeOfTheListView", tetapi @davidortinau menjatuhkan saya :))

@dansiegel

Beberapa konteks yang baik tentang hal ini adalah memikirkan klien email di mana Anda mungkin mendapatkan satu menu saat Anda menggeser ke kiri dan menu lainnya saat Anda menggeser ke kanan.

Lihat spesifikasi SwipeView - itulah yang kami tuju.

@GalaxiaGuy

mendukung ikon susun

Itu poin yang bagus, kita harus mendukung itu jika memungkinkan. Saya tahu ini berfungsi dengan mesin terbang UWP bawaan; Saya harus melakukan sedikit riset untuk memastikan bahwa jenis susun akan bekerja pada platform lain (saya menduga jawabannya adalah "ya").

Pembaruan: Bagian FontIconSource dari spesifikasi ini telah dipindahkan ke spesifikasinya sendiri .

Saya akan skenario pengguna untuk multi-memilih item dari pilihan, misalnya pemilihan satu atau lebih foto dari album. Skenario yang cukup umum di aplikasi seperti OneDrive atau WhatsApp.

20180527_181626000_ios

@hartez

Konon, jika seseorang mengusulkan nama alternatif yang langsung membuat kita jatuh cinta, saya dengan senang hati melakukan pencarian dan penggantian.

Saya sudah menyarankan nama baru untuk alasan yang berbeda

Berapa nilai SelectedItem ketika SelectionMode adalah Multiple ? Ada 5 opsi yang bisa saya pikirkan:

  1. Item yang terakhir dipilih berdasarkan urutan pemilihan.
  2. Item yang terakhir dipilih berdasarkan urutan sumber.
  3. Item yang terakhir dipilih/dibatalkan berdasarkan urutan pemilihan.
  4. Item yang terakhir dipilih/dibatalkan berdasarkan urutan sumber.
  5. batal



    (2), (3) dan (4) tidak terlalu berguna. Saya menambahkannya hanya untuk menutupi semua opsi. (1) tampaknya menjadi pilihan yang paling logis. (5) jika Anda tidak ingin mendukung SelectedItem sama sekali jika SelectionMode adalah Multiple .

@AmrAlSayed0

Berapa nilai SelectedItem saat SelectionMode berganda?

Saat ini jawabannya adalah "apa pun itu sebelum Anda mengganti SelectionMode ke Multiple ".

@rogihee

Saya akan membuat skenario pengguna untuk item multi-picking dari pilihan

Apakah Anda bertanya apakah skenario pemilihan ini didukung? AFAIK, semua kontrol asli yang ingin kami gunakan mendukungnya, jadi _harus_ didukung di CollectionView.

Gaya yang dapat diikat untuk SelectionMode akan berguna, jika SelectionMode=None, Transparan dll, ini adalah sesuatu yang dilakukan Radlist yang sangat berguna, cara mudah untuk menangani status visual berdasarkan binding. Gaya untuk setiap mode pemilihan akan mencakup skenario ini.

@andreinitescu

Menanggapi komentar Anda dari https://github.com/xamarin/Xamarin.Forms/issues/3172#issuecomment -401015625 (dan di tempat lain):

Anda mengemukakan banyak poin bagus, dan saya ingin memastikan Anda tahu bahwa kami tidak mengabaikannya. Kami hanya belum tahu semua jawabannya. Kami sedang dalam proses meningkatkan API ini sehingga kami dapat melihat di mana ia bekerja dan di mana ia berantakan; Saya menduga bahwa perincian kelas yang Anda sarankan cukup dekat dengan tempat kita harus berakhir.

Kami menyadari bahwa Anda (dan beberapa lainnya) sangat ingin agar kelas menengah tersebut dapat dirender sebagai StackLayout dan Kisi dari item bertemplat (yaitu, "BindableRepeater"), dan itulah salah satu kasus penggunaan yang kami jelajahi.

@alexhardwicke

Secara umum di API baru, harap tambahkan poin di mana kami dapat memperluas perilaku jika perlu.

Metode UpdateX dalam penyaji akan menjadi protected virtual . :)

Dalam semua keseriusan, kami menyadari bahwa ini telah menjadi titik sakit di masa lalu, dan kami mengingatnya saat menulis CollectionView .

  1. Setelah dipikir-pikir, saya benar-benar tidak berpikir CollectionView adalah pilihan yang baik untuk nama kelas tampilan ini.
    Di Windows XAML, CollectionView adalah kelas dasar untuk sumber data item yang digunakan untuk memfilter pengelompokan, lihat https://msdn.microsoft.com/en-us/library/system.windows.data.collectionview (v=vs. 110).aspx
    Mungkin di beberapa titik Xamarin Forms akan mendapatkan kelas untuk tujuan yang sama, dan saya pikir akan masuk akal jika memiliki nama yang sama (CollectionView), terutama ketika memikirkan Standar XAML (apakah ini masih direncanakan?)

    Sejelek dan lucu kedengarannya, ListView2 adalah pilihan yang baik :) Ini adalah praktik yang disarankan di .NET untuk menggunakan akhiran untuk versi ketika nama yang ada adalah satu-satunya nama yang masuk akal:

    JANGAN gunakan sufiks numerik untuk menunjukkan versi baru dari API yang ada, terutama jika nama API yang ada adalah satu-satunya nama yang masuk akal (yaitu, jika itu adalah standar industri) dan jika menambahkan sufiks yang berarti (atau mengubah nama) bukan pilihan yang tepat.

    _Pedoman Desain Kerangka: Konvensi, Idiom, dan Pola untuk Pustaka .NET yang Dapat Digunakan Kembali, Edisi ke-2_
    https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/general-naming-conventions

    Pada titik tertentu nanti, semua orang akan menggunakan yang baru dan berkilau. ListView2 yang stabil dan berkinerja :). Maju cepat, mengganti nama ListView2 menjadi ListView, meskipun merupakan perubahan yang melanggar, akan menjadi pemfaktoran ulang sederhana (dan disambut baik) untuk semua orang.

  2. Dalam Formulir Xamarin sudah ada ItemsViewyang terlihat sangat dekat dengan ItemsControl di Windows XAML, kecuali ia tidak memiliki properti tata letak item.
    Alih-alih membuat kelas CollectionView baru, apakah mungkin menggunakan ItemsView yang ada?juga sebagai kelas dasar untuk ListView baru?

  3. Ada tantangan yang jelas dalam desain dan implementasi API, dengan menggunakan kontrol platform asli yang menampilkan item daftar tetapi masih memiliki fleksibilitas untuk memiliki sesuatu seperti "BindableRepeater" yang dimaksudkan untuk menampilkan yang sederhana, lebih ringan, tidak dapat digulir dan tidak -daftar item yang dapat dipilih.
    Sepertinya Uno berhasil melakukannya:

Alih-alih membuat kelas CollectionView baru, apakah mungkin menggunakan ItemsView yang ada juga sebagai kelas dasar untuk ListView baru?

Ada ItemsView<T> , tetapi kami tidak ingin menggunakannya. Ia menggunakan TemplatedItemsList , yang merupakan bagian dari kesalahan yang kami coba hindari dengan kontrol baru ini.

Pada titik tertentu nanti, semua orang akan menggunakan yang baru dan berkilau. ListView2 yang stabil dan berkinerja :). Maju cepat, mengganti nama ListView2 menjadi ListView, meskipun merupakan perubahan yang melanggar, akan menjadi pemfaktoran ulang sederhana (dan disambut baik) untuk semua orang.

Optimisme Anda menarik, tetapi kami harus bekerja dengan asumsi bahwa ListView(1) selamanya, dan bahwa perubahan besar seperti penggantian nama ListView2 tidak akan diizinkan.

Saya pikir menjadi setara dengan Windows XAML masuk akal, tapi ok, gunakan nama apa pun yang Anda inginkan, selama kontrol baru memenuhi janjinya. Kerangka kerja Uno tampaknya telah berhasil melakukan itu, jadi sekarang saya ingin melihat apa yang kalian bawa dalam Formulir Xamarin.

@gmwilhelm

https://github.com/xamarin/Xamarin.Forms/issues/3172#issuecomment -400925994

Poin bagus. Saya sementara menambahkannya ke API. Saya katakan dengan ragu-ragu, karena saya benar-benar dapat melihat bagaimana kami dapat mengimplementasikannya di iOS dan Android, tetapi UWP mungkin menantang.

Tetapi saya tidak dapat menyangkal bahwa itu masuk akal dan simetris yang menyenangkan.

Bagaimana kalau menambahkan GroupItemsBinding ?

Itu akan membiarkan Grup berisi properti tipe koleksi, alih-alih mengharuskan grup diturunkan dari koleksi, seperti yang dilakukan ListView. Batasan ListView yang ada ini telah memaksa saya untuk melakukan duplikasi struktur data berkelompok yang mahal pada beberapa kesempatan. Menambahkan GroupItemsBinding akan mencegah hal ini dan memungkinkan pemetaan yang lebih fleksibel ke struktur data yang dikelompokkan.

Contoh yang digunakan dalam dokumentasi GroupDisplayBinding dapat berupa:

```C#
class Group // Perhatikan bahwa Group tidak harus diturunkan dari ObservableCollection
{
grup publik (string firstInitial) { FirstInitial = firstInitial; }

public string FirstInitial { get; private set; }

public ObservableCollection<Person> Persons { get; set; } // We use a property for the group items instead

}

ListView BuatListView()
{
var listView = ListView baru {
GroupItemsBinding = Binding baru (nama(Group.Persons))
// ...
};
// ...
}

```

Mengingat bahwa ini adalah bagian dari apa yang dilakukan UICollectionView dalam hal tata letak, saya merasa kita harus memilih nama yang berbeda untuk menghindari kebingungan dengan kemampuan dalam kontrol.

Untuk lebih jelasnya, kontrol ini belum tersedia untuk digunakan benar? Saya mencoba merujuknya tetapi proyek saya tidak dapat menemukannya

@titonton Masalah ini hanya untuk membahas spesifikasi CollectionView, implementasinya bahkan belum dimulai, dan saya rasa tidak akan sampai spesifikasi diselesaikan.

@AmrAlSayed0 Sebenarnya seharusnya sudah dimulai karena dipindahkan ke "Sedang berlangsung di Sprint 139" 11 hari yang lalu.

Sangat tidak jelas bagaimana ini dimulai mengingat tidak jelas apa keputusan tentang API

@opcodewriter Itulah yang saya pikirkan. @AmrAlSayed0 Terima kasih atas klarifikasinya.

Bisakah seseorang mengklarifikasi apa status spesifikasi ini saat ini? Apakah ada sesuatu yang hilang di mana komunitas dapat membantu?

@migueldeicaza @hartez Memberi nama ini akan sulit jika Anda tidak ingin diberi nama CollectionView . Bagaimana dengan CatalogView ?

1

Katalog sering dirancang dalam satu atau lebih kolom dan dengan beberapa baris item dengan font, teks, tata letak, dll yang serupa.

Sampel:

022

@hartez Apakah Anda merasa API sudah hampir selesai sekarang? Berapa banyak pekerjaan yang telah dilakukan sejauh ini? Banyak dari kita akan senang untuk mendapatkan kendali ini secepatnya. :)

@adrianknight89 Saya percaya ini adalah cabang yang berfungsi. https://github.com/xamarin/Xamarin.Forms/tree/lv2spike

Kami belum mengantisipasi bahwa itu siap untuk pratinjau untuk sementara waktu, tetapi saya akan menunjukkan/mendemonstrasikan hasil dari upaya saat ini dalam beberapa minggu mendatang untuk memvalidasi kemajuan dan umpan balik yang cepat.

Saya bingung. Karena Anda sudah memiliki beberapa demo internal, sepertinya Anda sudah cukup jauh dengan implementasinya.
Bukankah ini berarti banyak dari API telah dipaku? Apakah Anda mengikuti spesifikasi API di sini?
Saya tidak dapat melihat bagaimana spesifikasi saat ini dapat mengatasi apa yang telah dibahas di sini dan di utas lainnya di sini https://github.com/xamarin/Xamarin.Forms/issues/1718
Lebih tepatnya, API tidak cukup fleksibel untuk memungkinkan, misalnya, kontrol sederhana seperti StackLayout yang tidak dapat digulir dan dapat diikat.

Apakah kontrol baru memungkinkan untuk menempatkan item terikat dalam tumpukan, tanpa bilah gulir, seperti StackLayout ?

Terima kasih sudah lama menunggu ini 👍

Setelah banyak diskusi internal dan upaya untuk menyusun arsitektur yang sesuai, kami telah memutuskan bahwa CollectionView akan _tidak_ menangani skenario tata letak yang dibahas di #1718. Dengan kata lain, itu tidak akan menangani pengikatan kumpulan objek ke item di Tata Letak Xamarin.Forms apa pun.

Tujuan awal CollectionView adalah untuk memungkinkan pengguna dengan mudah memanfaatkan berbagai kontrol daftar/grid asli modern (UICollectionView, RecyclerView, ListView/GridView, dll.).

Sangat menggoda untuk mencoba menjadikan CollectionView sebagai kontrol satu atap untuk kebutuhan "render dan atur template ini dengan data", termasuk semua skenario di mana langkah "atur" ditangani oleh Forms Layouts (FlexLayout, StackLayout, dll. ). Dan ada beberapa fungsi yang tumpang tindih (misalnya, kedua skenario menggunakan DataTemplates). Tetapi pada akhirnya, mereka memiliki perbedaan arsitektur mendasar yang besar, dan mencoba menyatukannya akan menghasilkan sesuatu yang lebih sulit untuk dipertahankan dan membingungkan daripada hanya membiarkannya sebagai kontrol terpisah. Kami tidak ingin membuat sesuatu yang begitu rumit sehingga kami akhirnya harus mengimplementasikan ListView3 dalam beberapa tahun. Saya akan menguraikannya lebih lanjut di bawah ini.

Hasil dari ini adalah bahwa CollectionView akan tetap fokus pada masalah yang memungkinkan pengguna Formulir untuk menggunakan kontrol daftar/kisi asli dan mendapat manfaat dari mesin tata letak dan virtualisasi mereka. Dan #1718 akan diperbarui untuk mencerminkan API yang memungkinkan pengguna Formulir untuk mengikat ItemsSource dan ItemTemplate ke berbagai mesin Tata Letak Formulir.

Bagi mereka yang tertarik dengan _why_ dari dua kontrol versus satu:

Perbedaan mendasar antara apa yang telah diuraikan di sini (sebagai CollectionView) dan proposal di #1718 adalah _di mana_ tata letak terjadi.

CollectionView bertujuan untuk menggunakan mesin tata letak asli (yang telah sangat dioptimalkan oleh pengembang platform) untuk menangani tata letak. Beberapa kode kustom dari Formulir terlibat (misalnya, dalam menyediakan hal-hal seperti logika SnapPoints di Android dan iOS), tetapi sebagian besar mesin tata letak asli (dan implementasi virtualisasi asli) melakukan pekerjaan berat. Ini membuat perbedaan besar dalam hal kinerja.

Jadi, informasi tata letak apa pun yang diberikan pengembang ke CollectionView hanya diteruskan ke perender di setiap platform untuk interpretasi; ini secara efektif merupakan spesifikasi yang diterjemahkan ke bahasa lokal (LinearLayoutManager/GridLayoutManager di Android, UICollectionViewFlowLayout di iOS, dll.). Di luar DataTemplate, Formulir tidak melakukan pekerjaan tata letak apa pun.

Sebaliknya, Tata Letak Formulir (FlexLayout, StackLayout, AbsoluteLayout, dll.) diletakkan seluruhnya di lapisan Formulir. Perender untuk Tata Letak Formulir sangat sedikit. Dan tidak ada virtualisasi yang terjadi; semua item dibuat dan ditempatkan di tata letak dari awal.

Mencoba menggabungkan kedua hal ini bersama-sama mengarah pada beberapa pertanyaan sulit, termasuk:

  1. Bagaimana cara kerja pemetaan perender? CollectionView yang menggunakan StackLayout memiliki perender yang sangat berbeda dari CollectionView yang perlu menggunakan RecyclerView. Apakah kita menyatukannya dan menyembunyikan RecyclerView saat kita tidak membutuhkannya? Apakah kita memiliki penyaji yang berasal dari DefaultRenderer? Jika kita melakukannya, kita selalu memiliki lapisan ViewGroup tambahan yang sebenarnya tidak kita butuhkan ...

  2. Bagaimana kami menangani ScrollViews? UICollectionView menangani tampilan penggulirannya sendiri, tetapi jika StackLayout perlu pengguliran, pengguna biasanya menambahkannya secara manual di Formulir. Apakah kita menambahkan lapisan lain untuk menyisipkan pengguliran secara otomatis jika perlu? Apakah kami menonaktifkan/menghapus ScrollView yang ditambahkan secara manual jika tata letak memanggil UICollectionView?

  3. Dalam hal ini, ke mana perginya metode ScrollTo?

... dan seterusnya. Semua masalah ini _dapat dipecahkan_, tetapi setiap solusi menambahkan _kompleksitas_. Dan seperti yang telah ditunjukkan di #1718, menambahkan ItemsSource dan ItemsTemplate ke Tata Letak Formulir tidak terlalu sulit atau rumit. Membuatnya rumit hanya dengan menggabungkan dua skenario berbeda ini tidak sebanding dengan manfaatnya.

Saya bingung. Karena Anda sudah memiliki beberapa demo internal, sepertinya Anda sudah cukup jauh dengan implementasinya. Bukankah ini berarti banyak dari API telah dipaku? Apakah Anda mengikuti spesifikasi API di sini?

Kami mengikuti API yang diposting di sini. "Cukup jauh" mungkin berlebihan; sejauh ini kami telah menerapkan beberapa bagian spesifikasi yang tidak kontroversial untuk memverifikasi bahwa itu mungkin dan kami tidak akan menemui jalan buntu. Dengan asumsi kami tidak mengalami masalah apa pun, sebagian besar dari apa yang telah kami implementasikan hingga saat ini kemungkinan akan ada dalam versi yang dirilis. Namun semua yang ada di spesifikasi masih dapat berubah, seperti semua yang telah kami terapkan sejauh ini.

Saya tidak dapat melihat bagaimana spesifikasi saat ini dapat mengatasi apa yang telah dibahas di sini dan di utas lainnya di sini #1718. Lebih tepatnya, API tidak cukup fleksibel untuk memungkinkan, misalnya, kontrol sederhana seperti StackLayout yang tidak dapat digulir dan dapat diikat.

Benar, dan bagian dari apa yang telah kami kerjakan adalah menentukan apakah CollectionView _could_ cukup mencakup kasus penggunaan tersebut. Kami telah mengambil keputusan tentang itu; lihat https://github.com/xamarin/Xamarin.Forms/issues/3172#issuecomment -424413234.

Mengingat bahwa ini adalah bagian dari apa yang dilakukan UICollectionView dalam hal tata letak, saya merasa kita harus memilih nama yang berbeda untuk menghindari kebingungan dengan kemampuan dalam kontrol.

Seperti yang saya katakan (https://github.com/xamarin/Xamarin.Forms/issues/3172#issuecomment-401186893), saya terbuka untuk nama lain.

Bagaimana dengan CatalogView?

Katalog sering dirancang dalam satu atau lebih kolom dan dengan beberapa baris item dengan font, teks, tata letak, dll yang serupa.

Ini adalah ide yang menarik. Itu pasti tidak bertentangan dengan nama kontrol yang ada.

@hartez Sebagai orang acak di internet, yang menjadi lebih akrab dengan internal Xamarin Forms (dan sudah cukup akrab dengan UITableView dan UICollectionView) saya pikir ini adalah langkah yang tepat.

Apakah masih mungkin untuk menyediakan tata letak khusus (meskipun itu berarti menyediakan implementasi terpisah per platform)?

Apakah masih mungkin untuk menyediakan tata letak khusus (meskipun itu berarti menyediakan implementasi terpisah per platform)?

Sangat. Anda dapat memberikan tata letak Anda sendiri yang ditandai dengan IItemsLayout dan perender khusus Anda dapat menafsirkannya sesuka Anda.

Misalnya, sebagai bukti konsep, saya mensubklasifikasikan perender Android untuk CollectionView dan menambahkan kemampuan untuk menafsirkan kelas FlexLayout : IItemsLayout yang menyertakan banyak properti Tata Letak Flex. Ini meneruskan properti tersebut ke FlexBoxLayoutManager Google dan menggunakan pengelola tata letak itu dengan RecyclerView. Setelah kami membuat pratinjau publik tersedia, saya mungkin akan memberikan contoh itu di GitHub sehingga orang-orang memiliki referensi mudah tentang cara melakukan hal semacam itu.

Tujuannya adalah untuk membuat hal ini sangat, sangat fleksibel.

@hartez
Apakah masalah yang dijelaskan di https://github.com/xamarin/Xamarin.Forms/issues/3749 diperbaiki dengan CollectionView?
Karena di sini saya melihat CollectionView hanya memiliki properti ItemTemplate , yang sepertinya akan memiliki masalah yang sama seperti ListView .

@hartez
Apakah masalah yang dijelaskan di #3749 diperbaiki dengan CollectionView?
Karena di sini saya melihat CollectionView hanya memiliki properti ItemTemplate , yang sepertinya akan memiliki masalah yang sama seperti ListView .

@andreinitescu Terima kasih telah menunjukkan diskusi itu, saya tidak mengetahui masalah ini dengan DataTemplate.

Saya akan meluangkan waktu minggu depan melihat ke dalam sejarah DataTemplate - mengapa itu dirancang dengan cara ini, dan apakah ada masalah kompatibilitas mundur dengan memperbaiki CreateContent untuk hanya secara otomatis melakukan hal yang benar (keduanya di ListView dan CollectionView).

@hartez Sebagai contoh bagaimana saya mengatasi masalah ini saat membuat kontrol repeater saya sendiri.

//Periksa untuk melihat apakah kita memiliki pemilih template atau hanya template
var templateToUse = itemTemplate adalah DataTemplateSelector templateSelector ? templateSelector.SelectTemplate(item, null) : itemTemplate;

Jadi dalam kasus seperti itu, memperbaiki CreateContent saja tidak akan merusaknya, hanya membuatnya tidak diperlukan. Tapi saya setuju dengan @andreinitescu bahwa memisahkan ItemTemplate dan ItemTemplateSelector sebagai properti terpisah akan ideal...mungkin karena latar belakang WPF dan SL saya.

@bmacombe IMHO, Ini bukan hanya masalah preferensi yang disejajarkan dengan WPF/SL, ini benar-benar masalah, itu menciptakan kebingungan. Lihat #3544

@andreinitescu Itu membuat kebingungan :) Percayalah, saya bingung pada awalnya ketika saya mencoba untuk mendukung DataTemplate dan DataTemplateSelector di repeater saya! Terutama ketika ada kesalahan ketika saya menetapkan DateTemplateSelector ke properti DataTemplate saya ketika bekerja di semua tempat XF yang menggunakannya. Mengambil beberapa penggalian kode sumber untuk mengetahuinya. Mungkin bukan masalah bagi seseorang yang hanya menggunakan kontrol XF bawaan, tetapi mencoba melakukannya sendiri dan menggunakannya ... benar-benar membingungkan.

Bisakah kami mengadakan acara gulir di CollectionView? Sampai CollectionView dirilis, saya punya saran untuk ListView https://github.com/xamarin/Xamarin.Forms/issues/4323

Dan, apakah mungkin untuk membuat tata letak yang tidak teratur dan dinamis, seperti PInterest dengan contoh:

Soalnya, setiap gambar memiliki ketinggiannya sendiri :-)

Tidak yakin bahwa tata letak seperti itu dapat didukung?

image

Pembaruan: dari daftar proposal nama, yang paling dekat yang kami temukan adalah "ItemsView", ini untuk menghindari penggunaan istilah "CollectionView" yang memberi kesan kepada orang-orang bahwa ini selengkap iOS "UICollectionView"

Hai, saya masih baru di Xamarin, tetapi telah bekerja dengan ListView dengan menggunakan DataTemplateSelector.
Ketika saya mencoba menguji menggunakan CollectionView dengan DataTemplateSelector , itu menimbulkan kesalahan

Pengecualian yang Tidak Tertangani:

System.InvalidOperationException: LoadTemplate tidak boleh terjadi null

Apakah ada bug yang diketahui terkait dengan DataTemplateSelector?
Saya bisa saja salah menerapkannya. Apakah ada contoh penggunaan DataTemplateSelector dengan CollectionView?

@hartez @davidortinau ada alasan kenapa KeepItemsInView tidak diberi nama KeepFirstItemInView untuk disejajarkan dengan KeepLastItemInView ? Nama saat ini jamak (yaitu menyarankan beberapa item) sedangkan deskripsi mengatakan itu hanya menyimpan item pertama yang terlihat di viewport.

Juga, apakah ada cara Anda bisa mengekspos API untuk mendapatkan daftar tampilan saat ini di viewport? Suatu malam, saya sedang mengerjakan membuat tampilan video untuk disematkan di sel ListView dan diputar otomatis/dijeda berdasarkan visibilitas viewport, tetapi hampir tidak mungkin dengan ItemAppearing dan ItemDisappearing peristiwa terutama ketika mereka terus menembak dalam segala macam cara yang tidak terduga dengan daur ulang sel dan/atau pengguliran cepat. Sangat menantikan CollectionView mendukung fungsi semacam ini dengan cara yang lebih andal.

autoplayvideos demo

Hal lain yang hebat untuk dimiliki adalah kemampuan untuk membuat tampilan yang bergantung dan diperkecil yang terlepas dari induknya sementara pengguna memiliki kemewahan untuk menggulir pada umpan saat ini. Saya telah melihat ini di YouTube karena kami sekarang dapat terus menonton video saat ini sambil memiliki kemampuan untuk terus menjelajah. Saya tidak yakin apakah ini sesuatu yang CollectionView dapat atau harus mendukung btw, tetapi ini adalah sesuatu untuk dipikirkan.

youtube1-5abab8210e23d9003787855d

Jadi saya bermain-main dengan build malam saat ini (4.0.1.43780-nightly) yang menyelesaikan beberapa masalah pengubahan ukuran dibandingkan dengan build pratinjau saat ini.

Saran yang saya miliki adalah menambahkan sesuatu seperti RowSpacing/ColumnSpacing atau GridSpacing ke tata letak grid karena itu membuatnya lebih mudah untuk menempatkan item Anda dengan benar tanpa menggunakan margin/padding pada masing-masing item.
Hal lain adalah menambahkan Padding atau mungkin EdgeOffset ke CollectionView atau Layout untuk menghindari penggunaan Margin, yang memotong item seperti yang ditunjukkan di sini:
android-margin-image
Margin juga memotong animasi "seret" di Android seperti yang Anda lihat di sini:
android-margin

Saran yang saya miliki adalah menambahkan sesuatu seperti RowSpacing/ColumnSpacing atau GridSpacing ke tata letak grid karena itu membuatnya lebih mudah untuk menempatkan item Anda dengan benar tanpa menggunakan margin/padding pada masing-masing item.

Setuju, dan itu ada di radar kami - lihat #4681.

Pembaruan: dari daftar proposal nama, yang paling dekat yang kami temukan adalah "ItemsView", ini untuk menghindari penggunaan istilah "CollectionView" yang memberi kesan kepada orang-orang bahwa ini selengkap iOS "UICollectionView"

bagaimana dengan "FloatView"?

Selain acara ItemAppearing/Disappearing yang disebutkan di atas, rencana apa pun untuk mendapatkan tampilan item:
View GetView(object item)
Jika item tidak terwujud, saya kira itu harus mengembalikan nol.

Saya menggunakan Daftar Vertikal dan tampaknya ada ketidakkonsistenan dalam cara merendernya di iOS vs Android.

Di iOS, dengan label akan mengambil 100% dari lebar.
screenshot 2019-01-15 13 56 01

Di Android, itu hanya akan mengambil lebar kontennya.
screenshot 2019-01-15 13 57 59

Saya hanya bisa mengaturnya dengan benar dengan definisi lebar statis.
Apakah ada solusi Android yang menghormati properti Grid Width="Auto" ?

Saya menggunakan Daftar Vertikal dan tampaknya ada ketidakkonsistenan dalam cara merendernya di iOS vs Android.

@shwanton Silakan buka masalah terpisah untuk bug ini, dan saya akan memeriksanya.

@shwanton saya memiliki masalah serupa yang diperbaiki ketika saya beralih ke umpan malam

@krdmllr Saya dapat mengonfirmasi, itu telah diperbaiki di versi terbaru. Terima kasih.

Hai. Apakah akan ada acara ItemTapped di CollectionView yang mirip dengan ItemTapped ListView? Saya tidak melihatnya di spek. Terima kasih.

@uvirra Ada masalah untuk pertanyaan DataTemplateSelector . Lihat #4826.

@hartez Akankah ada kebutuhan untuk strategi daur ulang barang seperti tiga yang ada untuk ListView ? Anda memang menyebutkan beberapa kali virtualisasi asli yang dimanfaatkan oleh CollectionView . Saya hanya ingin mendapatkan klarifikasi lebih lanjut tentang ini.

Saya juga ingin tahu bagaimana tampilan RefreshView di iOS. Penyegaran saat ini untuk ListView membutuhkan UITableView 's Bounces properti untuk diaktifkan sedangkan, di Android, tampilan penyegaran ditarik di atas item yang paling terlihat (yang Saya pribadi lebih suka).

@hartez Akankah ada kebutuhan untuk strategi daur ulang barang seperti tiga yang ada untuk ListView ? Anda memang menyebutkan beberapa kali virtualisasi asli yang dimanfaatkan oleh CollectionView . Saya hanya ingin mendapatkan klarifikasi lebih lanjut tentang ini.

Desain saat ini tidak memerlukan strategi daur ulang. Saat ini, kami hanya menggunakan virtualisasi yang disediakan oleh kontrol asli, yang melakukan pekerjaan yang sangat baik di luar kotak.

Apakah akan ada kebutuhan? Harapan saya adalah "tidak", dan kami akan melakukan yang terbaik untuk menghindarinya karena ini menambah banyak kerumitan (baik untuk pengguna maupun untuk pemeliharaan). Jika pada akhirnya kami menyimpulkan bahwa kami membutuhkan sesuatu seperti itu, kami akan mendekati desainnya dengan sangat, sangat hati-hati.

Bagaimana dengan acara yang di-scroll? Sebagian besar UI/UX modern menyediakan header paralaks, tampilkan/sembunyikan item (tombol, header, filter, dll.) pada pengguliran dan sejenisnya.
Saya pikir kontrol baru yang luar biasa seperti ini harus mendukung skenario modern.

seharusnya tidak menjadi masalah, baik recyclerview dan UICollectionview mendukung acara yang digulir di luar kotak.

Bahkan Carouselview (berdasarkan collectionview) mendukung acara yang digulir dengan arah, nilai pengguliran, dan delta: https://github.com/xamarin/Xamarin.Forms/issues/4996

Untuk menindaklanjuti komentar @Evolutionlab tentang ini menjadi kontrol luar biasa baru yang harus mendukung skenario modern, saya ingin melihat dukungan virtualisasi yang lebih baik.

https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/listview-and-gridview-data-optimization

Jika ini terlalu banyak untuk dipahami, saya ingin mendapatkan akses ke VisibleItems sehingga saya dapat melakukan virtualisasi di ViewModel saya.

Pertahankan kerja hebat!

@hartez Saya hanya berpikir akan keren untuk membiarkan pengembang menentukan ambang minimum/maksimum pada jumlah item yang dipilih. Saat ini saya sedang membuat galeri foto khusus yang tidak boleh memilih lebih dari 5 foto. Saat ambang batas tercapai, peristiwa ketuk pada sel harus diabaikan kecuali jika mereka membatalkan pilihan item.

Ini juga dapat dilakukan dengan menyetel SelectedItems (yang belum diterapkan) pada acara SelectionChanged berdasarkan jumlah CurrentSelection , tetapi ini akan memicu SelectionChanged dua kali. Menurut pendapat saya, kita harus memiliki cara untuk secara proaktif mengontrol perilaku seleksi sebelum apa pun mencapai Core.

Bermain dengan CollectionView sedikit hari ini, saya perhatikan UWP jauh di belakang Android dan iOS, itulah sebabnya saya mengerti.

Hanya ingin mengonfirmasi bahwa itu direncanakan untuk memiliki dukungan penuh UWP ketika diselesaikan?

Selain acara ItemAppearing/Disappearing yang disebutkan di atas, rencana apa pun untuk mendapatkan tampilan item:
View GetView(object item)
Jika item tidak terwujud, saya kira itu harus mengembalikan nol.

Bagaimana dengan ItemAppearing? Saya tidak melihat berita tentang itu

Saya bermain-main dengan CollectionView dan menghadapi masalah dengan ketinggian baris yang tidak rata. Saya melihat ada ItemSizingStrategy diperkenalkan akhir-akhir ini, tapi tetap saja bertingkah aneh.

Saya bermain-main dengan DataTemplateGallery dan ketika beralih ke MeasureAllItems saya mendapatkan hasil berikut (iPhone 6, iOS 12.1.4):

Setelah menggesek ke kanan dan kembali, hasilnya berubah menjadi:

@hartez Apakah ini diharapkan berfungsi atau masih dalam proses (tidak dapat menemukan masalah untuk itu)?

Apakah RemainingItemsThresholdReached sudah diimplementasikan?

Ini tidak tersedia di XAML kontrol CollectionView di 4.0.0.169046-pre5.

Adakah yang bisa memberi tahu saya RemainingItemsThresholdReached adalah bagian dari Rilis 4.0? Jika ya, dapatkah Anda memberikan contoh kode tentang cara menggunakan fitur tersebut.

@Dresel Bisakah Anda membuka tiket baru jika menurut Anda ini bug? Lebih baik jika dilacak.

@melucas @chandrubk Saya rasa RemainingItemsThresholdReached belum dikerjakan.

https://github.com/xamarin/Xamarin.Forms/branches/all

Saya juga ingin melihat fitur ini (bersama dengan tampilan Refresh) diimplementasikan segera karena saya tidak dapat menyentuh CollectionView tanpanya.

4323

Kami membutuhkan Acara yang Digulir seperti yang dilakukan ScrollView

Salam,

4323

Kami membutuhkan Acara yang Digulir seperti yang dilakukan ScrollView

Salam,

Saya mendukung ini.
Selain itu, akan luar biasa untuk mendapatkan dan acara ketika pengguliran dihentikan/selesai.

Di IOS, UICollectionview adalah subclass dari UIScrollview, jadi kita bisa mendapatkan scrollViewDidEndDecelerating dari UIScrollViewDelegate

Di Android saya pikir kita dapat memperpanjang RecyclerView.OnScrollListener ?

Ini akan membuka skenario yang lebih canggih dan dipoles untuk penyegaran kustom, paralaks, elemen gulir yang disinkronkan, dll.

Adakah kemungkinan ada animasi di luar kotak untuk Android, seperti Recycler View?

Adakah kemungkinan ada animasi di luar kotak untuk Android, seperti Recycler View?

Animasi mana yang Anda maksud? Perender Android untuk ini dibangun di RecyclerView, jadi sudah menggunakan animasi default untuk hal-hal seperti menambahkan/menghapus item.

Hai,

Saya menggunakan 4.0.0.304370-pre8.
Contoh dari (tautan di bawah) tidak menampilkan apa pun di UWP, saat menggunakan CarouselView.
Tapi CollectionView menampilkan daftar. Apakah ada konfigurasi khusus yang diperlukan untuk mengaktifkan CarouselView untuk UWP?

https://devblogs.microsoft.com/xamarin/xamarin-forms-4-0-feature-preview-an-entirely-new-point-of-collectionview/

Terima kasih.

Hai @noypi ,

Sementara CollectionView secara teknis dapat "bekerja" pada tingkat yang agak kecil di UWP, implementasi penuh CollectionView dan CarouselView secara ketat dilakukan di Android dan iOS untuk memulai. Tidak ada pekerjaan resmi untuk UWP yang dijadwalkan saat ini, tetapi kami terus mengumpulkan umpan balik. Jika Anda ingin mendiskusikan pekerjaan seperti apa yang Anda lakukan di UWP khususnya, Anda dapat mengirimi saya email di paul. [email protected].

Menurut spesifikasi, apakah TableView akan digantikan oleh CollectionView sepenuhnya?

Pertanyaan lain: karena tidak ada sel lagi, bagaimana cara menambahkan indikator perubahan warna untuk iOS? Dengan ListView dimungkinkan melalui penyaji khusus.

Menurut spesifikasi, apakah TableView akan digantikan oleh CollectionView sepenuhnya?

TableView akan tetap ada. Kami tidak akan menghapus kontrol yang ada.

Pertanyaan lain: karena tidak ada sel lagi, bagaimana cara menambahkan indikator perubahan warna untuk iOS? Dengan ListView dimungkinkan melalui penyaji khusus.

Di iOS, CollectionView merender menggunakan UICollectionView, yang berarti selnya adalah UICollectionViewCells. Dan UICollectionViewCells tidak memiliki tampilan aksesori (seperti indikator pengungkapan). Jadi untuk elemen UI apa pun seperti indikator pengungkapan atau tanda centang, Anda harus membuatnya di ItemTemplate.

Bagaimana cara menonaktifkan seleksi pada jenis item tertentu? Saya memiliki beberapa templat data dan ingin menonaktifkan pilihan pada beberapa di antaranya.

@hartez Saat mengatur ItemTemplate ke DataTemplateSelector saya mendapatkan pengecualian: System.InvalidOperationException: LoadTemplate should not be null

Saya pikir template akan didukung di luar kotak

@hartez Saat mengatur ItemTemplate ke DataTemplateSelector saya mendapatkan pengecualian: System.InvalidOperationException: LoadTemplate should not be null

Saya pikir template akan didukung di luar kotak

Mereka seharusnya; mungkin Anda mengalami bug. Harap buka masalah agar kami dapat menyelidikinya.

@toomasz Sebelum membuka masalah, bisakah Anda memperbarui Nuget Anda ke pra-rilis terbaru (atau malam) dan menguji pemilih lagi? Masalah yang Anda lihat muncul saat tidak ada dukungan untuk DataTemplateSelector .

@hartez Apakah ada pekerjaan yang sedang dilakukan di header&footer serta tampilan penyegaran? Jika saya dapat meluangkan waktu, saya mungkin akan melihat salah satunya, tetapi saya ingin memastikan bahwa saya tidak menginjak kaki Anda.

@adrianknight89 Ini bekerja pada 4.0! Luar biasa

@hartez Apakah ada pekerjaan yang sedang dilakukan di header&footer serta tampilan penyegaran? Jika saya dapat meluangkan waktu, saya mungkin akan melihat salah satunya, tetapi saya ingin memastikan bahwa saya tidak menginjak kaki Anda.

Tidak ada yang dilakukan saat ini - jika Anda ingin mencobanya, itu bagus.
Sebagai peringatan, setelah beberapa diskusi hari ini kami telah menambahkan dua properti baru yang terkait dengan header dan footer - IsHeaderSticky dan IsFooterSticky , untuk menentukan apakah mereka menggulir dengan item atau tetap di tempatnya. Jika Anda ingin mengatasinya bersama dengan header/footer, itu akan luar biasa, tetapi juga akan sangat bagus jika kami membuatnya bekerja dengan satu atau lain cara dan dapat mengimplementasikan properti itu nanti.

Apakah ada rencana untuk mendukung tampilan koleksi di UWP?

Ya. Implementasinya sedikit di belakang platform lain saat ini, tetapi rencananya adalah untuk mendukungnya sepenuhnya. Anda dapat mengikuti kemajuan fitur di https://Gist.github.com/hartez/7d0edd4182dbc7de65cebc6c67f72e14

Ada info tentang RefreshView?
Saya memiliki versi beta Xamarin 4 terbaru dan jenis RefreshView tidak dapat ditemukan

Ada info tentang RefreshView?
Saya memiliki versi beta Xamarin 4 terbaru dan jenis RefreshView tidak dapat ditemukan

RefreshView belum diimplementasikan. Anda dapat melacak kemajuan fitur di sini .

Tambahkan GroupItemsBinding ?

Bagaimana dengan menambahkan properti GroupItemsBinding untuk menentukan properti mana yang berisi item turunan dari suatu grup? Itu akan memungkinkan untuk menyematkan properti koleksi anak alih-alih memaksa grup untuk mewarisi dari koleksi.

Keuntungan:

  • Kemampuan untuk (menghapus) serialisasi koleksi yang dikelompokkan ke/dari JSON.
    Mewarisi grup dari koleksi memblokir serialisasi JSON (karena larik JSON hanya mendukung rentang nilai dan bukan properti). (De)serialisasi model tampilan diperlukan untuk mempertahankan status model tampilan saat aplikasi beralih ke latar belakang, atau jika API aplikasi Anda mengirimkan model tampilan kepada Anda. Solusi saat ini adalah memiliki struktur data kedua dan melakukan duplikat + transformasi yang mahal pada setiap pembaruan data.
  • Kemampuan untuk menggunakan kelas dasar Anda sendiri untuk item grup (misalnya ViewModelBase )
  • Hindari mengotori objek grup dengan semua properti koleksi yang diwariskan

Misalnya Anda dapat menulis contoh pengelompokan ini
```C#
PageTypeGroup kelas publik : Daftar
{
Judul string publik { dapatkan; mengatur; }
// Properti lainnya ...
}

like this instead:

```C#
public class PageTypeGroup
{
    public string Title { get; set; }
    // More properties ...

    public List<PageModel> Children { get; set; }
}

dengan XAML:

C# <CollectionView GroupItemsBinding = "{Binding Children}" ...> </CollectionView>

Tidak menentukan GroupItemsBinding akan kompatibel dengan implementasi yang ada, setara dengan GroupItemsBinding="{Binding .}"

PS Saya mengajukan proposal ini sebelumnya, pada Juli 2018 .

Pembaruan 23 Agustus 2019: pengelompokan telah diterapkan tetapi tanpa perbaikan ini; lihat data grup

Saya harap belum terlambat untuk menambahkan ini.

Bagaimana mendukung beberapa tingkat pengelompokan?
Akan memungkinkan untuk menampilkan pohon .

Misalnya Flutter memiliki ExpansionTile ( contoh )

Mengenai CollectionView, saya menemukan masalah yang menurut saya akan menjadi fitur hebat untuk ditambahkan.

Dalam Daftar Horizontal, dengan gulir, biasanya desainer, tambahkan efek "bayangan" pada elemen yang tidak sepenuhnya terlihat di layar. Saat ini (sejauh yang saya tahu) tidak ada cara untuk melakukan ini di Xamarin.Forms. Tidakkah menurut Anda ini akan menjadi fitur yang bagus? Ini bisa sesederhana boolean, yang akan menerapkan "bayangan jatuh" ke elemen yang hanya terlihat dengan persentase X, misalnya.

Saya mengusulkan properti Posisi. Properti ini akan menyimpan indeks item saat ini. Ini akan memungkinkan integrasi ViewPagerIndicator dan indikator serupa dengan mudah.

Saya mengerti menentukan "item saat ini" bisa jadi rumit. Jika gertakan aktif, seharusnya cukup mudah untuk menentukan ke item mana tampilan diambil. Tanpa menjepret, pilihan yang tepat akan bergantung pada kasus penggunaan: mungkin item tersebut menempati awal atau titik tengah tampilan.

Properti ini juga dapat memungkinkan akses dua arah yang mudah sebagai alternatif dari ScrollTo().

@hartez Kami mengharapkan ini siap untuk rilis 4.0 tetapi terkejut melihatnya belum selesai. Kami tidak dapat menguji CollectionView tanpa menggulir dan menyegarkan fungsionalitas. Bisakah Anda memberi tahu kami berapa banyak sprint yang harus kami tunggu sebelum diluncurkan? Kami telah memutuskan untuk tidak mengirimkan apa pun dengan ListView ke depan dan ingin kontrol ini tersedia sesegera mungkin.

@hartez Kami membutuhkan cara untuk CollectionView dengan tata letak daftar untuk mengukur konten itemnya. saya pikir ini adalah kasus penggunaan umum:
image
Dalam contoh ini tombol harus tepat di bawah tampilan koleksi. Saya pikir itu harus bekerja dengan cara ini ketika VerticalOptions Mulai

ketika ambang item yang tersisa mencapai uji properti

Saya memiliki pertanyaan tentang apakah aliran CollectionView dari perilaku item individual meniru perilaku Asli iOS dalam hal perubahan ukuran layar. Saya akan memberi Anda sebuah contoh:

Sel galeri gambar di iOS dibuat dengan CollectionView dan Anda menentukan sel individual. Perilaku di luar kotak adalah berapa banyak sel yang digambar dalam satu baris bersifat dinamis berdasarkan ukuran layar. Di ponsel saya mungkin muat 4 item tapi di tablet saya bisa muat mungkin 8 atau 9.

Akankah versi Formulir juga menawarkan ini? Sejauh contoh yang saya baca, saya hanya melihat di mana Anda mengatur properti GridItemsLayout Span. Ini menghasilkan nilai kode keras dari berapa banyak item yang dapat ditarik dan benar-benar di dunia berbagai ukuran layar, pengkodean keras tampaknya begitu 2014. :-P

UWP memiliki empat status mode pemilihan
{
Tidak ada,
Lajang
Banyak,
Memperpanjang,
}
image

image

Saya pikir Four state di Android dan iOS juga berguna
Lihat saja File explorer
image

Apakah ada rencana untuk properti padding sederhana? #6605 Untuk kasus penggunaan khusus saya, saya mungkin bisa menggunakan header dan footer kosong berukuran tepat (setelah fitur-fitur itu dikembangkan), tetapi itu akan menjadi sedikit peretasan dan tidak cocok untuk tata letak kotak di mana bantalan di keempat sisi mungkin diperlukan.

Setiap rencana untuk mengatur ulang item daftar dalam tampilan koleksi.

Apakah spesifikasi mencakup cara menonaktifkan pilihan untuk item tertentu di CollectionView?

// Any possible API could be helpful
private void OnSelectionChanging(object sender, SelectionChangingEventArgs e)
{
  if (...)
      e.Cancel = true;
 }

Saat ini saya sedang mengatasinya tetapi ini tidak mencegah VisualState yang Dipilih untuk diterapkan.

void OnCollectionViewSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    // Deselect the item.
    if (sender is CollectionView cv && e.CurrentSelection...)
    {
        cv.SelectedItem = null;
    }
}

Warna Bilah Gulir Vertikal dan Warna Bilah Gulir Horisontal akan sangat bagus!

Bagaimana dengan arah scrolling, maksud saya mulai scroll dari Kanan ke Kiri, bukan kontennya sendiri

Saya ingin memiliki pemisah...

Akan sangat bagus untuk memiliki kemungkinan untuk "memoize" dan menerapkan posisi gulir.

Apa yang akan sangat menakjubkan, adalah kemungkinan untuk menggunakan templat item yang berbeda untuk setiap detik atau item X. Ini akan memungkinkan untuk membuat latar belakang abu-abu untuk setiap item kedua dan banyak kemungkinan gaya lainnya.

Bisakah Anda tidak melakukannya dengan pemilih template? Menggunakan posisi dengan
operator modulo?

Pada Selasa, 13 Agustus 2019, 16:53 Legacyorder [email protected] menulis:

Apa yang akan sangat menakjubkan, adalah kemungkinan untuk menggunakan item yang berbeda
template untuk setiap detik atau item X. Ini akan memungkinkan untuk membuat
latar belakang abu-abu untuk setiap item kedua dan banyak gaya lainnya
kemungkinan.


Anda menerima ini karena Anda berlangganan utas ini.
Balas email ini secara langsung, lihat di GitHub
https://github.com/xamarin/Xamarin.Forms/issues/3172?email_source=notifications&email_token=AC4YCKDFCH3WFENRCLPWEC3QELDE3A5CNFSM4FHJRXPKYY3PNVWWK3TUL52HS4DFVREXG43VMVBWQ20#LOOR5PWZZQ204OR5PWZH2JK4N5PWZHJ3LNMVXH
atau matikan utasnya
https://github.com/notifications/unsubscribe-auth/AC4YCKHXX5YSR7M3S4VU5QLQELDE3ANCNFSM4FHJRXPA
.

Pengguliran Melingkar akan menyenangkan. Saya kira itu mudah untuk diterapkan.

Saya ingin memiliki "AbsoluteItemsLayout" sebagai ItemsLayout untuk CollectionView agar memungkinkan untuk mengatur posisi absolut dalam daftar, saat ini saya tidak melihat solusi lain daripada melakukannya dalam kode di belakang.

Apakah mungkin, saat menggunakan GridItemsLayout, untuk mengizinkan item menjangkau beberapa baris atau kolom? Itu pasti akan menjadi fitur yang layak untuk dimiliki.

Bisakah kalian juga mengekspos acara Scrolled ke kontrol ini? Tujuannya adalah ketika saya mencapai bagian bawah daftar, saya ingin memuat ulang item tambahan. Saya tidak tahu apakah CollectionView mendeteksi apakah ada di dalam ScrollView dan itu menonaktifkan kemampuan pengguliran.

Bisakah kalian juga mengekspos acara Scrolled ke kontrol ini? Tujuannya adalah ketika saya mencapai bagian bawah daftar, saya ingin memuat ulang item tambahan. Saya tidak tahu apakah CollectionView mendeteksi apakah ada di dalam ScrollView dan itu menonaktifkan kemampuan pengguliran.

Keinginan Anda dikabulkan! Periksa versi 4.2 :)
https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/collectionview/scrolling

Anda tidak boleh menyertakan CollectionView di dalam ScrollView, atau virtualisasi tidak akan berfungsi.

Bisakah kalian juga mengekspos acara Scrolled ke kontrol ini? Tujuannya adalah ketika saya mencapai bagian bawah daftar, saya ingin memuat ulang item tambahan. Saya tidak tahu apakah CollectionView mendeteksi apakah ada di dalam ScrollView dan itu menonaktifkan kemampuan pengguliran.

Keinginan Anda dikabulkan! Periksa versi 4.2 :)
https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/collectionview/scrolling

Anda tidak boleh menyertakan CollectionView di dalam ScrollView, atau virtualisasi tidak akan berfungsi.

Saya di 4.2.0.709249
apakah saya melewatkan sesuatu?
image

image

Saya memiliki acara Scrolled dengan 4.2.0.709249.
Coba hapus folder bin/obj dan periksa konsolidasi NuGet untuk memastikan.

Apakah kami akan segera mendapatkan dukungan RTL dengan 4.2 untuk Android dan iOS ?

Apakah kami akan segera mendapatkan dukungan RTL dengan 4.2 untuk Android dan iOS ?

Beberapa dukungan sudah ada; Dukungan FlowDirection seharusnya sudah berfungsi dalam item CollectionView. Yang masih belum lengkap adalah arah gulir untuk layout CollectionView horizontal. Arah gulir harus sesuai dengan FlowDirection di Android, tetapi kami masih memiliki beberapa pekerjaan yang harus dilakukan untuk platform lain; pekerjaan itu ditargetkan selesai pada 4.3.

Jika Anda mengalami bug menggunakan FlowDirection dengan CollectionView, silakan buka masalah dan kami akan memeriksanya.

Bisakah Anda jelaskan apa yang tidak dilakukan dengan dukungan RTL?
Karena secara spek, bahkan tidak ditandai sebagai sedang berlangsung atau selesai.

Pada Kamis, 5 Sep 2019, 2:19 EZ Hart, [email protected] menulis:

Apakah kami akan segera mendapatkan dukungan RTL dengan 4.2 untuk Android dan iOS ?

Beberapa dukungan sudah ada; Dukungan FlowDirection seharusnya sudah
bekerja dalam item CollectionView. Yang masih kurang lengkap scrollnya
arah untuk layout CollectionView horizontal. Arah gulir
harus cocok dengan FlowDirection di Android, tetapi kami masih memiliki beberapa pekerjaan untuk
lakukan itu untuk platform lain.

Jika Anda mengalami bug menggunakan FlowDirection dengan CollectionView,
silakan buka masalah dan kami akan memeriksanya.


Anda menerima ini karena Anda berkomentar.
Balas email ini secara langsung, lihat di GitHub
https://github.com/xamarin/Xamarin.Forms/issues/3172?email_source=notifications&email_token=ACDWB3GSYAQSADERHWVTJX3QIANMNA5CNFSM4FHJRXPKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVX28Zissue
atau matikan utasnya
https://github.com/notifications/unsubscribe-auth/ACDWB3HMFCHBRZWD5AJMXH3QIANMNANCNFSM4FHJRXPA
.

Belum selesai: Arah gulir untuk tata letak horizontal.

Jika Anda mengatur FlowDirection = RightToLeft pada CollectionView yang bergulir secara horizontal, arah gulir tidak akan dari kanan ke kiri di iOS dan UWP sekarang (saya yakin ini _berfungsi di Android).

Bagaimana dengan beberapa LoadingDataTemplate?

Dari pengalaman saya memuat data async ke ListView/CollectionView terkadang ada ruang kosong hingga tampilan daftar/collectionview diisi.

Menambahkan LoadingDataTemplate dapat memberikan respons tambahan saat data besar sedang diisi dan halaman telah muncul.

Saya pikir ada dua cara indikator pemuatan digunakan. Salah satunya adalah ketika CollectionView awalnya ditampilkan. Beberapa sel placeholder ditampilkan hingga data ditambahkan ke koleksi ItemsSource . Yang kedua adalah ketika lebih banyak data ditambahkan di bagian bawah daftar. Untuk yang kedua, saya pikir kita bisa memanfaatkan footer?

Yang pertama membutuhkan lebih banyak pekerjaan (misalnya memuat sumber dengan 3-5 item yang memiliki template data placeholder yang sama, lalu menghapus item tersebut dan menambahkan data aktual saat diambil). Pendekatan lain adalah dengan menempatkan tampilan kerangka di atas CollectionView dan menyembunyikannya ketika data sudah siap. Saat ini saya mengikuti pendekatan ini dengan ListView .

Saya belum mencoba ini, tetapi kita dapat mengatur EmptyView ke tampilan pemuatan terlebih dahulu dan jika tidak ada hasil, ubah template untuk EmptyView untuk menampilkan pesan "tidak ditemukan".

@adrianknight89

Pendekatan lain adalah menempatkan tampilan kerangka di atas CollectionView dan menyembunyikannya saat data sudah siap. Saat ini saya mengikuti pendekatan ini dengan ListView .

Ini terdengar seperti metode yang sama yang saya ikuti juga yaitu meletakkan beberapa indikator aktivitas di atas. Setel ListView ke IsVisible = false dan ActivityIndicator IsVisible = true, lalu balikkan kedua nilai setelah tampilan daftar terisi.

@adrianknight89

Saya belum mencoba ini, tetapi kita dapat mengatur EmptyView ke tampilan pemuatan terlebih dahulu dan jika tidak ada hasil, ubah templat untuk EmptyView untuk menampilkan pesan "tidak ditemukan".

Ada ide! Meskipun itu mungkin berhasil, saya merasa akan lebih baik disederhanakan untuk memiliki properti templat terpisah di CollectionView mengenai LoadingDataTemplate dan EmptyView.

Saya setuju bahwa akan lebih baik untuk memiliki dua properti yang berbeda. Selain aspek kesederhanaan, menggunakan satu properti untuk dua tujuan yang berbeda tidak masuk akal. Mungkin EmptyView seharusnya diberi nama BackgroundView sehingga kita dapat menggunakannya untuk tujuan apa pun. (Sunting: A BackgroundView adalah hal yang sama sekali berbeda.)

@LeoJHarris Saya menambahkan #7447 untuk dukungan BackgroundView . Kita dapat menggunakan EmptyView dan BackgroundView untuk mendukung dua skenario di atas meskipun ini masih belum 100% seperti yang Anda inginkan, tetapi seharusnya lebih baik daripada menggunakan EmptyView untuk mendukung keduanya skenario. Anda dapat menggunakan BackgroundView sebagai layar pemuatan dan membatalkannya saat data sudah siap.

@adrianknight89 akan lebih bagus jika CollectionView menangani 'null it out' setelah data siap daripada mengontrol ini secara manual (kecuali jika Anda sudah menyiratkan itu).

Saat menggulir dengan cepat melalui halaman yang menggunakan RemainingItemsThreshold CollectionView, kami mengalami dua masalah berbeda.

  1. Aplikasi macet dan harus dipaksa berhenti
  2. Item dalam tumpukan CollectionView di atas satu sama lain (lihat gambar )

Belum dapat menemukan orang lain yang memiliki masalah ini. Pernahkah Anda melihatnya dilaporkan?

@Bronson15 Bagaimana Anda menangani acara RemainingItemsThresholdReached ? Pengguliran cepat akan memicunya beberapa kali sehingga Anda harus mengabaikan panggilan acara saat Anda menunggu untuk memperbarui sumber data Anda jika tidak, panggilan tersebut akan menumpuk. Juga, coba perbarui UI Anda di utas utama.

Jika Anda masih mengalami masalah, Anda dapat membuka masalah baru dengan repro untuk penyelidikan.

@ Bronson15 kedua masalah.
Mencoba dengan ObservableRangeCollection dan memperbaiki #2.
Masih mengalami masalah pada daftar macet/kosong: saat menjalankan emulator saya melihat lonjakan cpu, tampaknya loop tak terbatas.

Sunting: hanya istirahat di iOS, di Android berfungsi dengan baik.

Hai tim,
Bahkan saya mencoba menggunakan RemainingItemsThreshold dan RemainingItemsThresholdReachedCommand dan memperhatikan bahwa fungsi yang ditetapkan ke RemainingItemsThresholdReachedCommand dipanggil beberapa kali secara berurutan (pertama kali dipanggil dua kali, berikutnya 4 kali dll.) bahkan jika saya tidak menggulir dengan cepat. Saya juga dapat mereproduksinya dengan proyek Xamarin Forms yang baru (v.4.2.0.778463).
Bisakah Anda mencoba mereproduksinya di akhir Anda? Berikut cuplikan kode sederhana di bawah ini:

XAML:

<CollectionView
        x:Name="StackLayout"
        ItemsSource="{Binding LatestStories}"
        RemainingItemsThreshold="10"
        RemainingItemsThresholdReachedCommand="{Binding RemainingStoriesCommand}">
        <CollectionView.ItemTemplate>
            <DataTemplate>
            <Grid
                                ColumnSpacing="16"
                                HeightRequest="110"
                                RowSpacing="0">

                    <Grid.RowDefinitions>
                        <RowDefinition Height="*" />
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="*">
                        </ColumnDefinition>
                        <ColumnDefinition Width="Auto" />
                    </Grid.ColumnDefinitions>

                    <!--  Blog title  -->
                    <Label
                                    Grid.Column="1"
                                    Margin="0,8"
                                    FontSize="14"
                                    LineBreakMode="TailTruncation"
                                    LineHeight="{OnPlatform Default=-1,
                                                            Android=1.25,
                                                            iOS=1.25}"
                                    MaxLines="2"
                                    Text="{Binding Title}" />

                    <!--  Author name  -->
                    <Label
                                    Grid.Row="1"
                                    Grid.Column="1"
                                    Margin="0,8,0,0"
                                    FontSize="12"
                                    LineHeight="{OnPlatform Default=-1,
                                                            Android=1.5}"
                                    Text="{Binding Author}" />

                </Grid>
            </DataTemplate>
        </CollectionView.ItemTemplate>
</CollectionView>

Lihat Model:

public class ArticleListViewModel
    {
        public ObservableRangeCollection<FeedItem> LatestStories { get; } = new ObservableRangeCollection<FeedItem>();
        public Command RemainingStoriesCommand => new Command(() => RemainingStories());

        public ArticleListViewModel()
        {
            RemainingStories();
        }

        private async void RemainingStories()
        {
            var feeds = await GetRemoteFeedsAsync();
            try
            {
                Device.BeginInvokeOnMainThread(() =>
                {
                    LatestStories.AddRange(feeds);
                });

            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex, "");
            }
        }

        private async Task<List<FeedItem>> GetRemoteFeedsAsync()
        {
            try
            {
                Stopwatch watch = new Stopwatch();
                watch.Start();
                var allItems = new List<FeedItem>();
                HttpResponseMessage response;
                var httpClient = new HttpClient();
                response = await httpClient.GetAsync("https://jsonplaceholder.typicode.com/photos").ConfigureAwait(false);
                if (response.IsSuccessStatusCode)
                {
                    var data = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
                    var testData = JsonConvert.DeserializeObject<List<TestJson>>(data);
                    if (LatestStories.Count == 0)
                    {
                        testData = testData.Take(20).ToList();
                    }
                    else
                    {
                        testData = testData.Skip(LatestStories.Count).Take(20).ToList();
                    }

                    foreach (var item in testData)
                    {
                        var newItem = new FeedItem
                        {
                            Title = item.id.ToString(),
                            Description = item.title,
                            ImagePath = item.thumbnailUrl,
                            Link = item.url,
                            PublishDate = "2019-09-11",
                            Category = ""
                        };
                        allItems.Add(newItem);
                    }
                }
                watch.Stop();
                Debug.WriteLine("TPL Total Time: " + watch.ElapsedMilliseconds);
                return allItems;
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex, "");
                throw;
            }

        }
    }

@Bronson15 @andreabalducci @techduggu Karena kami tidak memblokir UI saat RemainingItemsThresholdReachedCommand sedang diproses, normal untuk terus menekan perintah beberapa kali karena pola gulir Anda. Silakan lihat bagaimana saya menangani masalah dengan mekanisme penguncian: https://github.com/xamarin/Xamarin.Forms/pull/7516/files#diff -2be3eff4d53f761cd581cca1d2ec3bc0R48

Cara lain untuk melakukan ini adalah mengaktifkan/menonaktifkan perintah Anda atau berhenti berlangganan/berlangganan acara saat pengambilan jarak jauh sedang berlangsung. Dalam pengalaman saya, memiliki semaphore bekerja paling baik karena terkadang beberapa pemanggilan diaktifkan pada saat Anda mencoba untuk mengaktifkan/menonaktifkan atau berhenti berlangganan/berlangganan panggilan balik.

@hartez @samhouts @davidortinau Saya pikir masalah ini akan sering muncul di masa depan. Haruskah saran di atas menjadi bagian dari dokumentasi untuk item yang tersisa? Saya akan meminta tim dokumen membuat umpan jarak jauh untuk pengujian dan merekomendasikan pola pengkodean untuk referensi sehingga orang tidak terus meminta bantuan.

@techduggu Ada masalah (kecil) yang berbeda dengan kode Anda. Saya akan meninjau kodenya di Stack Exchange. Ini bukan tempat untuk itu sekarang.

@adrianknight89 Terima kasih telah menyoroti istilah "karena pola gulir Anda". Ini memicu rasa gatal saya untuk mencari tahu lebih banyak tentangnya. Setelah melalui dokumentasi resmi RecyclerView dan beberapa sumber daya lainnya, Ya, saya dapat mengonfirmasi bahwa itu dipanggil beberapa kali karena pola gulir dan pola tersebut adalah SCROLL_STATE_IDLE, SCROLL_STATE_DRAGGING atau SCROLL_STATE_SETTLING tergantung pada status pengguliran kami.
https://developer.android.com/reference/android/support/v7/widget/RecyclerView.OnScrollListener

Kode Anda dan panduan Android ini (https://github.com/codepath/android_guides/wiki/Endless-Scrolling-with-AdapterViews-and-RecyclerView) juga mengonfirmasi hal yang sama bahwa kami harus menangani pengguliran tak terbatas baik melalui penguncian atau pemanfaatan dari status gulir di atas (yang sebagian besar membutuhkan perender khusus). Oleh karena itu dengan Xamarin.Forms, saya sudah mencoba kode Anda dan berhasil seperti pesona. :) Saya akan merekomendasikan dan mendukung pendapat Anda untuk memasukkan saran ini sebagai bagian dari dokumen untuk menghindari masalah yang diangkat oleh orang-orang (dengan setengah pengetahuan) seperti saya. :)

Juga, reg. masalah kecil yang Anda sebutkan untuk cuplikan kode di atas - Nah ini hanya proyek POC untuk menguji pemuatan tak terbatas dengan Tampilan Koleksi, namun saya ingin mengetahui masukan Anda jika Anda melihat sesuatu selain dari cek nol konyol dll.

Terima kasih!

@adrianknight89 Ah ya. Cek Sibuk kami hilang dan itu membantu mengatasi masalah penumpukan.

Saya juga menerapkan Semaphore seperti yang Anda sarankan dan tampaknya telah mengurangi masalah ketika menambahkan item baru ke ItemsSource tampilan akan mengatur ulang posisi gulir ke awal. Anehnya, menambahkan panggilan dalam percobaan; akhirnya; seperti yang Anda lakukan di file pengujian Anda mengembalikan masalah ini.

Masih mengalami masalah pembekuan saat menggulir ke akhir daftar. Tampilan menjadi kosong dan aplikasi membeku.

Sunting: Reset posisi gulir masih ada, tetapi tidak sesering. Render memuat lebih banyak item juga sangat berombak di perangkat.

@techduggu Saya tidak membawa VS, tetapi hanya dengan melihat kodenya, Anda harus menunggu RemainingStories() , pindahkan panggilan jarak jauh ke dalam percobaan, dan gunakan penggunaan untuk HttpClient (idealnya gunakan satu contoh statis di seluruh aplikasi Anda dan jangan pernah membuangnya), tetapi saya akan berhenti di sini. :)

@ Bronson15 Ada masalah dengan CollectionView yang mengatur ulang posisi gulir dan menyebabkan pembekuan UI. Saya pikir itu sudah diperbaiki dengan #7285, tapi itu hanya iOS. Bisakah Anda menguji Nuget malam terbaru dan melihat apakah Anda masih mengalami masalah? URL umpan malam ada di beranda GitHub untuk Formulir. Jika masalah tetap ada, silakan buka masalah dengan kode reproduksi sehingga kami dapat memeriksanya.

@adrianknight89 Menggulir dengan build malam. Sepertinya masalah ini sebagian besar sudah diperbaiki (saya memang pernah melihatnya terjadi). Sepertinya daftar itu hanya dalam lingkaran tanpa akhir sekarang alih-alih memiliki akhir. AFAIK tidak ada properti di spesifikasi untuk menghentikan hal itu terjadi?

@ Bronson15 Loop tak berujung seharusnya tidak terjadi. Apakah Anda melihatnya di iOS atau Android? Anda perlu mengakhiri loop ketika Anda mencapai akhir feed jarak jauh Anda (yaitu kembali dari RemainingItemsThresholdReachedCommand segera tanpa mengeluarkan panggilan DB lain).

Setelah pengguliran tampilan berhenti, perintah seharusnya tidak lagi dipicu. Saya menggunakan Azure Cosmos yang mengembalikan token kelanjutan. Ketika tokennya nol, saya tahu bahwa tidak ada lagi konten yang harus dimuat, jadi RemainingItemsThresholdReachedCommand berfungsi berdasarkan token itu. Anda harus menerapkan sesuatu yang serupa.

@adrianknight89 Ahhh. Menarik. Menambahkan pemeriksaan untuk penghitungan hasil dan mengembalikan jika 0. Memperbaiki gulir tak terbatas. Terima kasih atas bantuannya!

@adrianknight89 diuji hampir untuk masalah kerusakan iOS, akhirnya berhasil. masih "jauh" lebih lambat dari Android.
dengan 1000 item di Android hampir real-time, di iOS harus menunggu 5-7 detik untuk menampilkan tampilan. baik debug, iPhone Xs dan Redmi Note 7

@andreabalducci Apakah Anda menggunakan simulator XS? Bagaimana perilaku pada perangkat fisik? Jika rendering tampilan lambat, ini mungkin masalah lain dengan iOS yang perlu diselidiki. Sekali lagi, akan sangat bagus untuk melihat repro.

@adrianknight89 @andreabalducci ya dibutuhkan sekitar 1-5 detik di Xs Max saya untuk memuat lebih banyak item. Tampilan mengosongkan dan memuat ulang semua item daripada menambahkan item ke daftar yang sudah dirender.

@adrianknight89 kedua perangkat fisik, emulator iOS memiliki masalah yang sama.

Kami menghapus semua stacklayout dari template data dan mendapatkan beberapa kecepatan beralih ke FormattedString, mengaktifkan binding yang dikompilasi, sebelum iOS lebih dari 20 detik.

Di iOS tampilan menjadi hitam dan menggambar ulang semua saat menambahkan ObservableRangeCollection (dari pembantu mvvm), di Android berfungsi dengan baik.

Ini terdengar seperti masalah terpisah bagi saya. Saya tidak berpikir itu terkait item yang tersisa.

Apakah mungkin, saat menggunakan GridItemsLayout, untuk mengizinkan item menjangkau beberapa baris atau kolom? Itu pasti akan menjadi fitur yang layak untuk dimiliki.

Ada informasi tentang ini?

@LynoDesu Masalah sedang dilacak untuk ini: https://github.com/xamarin/Xamarin.Forms/issues/6357

@LynoDesu Masalah sedang dilacak untuk ini: #6357

Hebat! Terima kasih. Di mana saya harus memulai jika saya ingin berkontribusi untuk ini?

Baca wiki beranda serta Contributing.md .

@adrianknight89 menemukan yang kosong + kembali untuk memulai masalah, ulangi di sini https://github.com/andreabalducci/XamarinCollectionView/blob/b186e563ff8391dfb473e62e5a4c4587e8d4e9da/cvrepro/cvrepro/ListViewModel.cs#L46

Dimulai dengan koleksi kosong memicu masalah, jika koleksi memiliki item sebelum mengikat semua berfungsi seperti yang diharapkan.

diuji pada emulator iPhone.

Saya melihat masalahnya. Ini mungkin sama dengan #7548. Anda mungkin ingin memposting repro Anda di sana.

CollectionView tampaknya disadap di Android saat menggunakan IsGrouped.

CollectionView.GroupHeaderTemplate tidak dirender sama sekali. Di iOS berfungsi dengan baik. Anda bisa menggunakan contoh pengelompokan dari situs Microsoft untuk mengujinya.

    public class AnimalGroup : List<Animal>
    {
        public string Name { get; private set; }

        public AnimalGroup(string name, List<Animal> animals) : base(animals)
        {
            Name = name;
        }
    }

    public class Animal
    {
        public string Name { get; set; }
        public string Location { get; set; }
        public string Details { get; set; }
        public string ImageUrl { get; set; }
    }

    public List<AnimalGroup> Animals { get; private set; } = new List<AnimalGroup>();

    Animals.Add(new AnimalGroup("Bears", new List<Animal>
        {
            new Animal
            {
                Name = "American Black Bear",
                Location = "North America",
                Details = "Details about the bear go here.",
                ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/0/08/01_Schwarzbär.jpg"
            },
            new Animal
            {
                Name = "Asian Black Bear",
                Location = "Asia",
                Details = "Details about the bear go here.",
                ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b7/Ursus_thibetanus_3_%28Wroclaw_zoo%29.JPG/180px-Ursus_thibetanus_3_%28Wroclaw_zoo%29.JPG"
            },
        }));
<CollectionView ItemsSource="{Binding Animals}"
                        IsGrouped="true">
            <CollectionView.GroupHeaderTemplate>
                <DataTemplate>
                    <Label Text="Header"
                           BackgroundColor="LightGray"
                           FontSize="Large"
                           FontAttributes="Bold" />
                </DataTemplate>
            </CollectionView.GroupHeaderTemplate>
            <CollectionView.ItemTemplate>
                <DataTemplate>
                    <Grid Padding="10">
                        <Image Grid.RowSpan="2"
                               Source="{Binding ImageUrl}"
                               Aspect="AspectFill"
                               HeightRequest="60"
                               WidthRequest="60" />
                        <Label Grid.Column="1"
                               Text="{Binding Name}"
                               FontAttributes="Bold" />
                        <Label Grid.Row="1"
                               Grid.Column="1"
                               Text="Child"
                               FontAttributes="Italic"
                               VerticalOptions="End" />
                    </Grid>
                </DataTemplate>
            </CollectionView.ItemTemplate>
        </CollectionView>

https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/collectionview/grouping

Penting

Pengelompokan data dengan CollectionView saat ini hanya didukung di iOS.

Ups, saya melewatkan bagian itu. Terima kasih.

Bagi kita yang ingin menampilkan daftar yang dikelompokkan di iOS dan Android, tetapi ingin menghindari ListView, apakah ada hal lain yang bisa kita gunakan yang sefleksibel CollectionView untuk saat ini? Atau apakah kita terjebak dengan ListView?

Saya harap ini adalah tempat yang tepat untuk bertanya. Saya melihat dalam spesifikasi asli yang diposting ada properti untuk IsHeaderSticky dan IsFooterSticky , tetapi saya tidak melihat penyebutan lebih lanjut tentang mereka di mana pun dalam diskusi atau kode sumber yang diterapkan. Apakah mereka masih berada di peta jalan untuk tampilan ini?

Dalam tampilan koleksi kita membutuhkan ItemAppeared, ITemDisappeared.
apakah ada cara untuk mencapainya?

@IosDeveloperHarsh Acara Scrolled memberikan banyak informasi berguna dalam argumen acara. Lihat indeks item pertama dan terakhir yang terlihat di sana.

@rafiwardak2003 Sampel galeri dengan grup CollectionView berfungsi di Android mulai hari ini meskipun saya belum menjalankan sampel yang Anda berikan. Nuget mana yang Anda gunakan? Coba dengan pra-rilis terbaru atau nightly.

@cabal95 Saya tidak memenuhi syarat untuk menjawab ini, tetapi jika saya harus menebak mereka pada akhirnya akan diimplementasikan. Mungkin, kita perlu memiliki masalah aktif untuk melacak ini. Saya tahu bahwa pekerjaan header/footer awal mengecualikan hal-hal yang lengket.

Saya pikir SelectionChangedCommandParameter harus dihapus dan sebagai gantinya kita akan memiliki item yang dipilih secara otomatis ditetapkan sebagai parameter.

Jika memungkinkan, alangkah baiknya menggunakan properti seperti ini

public ICommand => new Command<MySelectedItemModel>((item) => {}

Tapi ini juga harus baik-baik saja:

public ICommand => new Command<object>((item) =>{ var selectedItem = item as MySelectedItemModel;}

Saya pikir SelectionChangedCommandParameter harus dihapus dan sebagai gantinya kita akan memiliki item yang dipilih secara otomatis ditetapkan sebagai parameter.

Jika memungkinkan, alangkah baiknya menggunakan properti seperti ini

public ICommand => new Command<MySelectedItemModel>((item) => {}

Tapi ini juga harus baik-baik saja:

public ICommand => new Command<object>((item) =>{ var selectedItem = item as MySelectedItemModel;}

Bagaimana jika pengguna ingin menggunakan sesuatu selain SelectedItem sebagai parameter untuk Perintah mereka?

Saya pikir SelectionChangedCommandParameter harus dihapus dan sebagai gantinya kita akan memiliki item yang dipilih secara otomatis ditetapkan sebagai parameter.
Jika memungkinkan, alangkah baiknya menggunakan properti seperti ini
public ICommand => new Command<MySelectedItemModel>((item) => {}
Tapi ini juga harus baik-baik saja:
public ICommand => new Command<object>((item) =>{ var selectedItem = item as MySelectedItemModel;}

Bagaimana jika pengguna ingin menggunakan sesuatu selain SelectedItem sebagai parameter untuk Perintah mereka?

Anda ada benarnya, tetapi saya sulit melihat kasus penggunaan untuk itu karena Anda mengatur parameter pada level CollectionView. Saya berharap itu menjadi item yang dipilih saat pertama kali saya menggunakannya. Tetapi Anda mungkin dapat mengatur item yang dipilih sebagai default? Jika Anda menggunakan acara tersebut, Anda akan mendapatkan jadi saya pikir banyak pengembang mengharapkannya untuk perintah juga.

Saya juga ingin meminta fitur agar CollectionView ini tidak membentang di seluruh layar dan hanya menggunakan ketinggian tergantung pada jumlah item.

Saya mencoba untuk melihat beberapa daftar
yaitu
Pembelian

Pengurangan

Total
total
tot

tetapi Item 1 dan 2 (a CollectionView) terlalu tinggi meskipun saya hanya memiliki 3 atau 4 item dan ada celah BIIIIIIIIIIIIIIIG di bawah sebelum saya dapat melihat bagian Pengurangan

Saya akhirnya membuat kontrol ItemsCollection saya sendiri berdasarkan StackLayout

Saya juga ingin meminta fitur agar CollectionView ini tidak membentang di seluruh layar dan hanya menggunakan ketinggian tergantung pada jumlah item.
Saya akhirnya membuat kontrol ItemsCollection saya sendiri berdasarkan StackLayout

Saya pikir apa yang Anda cari mungkin adalah Tata Letak yang Dapat Diikat .

Saya juga ingin meminta fitur agar CollectionView ini tidak membentang di seluruh layar dan hanya menggunakan ketinggian tergantung pada jumlah item.
Saya akhirnya membuat kontrol ItemsCollection saya sendiri berdasarkan StackLayout

Saya pikir apa yang Anda cari mungkin adalah Tata Letak yang Dapat Diikat .

Hai! Persis apa yang saya butuhkan. Sejak kapan BindableLayouts ada?

Terima kasih semuanya atas diskusi tentang masalah ini! Jika Anda memiliki permintaan fitur tambahan atau laporan bug, silakan buka masalah baru untuk masing-masing. Kami sekarang menutup masalah ini.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat