現在のFormsListViewの設計と実装は非常に複雑で維持が困難ですが、ユーザーが望む柔軟性を提供しないことがよくあります。 実装の複雑さと下位互換性の要件のため、ListViewのバグを見つけて修正するのは難しい場合があります。
CollectionViewの取り組みの目標は、APIを簡素化し、ネイティブプラットフォームのリスト作成コントロールの機能を採用することで、これらの問題に対処することです。 そのために:
CollectionViewは、Cellsの概念を完全に削除します。 Cellの概念は便利な場合もありますが、ListViewのネイティブ実装に非常に複雑なものをもたらします。 Cellsで可能なことはすべて、再利用可能なDataTemplatesで実現できます。
CollectionViewはAPIの表面を減らします。 ListViewのいくつかのプロパティとイベントは、CollectionViewでは使用できません。 これらのいくつかは、DataTemplates内で簡単に置き換えることができます。 他のものは特定のプラットフォームに非常に固有であり、そもそも実際には属していませんでした。 これらの変更のリストは以下にあります。
CollectionViewは、レイアウトに関する仮定を組み込まないことで、より柔軟になることを目指しています。 これにより、ユーザーが長い間求めてきたレイアウト(たとえば、HorizontalListView)をサポートし、ネイティブ実装がすでに提供しているレイアウトをサポートできます。
_注:このドキュメントの内容は、現在のListViewが削除される、または維持されなくなることを示すものと見なされるべきではありません。 この取り組みは、多くのフォームユーザーのニーズにより簡単に対応できる代替コントロールを提供することを目的としています。_
_注:この仕様の内容が最終的なものであるとは限りません。 すべての機能、実装、およびインターフェースは変更される可能性があります。_
ユーザーに最新のリストを提供するために、CollectionViewの取り組みにはいくつかのサポートAPIが含まれます。
FontIconSource-スケーラブルなグリフをアイコンとして使用します。 フォームが現在画像をサポートしている場合は常に、グリフをサポートすることを目的としています。 これは、フォームの多くの部分で明らかに望ましい機能ですが、CollectionViewでコンテキストスワイプジェスチャをサポートすることも絶対に不可欠です( FontIconSourceの仕様を参照)。
SwipeView-要素をスワイプしてさらにアクションを実行または表示するためのサポートを提供します( SwipeViewの仕様を参照)。
この仕様は、開発者がアイテムを垂直リスト、水平リスト、またはグリッドのいずれに配置するかを指定することを規定しています。 基盤となるネイティブクラスはすべて、これらのレイアウトタイプをサポートしています。 (iOSでは、この仕様はUITableViewではなくUICollectionViewの使用を想定していることに注意してください。)
CollectionViewに指定された仕様は、各レンダラーのネイティブレイアウトにマップされます。 たとえば、グリッドレイアウトが指定されている場合、iOSでは、レンダラーは(デフォルトで)UICollectionViewFlowLayoutを使用します。 Androidでは、デフォルトはGridLayoutManagerになります。 UWP、GridViewで。
フォームは、リピーター内のアイテムのレイアウトには関与しません(アイテムのビュー自体を生成する以外)。 レイアウトのこの部分は完全にネイティブです。
各レンダラーで使用するレイアウト方法の選択は、ユーザーが変更できます。 ユーザーがAndroidでStaggeredGridLayoutManagerを使用したい場合は、選択メソッドを変更して目的のレイアウトマネージャーを返すことでこれを実現できます。
ContextItemは、コンテキストメニューの一部として表示されることが多い、コンテキストインタラクションを指定する方法を提供します。
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;
}
| API | 説明|
| ------------- | ------------- |
| テキスト| アイテムに表示されるテキストの説明を取得または設定します。 |
| コマンド| このアイテムが呼び出されたときに実行するコマンドを取得または設定します。 |
| CommandParameter | |
| IsEnabled | ユーザーがコンテキストアイテムを操作できるかどうかを示す値を取得または設定します。 |
| アイコン| アイテムのグラフィックコンテンツを取得または設定します。 |
| API | 説明|
| ------------- | ------------- |
| 呼び出された| ユーザーの操作により、このアイテムで表されるコマンドを実行する必要があることが示された場合に発生します。 |
コンテキストメニューに表示される一連のインタラクションを指定する方法を提供します。 ContextMenuは、任意のVisualElementに提供でき、ネイティブプラットフォームの規則に従ってアクティブ化/表示されます。
public static class ContextMenu
{
public static readonly BindableProperty MenuItemsProperty =
BindableProperty.CreateAttached("MenuItems", typeof(ContextMenuItems), typeof(VisualElement));
}
public class ContextMenuItems : IList<ContextItem>
{
}
#5882に移動
CollectionViewの選択モードの動作を提供します。
public enum SelectionMode
{
None,
Single,
Multiple
}
public class SelectionChangedEventArgs : EventArgs
{
public IReadOnlyList<object> PreviousSelection { get; }
public IReadOnlyList<object> CurrentSelection { get; }
}
| API | 説明|
| ------------- | ------------- |
| PreviousSelection | 選択が変更される前に選択されたアイテムのリストを取得します。 |
| CurrentSelection | 選択変更後に選択されたアイテムのリストを取得します。 |
実装クラスが、CollectionViewがアイテムを配置するために使用するレイアウトを指定することを示すマーカーインターフェイス。
public interface IItemsLayout {}
ItemsLayout
の可能な方向を列挙します。 アイテムが追加されると、CollectionViewは方向に展開されます。
public enum ItemsLayoutOrientation
{
Vertical,
Horizontal
}
フォームが提供するアイテムレイアウトの基本クラス。
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;}
}
| API | 説明|
| ------------- | ------------- |
| ItemsLayoutOrientation | アイテムが追加されるときにCollectionViewが展開する方向を指定します。 |
| SnapPointsType | ビューをスクロールするときのスナップポイントの動作を指定します。 |
| SnapPointsAlignment | スナップポイントをビュー内のアイテムとどのように位置合わせするかを指定します。 |
| ItemSpacing | 各アイテムの周囲の空きスペースを指定します。 |
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);
}
| API | 説明|
| ------------- | ------------- |
| VerticalList | 新しいアイテムが追加されるとリストが垂直方向に大きくなる単一列リストを指定します。 |
| 水平リスト| 新しいアイテムが追加されるとリストが水平方向に大きくなる単一行リストを指定します。 |
複数行または複数列のレイアウトを定義します。
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);
}
ListItemsLayout
内のスナップポイントの可能な配置を列挙します。
public enum SnapPointsAlignment
{
Start,
Center,
End
}
| API | 説明|
| ------------- | ------------- |
| 開始| スナップポイントはアイテムの前縁に揃えられます。 |
| センター| スナップポイントはアイテムの中心に揃えられます。 |
| 終了| スナップポイントは、アイテムの後縁に揃えられます。 |
ListItemsLayout
内のスナップポイントの可能な動作を列挙します。
public enum SnapPointsType
{
None,
Optional,
Mandatory,
OptionalSingle,
MandatorySingle,
}
| API | 説明|
| ------------- | ------------- |
| なし| スクロールはアイテムにスナップしません。 |
| オプション| コンテンツは、スナップポイントが十分に近い場合、慣性の方向に沿ってスクロールが自然に停止する最も近いスナップポイントにスナップします。 |
| 必須| コンテンツは常に、慣性の方向に沿ってスクロールが自然に停止する最も近いスナップポイントにスナップします。 |
| オプションシングル| オプションと同じ動作ですが、一度に1つのアイテムのみをスクロールします。 |
| MandatorySingle | 必須と同じ動作ですが、一度に1つのアイテムのみをスクロールします。 |
| API | 説明|
| ------------- | ------------- |
| スパン| 拘束された方向に配置するアイテムの数を指定します。 |
CollectionViewで使用される可能性のあるアイテム測定戦略を提供します。
public enum ItemSizingStrategy
{
MeasureAllItems,
MeasureFirstItem
}
| API | 説明|
| ------------- | ------------- |
| MeasureAllItems | 各項目は個別に測定されます。 |
| MeasureFirstItem | 最初の項目のみが測定されます。 以降のすべてのアイテムは、最初のアイテムと同じサイズであると見なされます。 |
更新中のアイテムのスクロール動作を指定する定数を定義します。
public enum ItemsUpdatingScrollMode
{
KeepItemsInView,
KeepScrollOffset,
KeepLastItemInView
}
| API | 説明|
| ------------- | ------------- |
| KeepItemsInView | スクロールオフセットを調整して、アイテムが追加されたときにビューポートに最初に表示されるアイテムを保持します。 |
| KeepScrollOffset | アイテムが追加されたときに、リストの先頭を基準にしてスクロールオフセットを維持します。 |
| KeepLastItemInView | スクロールオフセットを調整して、アイテムが追加されたときにビューポートに最後に表示されているアイテムを保持します。 |
アイテムのリストを表示します。
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;
}
| API | 説明|
| ------------- | ------------- |
| ItemsLayout | リストのレイアウト仕様を取得または設定します。 |
| ItemSizingStrategy | パフォーマンスを向上させるためにコントロールに提供できるユーザーヒント。 これがMeasureAllItems
(デフォルト)に設定されている場合、各アイテムは個別に測定されます。 アイテムのサイズを均一にすることが意図されている状況では、この値をMeasureFirstItem
設定できます。 最初のアイテムのみが測定され、後続のすべてのアイテムには最初のアイテムと同じサイズが与えられます。 |
| ItemTemplate | 各アイテムの表示に使用されるDataTemplateを取得または設定します。|
| ItemsUpdatingScrollMode | アイテムが更新されたときのスクロール動作を指定する値を取得または設定します。 |
| IsGroupingEnabled | 基になるデータをグループで表示するかどうかを示す値を取得または設定します。 |
| ヘッダー| コントロールの上部に表示される文字列、バインディング、またはビューを取得または設定します。 |
| HeaderTemplate | ヘッダーのフォーマットに使用するデータテンプレートを取得または設定します。 |
| IsHeaderSticky | ユーザーがスクロールしてもヘッダーが所定の位置に残るかどうかを指定します。 デフォルトはTrue
|
| フッター| コントロールの下部に表示される文字列、バインディング、またはビューを取得または設定します。 |
| FooterTemplate | フッターのフォーマットに使用するデータテンプレートを取得または設定します。 |
| IsFooterSticky | ユーザーがスクロールしてもフッターを所定の位置に保持するかどうかを指定します。 デフォルトはTrue
|
| EmptyView | ItemsSourceが空のときに表示される文字列、バインディング、またはビューを取得または設定します。 |
| EmptyViewTemplate | EmptyViewのフォーマットに使用するデータテンプレートを取得または設定します。 |
| GroupHeaderTemplate | グループヘッダーのDataTemplateを取得または設定します。 |
| GroupFooterTemplate | グループフッターのDataTemplateを取得または設定します。* |
| ItemsSource | コントロールに表示されるオブジェクトのリスト。 |
| SelectionMode | コントロールの選択動作を取得または設定します。 |
| SelectedItem | Single
SelectionMode
に対して、選択したアイテムを取得または設定します。 選択したアイテムがアイテムソースから削除されると、 SelectedItem
はnull
設定されます。 |
| SelectedItems | Multiple
SelectionMode
に対して、選択したアイテムを取得または設定します。 選択したアイテムがアイテムソースから削除されると、それらはSelectedItems
から削除され、 SelectionChanged
が発生します。 |
| SelectionChangedCommand | 選択が変更されたときに実行するICommandを取得または設定します。 |
| SelectionChangedCommandParameter | SelectionChangedCommandのパラメーターを取得または設定します。 |
| GroupDisplayBinding | グループヘッダーの表示に使用するバインディングを取得または設定します。 |
| RemainingItemsThreshold | RemainingItemsThresholdReached
イベントが発生するCollectionViewにまだ表示されていないアイテムのしきい値を指定します。 デフォルト値は-1です。これは、イベントが発生しないことを意味します。 0の場合、現在ItemsSource
にある最後のアイテムが表示されたときにイベントが発生します。 0より大きい値では、 ItemsSource
現在スクロールされていないアイテムの数が含まれている場合に、イベントが発生します。 |
| API | 説明|
| ------------- | ------------- |
| ScrollTo(オブジェクトアイテム、オブジェクトグループ= null、ScrollToPosition位置= ScrollToPosition.MakeVisible、bool animate = true)| 指定したアイテムをスクロールして表示します。 |
| ScrollTo(int index、int groupIndex = -1、ScrollToPosition position = ScrollToPosition.MakeVisible、bool animate = true)| 指定したインデックスのアイテムをスクロールして表示します。 |
| API | 説明|
| ------------- | ------------- |
| SelectionChanged | SelectedItem
またはSelectedItems
プロパティが変更されたときに発生します。 これには、 SelectionMode
プロパティの変更の結果として発生する変更が含まれます。 |
| RemainingItemsThresholdReached | CollectionViewが十分にスクロールされて、 RemainingItemsThreshold
アイテムのみが表示されていない場合に発生します。 このイベントを処理して、より多くのアイテムをロードできます。 |
開発者はチャットクライアントを持つアプリを持っています。 メッセージはリストの下部に表示され、画面から上にスクロールします。 開発者は、提案されたAPIを使用してこのUIをどのように実現できますか?
この動作を実現するには、開発者はCollectionView.ItemsUpdatingScrollMode
プロパティをKeepLastItemInView
ます。 ユーザーのスクロール位置がCollectionViewの最後にある場合、新しいアイテムが下部に表示され、スクロールして表示されます。 ユーザーのスクロール位置が他の場所にある場合、新しいアイテムは下部に表示されますが、スクロール位置は変更されません。
開発者のアプリは、不動産リストのリストを表示します。 ユーザーがリストをスクロールすると、ユーザーが停止するまでスクロールがスムーズになります。 スクロールが停止すると、アプリのインターフェースはスクロールをスナップ(アニメーション化)して、一番上のリストがページの一番上に完全に揃うようにする必要があります。 スナップは常に、動きの量が最も少ない方向にある必要があります。
この動作を実現するには、開発者は次の設定でListItemLayout
を使用する必要があります。
Orienation
: Vertical
SnapPointsAlignment
: Start
SnapPointsType
: Mandatory
開発者は、TableViewのような外観を使用して設定ページを再作成したいと考えています。
開発者は、垂直方向のListItemsLayoutを使用する必要があります。 ItemsTemplateは、テーブルセルのルックアンドフィールを再現するDataTemplateに設定する必要があります。 「設定」インターフェースが複数のタイプの設定に対応することを意図している場合(たとえば、一部のセルが設定のオン/オフを切り替えることを意図しており、他のセルが二次設定画面に移動することを意図している場合)、開発者はオン/オフ設定用のDataTemplate(トグルスイッチを使用)とナビゲーション用のDataTemplate(セカンダリ設定ページをナビゲーションスタックにプッシュするTapGestureを使用)を実装するDataTemplateSelectorを作成します。
開発者は、「ニュース」フィードを表示するアプリを持っています。 「ニュース」フィードには無限の数の潜在的なアイテムがあるため、ユーザーが現在読み込まれているデータセットの終わりに近づくと、アプリはサーバーを非同期に呼び出してさらにデータを読み込む必要があります。 ユーザーが空白スペースを表示する前、またはネットワーク遅延/帯域幅の制限内でスクロールが停止される前にデータをロードすることは、アプリにとって重要です。 開発者は提案されたAPIでこれをどのように達成できますか?
これを実現するには、開発者はRemainingItemsThreshold
プロパティを設定し、 RemainingItemsThresholdReached
イベントを処理する必要があります。 イベントが発生すると、ハンドラーはサーバーへの非同期呼び出しを行って、基になるItemsSource
さらにデータをロードできます。
視差ヘッダーをサポートするためのスクロールイベントはどうですか
これについてはたくさんのことが大好きです。
FontIconSourceの場合、Unicode値を使用しない方法が本当に必要です(使用したくない場合)。 値がf370
FontIconSourceを見ている場合、それが何であるかについての奇妙な手がかりはありません。
一方、使用しているアイコンフォントを選択して、Formsにfa-app-store-ios
をf370
に相当するUnicodeに変換する方法を提供できれば、一目でわかります。私が使用しているアイコンはFontAwesomeのもので、iOS AppStoreのアイコンです。 決して、Formsは、いくつかの公開の要点から得られたり、Community Toolkitに追加されたりする可能性のある、ベイクインされたすべての利用可能なフォント(またはそれに関するもの)についてその理解を持っている必要があると言っているわけではありません。意味のある名前を使用する方法。
最後に、このためにXAML拡張機能を使用して、次のようなものを作成できることを願っています。
<Image Source="{FontIcon fa-app-store-ios,Color={StaticResource primaryColor}}" />
以前に@davidortinauとiOSのCollectionView 。
偏見があると言っても差し支えないと思いますが、コミュニティの大部分はMVVMデザインパターンに従っています。 SelectionChanged
とRemainingItemsThresholdReached
両方のイベントを持つことはAPIにとって重要ですが、ViewModelのバージョンのイベントハンドラーでこれらのOOBをサポートする方法を見つけることができれば素晴らしいでしょう... ICommand。
RemainingItemsThresholdReachedは単純な古いEventArgsを送信するだけなので、コマンドを実行するだけでよいので、コマンドにnullを渡すことは問題ないと安全に想定できると思います。 SelectionChangedの場合、古いアイテムよりも新しいアイテムを知ることがより重要であると思う傾向があるので、新しいアイテムOOBをSelectionChangedCommandに渡すだけで問題ありません。 これはすべてのユースケースに当てはまるわけではありませんが、少なくとも、開発者がEventToCommandBehaviorで追加する必要のある最小限のオーバーヘッドを提供します。
現在のリストビューを強制終了する完璧なサンプルは、カレンダーコントロールを次の場所に作成することです。
-日(セル)には多くのスタイルがあります:
プロモーション日、誕生日、障害者/販売なし/銀行休業日として..。
さまざまなカスタムフォントが埋め込まれたアイコン、選択した場合はセルに影があり、rの場合は他のスタイル
怒り、範囲の開始時と終了時の他
-日付の怒りを選択することが可能です
-月のヘッダーとカスタマイズされたヘッダースタイル
-月のヘッダーには、当月の特別な表示/アクション/表示を可能にするボタンがあります
GroupFooterTemplateも追加してみませんか?
これはFormsで非常に必要です:-) CollectionViewは、高価な回避策を排除し、制限を解決し、おそらく過去5年間に作成したほぼすべてのFormsアプリのパフォーマンスを向上させます。 まさに正しいアプローチ-ネイティブプラットフォームの力を活用して公開します。
フォームにリクエストできる拡張機能が1つしかない場合は、これになります。
(実際、私は@davidortinau
これは本当に素晴らしく、待望のことです! APIはクリーンでわかりやすいです(HasUnevenRowsの名前を変更していただきありがとうございます!)。
@dhaligasが提案しているように、スクロールイベントは非常に必要です。 視差アニメーションの場合だけでなく、たとえばスクロール中にフローティングアクションボタンを非表示にする場合もあります。
FontIconSourceは良い考えです。 すべてのプラットフォーム(iOSまたはUWPと同様)にユニコードがマップされた、アイコンのデフォルトリストを提供することは素晴らしいことかもしれません。
これはまさに必要なもののように聞こえます。 APIははるかにクリーンに見えます。このように構造化された複数のビュー/コンテナーを持つことで、コードをよりクリーンでシンプルに保つことができます。
これまでの私のコメント:
@dansiegel残りのアイテムのしきい値に
スクロール:スクロールイベントについて完全に同意します。 Androidの場合は現時点で取得できますが、iOSの場合は、UITableViewSourceをラップして、Scrolledメソッドを乗っ取る必要があります。
私にとって最も重要なのは拡張性です。 アダプターとTableViewSourcesに内部クラスを使用しないでください。ネイティブレンダラーで、必要に応じて独自の型を作成できる「CreateAdapter」メソッドと「CreateViewSource」メソッド(および他のプラットフォームでも同様)を公開してください。 AndroidでのドラッグアンドドロップをサポートするカスタムListAdapterがあり、前述のように、スクロールとドラッグアンドドロップの両方に対応するカスタムUITableViewSourcesがあります。 内部クラスのラッピングなどがあるので、私が好きなコードではありません。
これは、アダプタ/ビューソースだけに適用されるわけではありません。 一般に、新しいAPIでは、必要に応じて動作を拡張できるポイントを追加してください。
これは本当に素晴らしく重要な機能だと思います!
iOSはすでにUICollectionView名を使用しているため、CollectionViewを検索するときに混乱や誤ったGoogle検索結果が発生する可能性があります。 これは問題ですか?
邪魔にならないようにするために、私は基本的にCollectionView
仕様のすべてが大好きです。 しかし、私はそれらについて考えているので、他の多くの人がそうしていると確信しており、会話が理解しにくくなっているのを見ることができるので、いくつかのことを別々の問題に分割する価値があるかもしれません。 例えば:
これは後で追加できますが、次のようになります。
public class MultipleFontIconsSource : ImageSource
{
public List<FontIconSource> Icons { get; set; }
}
スタッキングアイコンをサポートするには、便利です: https :
私のフィードバック:
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; }
}
私の考えは、WindowsXAMLのItemsControlに似たCollectionViewを使用することです。 ItemsControlは、アイテムを配置するPanelインスタンスを取ります。 フォームには、CollectionViewとIItemsLayoutがあります。
デフォルトでは、IItemLayoutが指定されていない場合、デフォルトのレイアウトはスタックレイアウトになります。 このようにして、基本的にItemsSourceをWindows XAMLのStackPanelと組み合わせることができます。つまり、バインド可能なStackLayoutを使用できます。
アイテムの選択の他に、CollectionViewには入れなかった機能があり、これらをListCollectionViewに追加します。 たとえば、CollectionViewにはスクロールを使用しないでください。 このようにして、このスレッドをカバー
IItemsLayoutインターフェイスの名前をICollectionViewLayoutに変更します。 フレームワークにはすでにLayout
とItemsView
ます。 これは長い名前になりますが、ICollectionViewLayoutはその目的を強く示しており、アイテムを表示する一般的な方法ではなく、CollectionViewに固有のものです。
ItemsLayoutクラスの名前をOrientedCollectionViewLayoutに変更します。 これは、抽象基本クラスが実際に何のためにあるかを強く示しています。すべての派生クラスは、方向付けられた方法でアイテムをレイアウトします。 さらに、名前に「Oriented」を使用すると、将来、「CollectionViewLayout」と呼ばれる抽象基本クラスを追加するオプションが提供されます。 方向性のあるものだけでなく、すべてのコレクションビューレイアウトクラスにいくつかの新しい共通機能が必要な場合。
ViewCellを削除してDataTemplateを使用することは大歓迎です。これにより、再利用性が向上します。
誰かが興味を持っている場合に備えて、上記の最初のコメントにいくつかの更新を加えました。
@andreinitescuに同意します。スクロールしないコレクションを作成する方法があれば、それは良いことです。 それが複数のクラスに分割することを意味するのか、あるいはScrollModeプロパティのようなものを持つことを意味するのか、私は中立です。 それについては、私よりもAPI設計の経験が豊富な人に任せます。 ただし、DataTemplateまたはテンプレートセレクターを使用して独自のStackLayoutベースのアイテムリストを実装するのはかなり簡単なので、おそらく必要ありません。
スクロール機能を制御するというアイデアは気に入っていますが、ListViewのすべての高度な機能や提案されているCollectionViewを頭の中で含む非スクロールの「コレクション」の魅力的なユースケースも思いつきません。 非スクロールリストの私のユースケースは、常に些細なアイテムリストによって解決されてきました。 ListViewを使用しない通常の理由は、選択したくない、またはリストを水平方向にレイアウトしたいためです。 これらのケースは両方とも、提案された仕様でカバーされているように見えました。 他の誰かがスクロールなしで持っている使用例に興味があります。
@bmacombeバインド可能なStackLayoutを実装するのは「簡単」であることに同意しますが、それは私が思うポイントではありません。 これは非常に一般的な機能ですが、フレームワークに含めてみませんか? そして、いくつかの計画を立てれば、それは可能だと思います。 すでに上で述べたように、基本クラス(Windows XAMLのItemsControlと同様)とCollectionView(ListView)の2つのクラスに機能を分散するだけで解決できます。 理想的には、階層内にSelectorクラスが存在する必要があります(https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.controls.primitives.selectorを参照)
非スクロールオプションを使用する簡単な理由は、一部のページにページ全体のScrollViewとアイテムのリストが必要なためです。
その場合、現時点では、ListViewをScrollViewに配置することはお勧めしません。 そこに配置できるバインド可能なCollectionViewは、ListViewのすべての機能を備えている可能性がありますが、これは私が何度も必要としていたものです。
私は他の誰もが行うのと同じBindableStackのことを書きましたが、1つに焼き付けた方がはるかにうまく機能します。
@adammeaneyそれは理にかなっています、そして私はそれについて考えるようになりました。
@andreinitescuそれが組み込まれているのは素晴らしいことだと私は同意しません。私は、誰もが必要なこと、それを最善の方法で行う方法について同じページにいると思います。 ある種の「スクロールなし」オプションがある限り、どちらのアプローチでも大丈夫です。
私自身のフレームワークでは、常に多くの機能を1つのコントロールに構築したり、インクリメンタル関数を備えた同様のクラスをたくさん持ったりしています。 私はうまくいくでしょうが、特に基盤となるプラットフォームの実装を考慮して、Formsチームはそれを最適に実装することを決定します。
@bmacombeいくつかの計画を立てて、1つの石で2羽の鳥を手に入れることができることを望んでいます。
たとえば、前述のように機能するCollectionViewクラスのインスタンスは、IItemLayoutが設定されていない場合、レンダラーメカニズムによってiOSのネイティブUIStackView、UWPのStackPanel、またはAndroidのLinearLayoutにマッピングできます。 または、実装を簡単にするために、既存のStackLayoutを使用してビューを配置することもできます。
私の印象では、新しいListViewは、既存のListViewの課題を修正するだけでなく、ここで「RepeatableBinder」スレッドの解決策を提供する必要があり
この仕様を進める前に、ListView2がどこに到達するかを確認したいと思います。 同じ必要なコンポーネントが多数含まれているため、それらの重複を避けるのが最善です。
ここでの仕様が示唆するように、CollectionViewにすべての機能を配置することでどのように正しく機能するかわかりません。
@andreinitescu
RefreshViewの詳細を教えてください。
私はRefreshViewがどういうわけかiOSのUIRefreshControlにマップする必要があると思いますか? AndroidとUWPではどのように機能しますか?
UWPでは、 RefreshContainerを使用する可能性があります。 Androidでは、おそらくSwipeRefreshLayoutです。
@krdmllr
iOSはすでにUICollectionView名を使用しているため、CollectionViewを検索するときに混乱や誤ったGoogle検索結果が発生する可能性があります。 これは問題ですか?
これは問題ですが、新しい問題ではありません。 GestureRecognizer、ListView、Grid、およびフォームの他の多くのものでも同じ問題が発生します。 私たちはこれに少し内部的に苦労しました。 「画面上のアイテムの束」には、非常に多くの名前しかありません。
「CollectionView」は、現在Formsにあるものと競合せず、UWPコントロール名とも競合せず(「ListView」のように)、UICollectionViewのように(「UI」プレフィックスのために)正確に競合しません。 検索目的には100%理想的ではありませんが、コントロールの意図を最もよく表していると思います。
そうは言っても、誰かが私たちがすぐに好きになる別の名前を提案した場合、私は検索して置き換えて喜んでいます。
(「ListView2ColonRevengeOfTheListView」という名前を付けたかったのですが、 @ davidortinauが私を撃墜しました:))
@dansiegel
これに関するいくつかの良いコンテキストは、左にスワイプすると1つのメニューが表示され、右にスワイプすると別のメニューが表示される可能性がある電子メールクライアントについて考えることです。
SwipeViewの仕様を見てください。まさにそれが私たちが目指していることです。
@GalaxiaGuy
スタッキングアイコンをサポート
それは素晴らしいポイントです。可能であれば、それをサポートする必要があります。 組み込みのUWPグリフで機能することはわかっています。 スタッキングのタイプが他のプラットフォームで機能することを確認するために、少し調査する必要があります(答えは「はい」だと思います)。
更新:この仕様のFontIconSource部分は、独自の仕様に移動され
たとえば、アルバムから1つ以上の写真を選択するなど、選択範囲からアイテムを複数選択するユーザーシナリオを作成します。 OneDriveやWhatsAppなどのアプリで非常に一般的なシナリオ。
@hartez
そうは言っても、誰かが私たちがすぐに好きになる別の名前を提案した場合、私は検索して置き換えて喜んでいます。
さまざまな理由ですでに新しい名前を提案しました
SelectionMode
がMultiple
場合、 SelectedItem
の値はどうなりますか? 私が考えることができる5つのオプションがあります:
SelectionMode
がMultiple
場合、 SelectionMode
SelectedItem
をまったくサポートしたくない場合。@ AmrAlSayed0
SelectionModeがMultipleの場合、SelectedItemの値はどうなりますか?
今のところ、答えは「 SelectionMode
をMultiple
切り替える前の状態は何でも」です。
@rogihee
選択範囲からアイテムを複数選択するためのユーザーシナリオ
この選択シナリオがサポートされているかどうかを尋ねていますか? AFAIK、使用する予定のすべてのネイティブコントロールがサポートしているため、CollectionViewでサポートする必要があります。
SelectionModeのバインド可能なスタイルは便利です。SelectionMode= None、Transparentなどの場合、これはRadlistが行うことであり、バインドに基づいて視覚的な状態を処理するための非常に便利で簡単な方法です。 各選択モードのスタイルは、これらのシナリオをカバーします。
@andreinitescu
https://github.com/xamarin/Xamarin.Forms/issues/3172#issuecomment -401015625(および他の場所)からのコメントへの返信:
あなたはたくさんの良い点を挙げています、そして私はあなたがそれらを無視していないことをあなたが知っていることを確認したいと思います。 まだすべての答えを知っているわけではありません。 現在、このAPIをスパイクアップしているところです。これにより、APIがどこで機能し、どこで崩壊するかを確認できます。 あなたが提案しているクラスの内訳は、私たちが最終的に必要とする場所にかなり近いと思います。
あなた(および他のいくつかの人)は、これらの中間クラスをテンプレートアイテムのStackLayoutsおよびGrids(つまり、「BindableRepeater」)としてレンダリングできるようにすることに非常に熱心であり、これは私たちが調査しているユースケースの1つです。
@alexhardwicke
一般に、新しいAPIでは、必要に応じて動作を拡張できるポイントを追加してください。
レンダラーのUpdateX
メソッドはprotected virtual
ます。 :)
真面目な話ですが、これは過去の問題点であったことを認識しており、 CollectionView
を作成する際にはこのことを念頭に置いています。
考え直してみると、CollectionViewがこのビューのクラス名に適しているとは思いません。
Windows XAMLでは、CollectionViewは、グループ化のフィルタリングに使用されるアイテムのデータソースの基本クラスです。https://msdn.microsoft.com/en-us/library/system.windows.data.collectionview (v = vs)を参照して
ある時点で、Xamarin Formsは同じ目的のクラスを取得する可能性があります。特に、XAML標準について考える場合は、同じ名前(CollectionView)があれば意味があると思います(これはまだ計画されていますか?)
醜くて面白いように聞こえますが、ListView2は良い選択です:)既存の名前が意味のある唯一の名前である場合、バージョン管理にサフィックスを使用することを.NETで推奨する方法です。
数値の接尾辞を使用して、既存のAPIの新しいバージョンを示します。特に、APIの既存の名前が意味のある唯一の名前である場合(つまり、業界標準の場合)、意味のある接尾辞を追加する場合(または名前)は適切なオプションではありません。
_フレームワーク設計ガイドライン:再利用可能な.NETライブラリの規則、イディオム、およびパターン、第2版_
https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/general-naming-conventions
後のある時点で、誰もが新しい光沢のあるものを使用するようになります。 安定したパフォーマンスの高いListView2 :)。 早送りすると、ListView2の名前をListViewに変更しますが、大きな変更はありますが、誰にとっても簡単な(そして歓迎される)リファクタリングになります。
XamarinフォームにはすでにItemsViewがあります
新しいCollectionViewクラスを作成する代わりに、既存のItemsViewを使用することは可能でしょうか
APIの設計と実装には明らかな課題があります。リスト項目を表示するネイティブのプラットフォームコントロールを使用しますが、シンプルで軽量、スクロール不可、非スクロール型の「BindableRepeater」のようなものを柔軟に表示できます。 -アイテムの選択可能なリスト。
宇野はなんとかやったようだ:
新しいCollectionViewクラスを作成する代わりに、既存のItemsViewを新しいListViewの基本クラスとしても使用できますか?
ItemsView<T>
ありますが、それは使いたくありません。 TemplatedItemsList
を使用します。これは、この新しいコントロールで回避しようとしている問題の一部です。
後のある時点で、誰もが新しい光沢のあるものを使用するようになります。 安定したパフォーマンスの高いListView2 :)。 早送りすると、ListView2の名前をListViewに変更しますが、大きな変更はありますが、誰にとっても簡単な(そして歓迎される)リファクタリングになります。
あなたの楽観主義は魅力的ですが、ListView(1)は永遠であり、ListView2の名前変更のような重大な変更は許可されないという仮定の下で作業する必要があります。
Windows XAMLと同等であることは理にかなっていると思いましたが、新しいコントロールがその約束を果たしている限り、任意の名前を使用してください。 Unoフレームワークはそれを成功させたようだったので、皆さんがXamarinFormsに何をもたらしているのかを楽しみにしています。
@gmwilhelm
https://github.com/xamarin/Xamarin.Forms/issues/3172#issuecomment -400925994
いい視点ね。 それを一時的にAPIに追加しました。 iOSとAndroidでどのように実装できるかは完全に理解できるので、暫定的に言いますが、UWPは難しいかもしれません。
しかし、私はそれが合理的であり、心地よく対称的であることを否定することはできません。
GroupItemsBinding
追加してみませんか?
これにより、ListViewのようにグループがコレクションから派生する必要がなく、グループにコレクションタイプのプロパティGroupItemsBinding
を追加すると、これが防止され、グループ化されたデータ構造へのより柔軟なマッピングが可能になります。
`` `C#
class Group // GroupはObservableCollectionから派生する必要がないことに注意してください
{{
public Group(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 CreateListView()
{{
var listView = new ListView {
GroupItemsBinding = new Binding(nameof(Group.Persons))
//..。
};
//..。
}
`` `
これがレイアウトに関してUICollectionViewが行うことのサブセットであることを考えると、コントロールの機能との混同を避けるために、別の名前を選択する必要があると思います。
明確にするために、このコントロールはまだ使用できませんか? 参照しようとしましたが、プロジェクトで見つかりません
@titontonこれは、CollectionViewの仕様について話し合うためだけのものであり、実装はまだ開始されていません。仕様が完成するまでは開始されないと思います。
@ AmrAlSayed0 11日前に「
APIの決定が明確でないため、これがどのように開始されたかはかなり不明です。
@opcodewriterそれは私が考えていたものです。 @ AmrAlSayed0説明ありがとうございます。
誰かがこの仕様の現在の状態が何であるかを明確にすることができますか? コミュニティが支援できるところに何か足りないものがありますか?
@migueldeicaza @hartez CollectionView
という名前を付けたくない場合、これに名前を付けるのは難しいでしょう。 CatalogView
どうですか?
カタログは、多くの場合、1つ以上の列で設計され、類似したフォント、テキスト、レイアウトなどのアイテムが複数行に表示されます。
サンプル:
@hartez APIがほぼ完成したと思いますか? これまでにどのくらいの作業が行われていますか? 私たちの多くは、このコントロールをできるだけ早く手に入れたいと思っています。 :)
@ adrianknight89これは作業ブランチだと思います。 https://github.com/xamarin/Xamarin.Forms/tree/lv2spike
しばらくプレビューの準備が整うとは思っていませんが、進行状況を検証し、フィードバックを促すために、今後数週間で現在の取り組みの結果を紹介/デモします。
よくわかりません。 すでにいくつかの内部デモを行っているので、実装はすでにかなり進んでいるようです。
これは、APIの多くが特定されていることを意味するのではないでしょうか。 ここでAPI仕様に従っていますか?
現在の仕様で、ここや他のスレッドで議論されていることにどのように対処できるかわかりませんhttps://github.com/xamarin/Xamarin.Forms/issues/1718
より正確に言うと、APIは、たとえば、単純なスクロール不可でバインド可能なStackLayoutのようなコントロールを可能にするほど柔軟ではありません。
新しいコントロールでは、StackLayoutのように、スクロールバーなしでバインドされたアイテムをスタックに配置できますか?
これを待ってくれてありがとう👍
社内で多くの議論を行い、適切なアーキテクチャを検討した結果、CollectionViewは#1718で説明したレイアウトシナリオを処理しないことを決定しました。 つまり、オブジェクトのコレクションのXamarin.Formsレイアウト内のアイテムへのバインドは処理されません。
CollectionViewの当初の目標は、ユーザーがさまざまな最新のネイティブリスト/グリッドコントロール(UICollectionView、RecyclerView、ListView / GridViewなど)を簡単に利用できるようにすることでした。
「配置」ステップがフォームレイアウト(FlexLayout、StackLayoutなど)によって処理されるすべてのシナリオを含め、CollectionViewをすべての人の「データを使用してこのテンプレートをレンダリングおよび配置する」ニーズに対応するワンストップコントロールにしようとするのは魅力的でした。 )。 また、明らかな機能の重複がいくつかあります(たとえば、両方のシナリオでDataTemplatesを使用します)。 しかし、最終的には、基本的なアーキテクチャに大きな違いがあり、それらをボルトで固定しようとすると、単に個別のコントロールとして残すよりも、保守が難しく、混乱を招くことになります。 数年以内にListView3を実装しなければならないほど複雑なものを作成したくありませんでした。 これについては、以下で詳しく説明します。
その結果、CollectionViewは、Formsユーザーがネイティブリスト/グリッドコントロールを利用できるようにするという問題に引き続き焦点を当て、レイアウトエンジンと仮想化の恩恵を受けることができます。 また、#1718は、FormsユーザーがItemsSource
とItemTemplate
をさまざまなFormsLayoutエンジンにバインドできるようにするAPIを反映するように更新されます。
2つのコントロールと1つのコントロールの「理由」に関心がある場合:
ここで(CollectionViewとして)概説されているものと#1718の提案との根本的な違いは、レイアウトがどこで発生するかです。
CollectionViewは、ネイティブレイアウトエンジン(プラットフォーム開発者によって大幅に最適化されている)を使用してレイアウトを処理することを目的としています。 Formsの一部のカスタムコードが関与しますが(たとえば、AndroidやiOSでSnapPointsロジックなどを提供する場合)、ほとんどの場合、ネイティブレイアウトエンジン(およびネイティブ仮想化実装)が手間のかかる作業を行っています。 これは、パフォーマンスに関して大きな違いをもたらします。
したがって、開発者がCollectionViewに提供するレイアウト情報は、解釈のために各プラットフォームのレンダラーに渡されるだけです。 これは事実上、ローカル言語に翻訳された仕様です(AndroidのLinearLayoutManager / GridLayoutManager、iOSのUICollectionViewFlowLayoutなど)。 DataTemplate以外では、Formsはレイアウト作業を行いません。
対照的に、フォームレイアウト(FlexLayout、StackLayout、AbsoluteLayoutなど)は完全にフォームレイヤーにレイアウトされます。 フォームレイアウトのレンダラーはほとんど何もしません。 また、仮想化は行われていません。 すべてのアイテムが作成され、最初からレイアウトに配置されます。
これら2つのことをまとめようとすると、次のような難しい質問が発生します。
レンダラーマッピングはどのように機能しますか? StackLayoutを使用するCollectionViewには、RecyclerViewを使用する必要があるCollectionViewとは非常に異なるレンダラーがあります。 それらを一緒にマッシュして、必要のないときにRecyclerViewを非表示にしますか? レンダラーはDefaultRendererから派生していますか? そうすれば、本当に必要のない追加のViewGroupレイヤーが常にあります...
ScrollViewsをどのように処理しますか? UICollectionViewは独自のスクロール表示を処理しますが、StackLayoutがスクロールする必要がある場合、ユーザーは通常、Formsに手動で追加します。 必要に応じて自動的にスクロールを挿入するために別のレイヤーを追加しますか? レイアウトでUICollectionViewが必要な場合、手動で追加したScrollViewを無効化/削除しますか?
さらに言えば、ScrollToメソッドはどこに行きますか?
... 等々。 これらの問題はすべて_解決可能_ですが、すべての解決策は_複雑さ_を追加します。 また、#1718で指摘されているように、ItemsSourceとItemsTemplateをフォームレイアウトに追加することは、それほど難しくも複雑でもありません。 これらの2つの異なるシナリオをまとめるだけで複雑にすることは、メリットの価値がありません。
よくわかりません。 すでにいくつかの内部デモを行っているので、実装はすでにかなり進んでいるようです。 これは、APIの多くが特定されていることを意味するのではないでしょうか。 ここでAPI仕様に従っていますか?
ここに掲載されているAPIをフォローしています。 「かなり遠い」はおそらく誇張です。 これまでのところ、仕様の議論の余地のない部分のいくつかを実装して、それらが可能であり、盲目の路地を下っていないことを確認しました。 問題が発生しないと仮定すると、これまでに実装したものの多くは、リリースされたバージョンに含まれる可能性があります。 ただし、これまでに実装したすべての機能と同様に、仕様のすべてが変更される可能性があります。
現在の仕様が、ここと他のスレッド#1718で議論されていることにどのように対処できるかわかりません。 より正確に言うと、APIは、たとえば、単純なスクロール不可でバインド可能なStackLayoutのようなコントロールを可能にするほど柔軟ではありません。
確かに、私たちが取り組んできたのは、CollectionViewがこれらのユースケースを合理的にカバーできるかどうかを判断することです。 私たちはそれについて決定を下しました。 https://github.com/xamarin/Xamarin.Forms/issues/3172#issuecomment-424413234を参照して
これがレイアウトに関してUICollectionViewが行うことのサブセットであることを考えると、コントロールの機能との混同を避けるために、別の名前を選択する必要があると思います。
私が言ったように(https://github.com/xamarin/Xamarin.Forms/issues/3172#issuecomment-401186893)、私は他の名前を受け入れています。
CatalogViewはどうですか?
カタログは、多くの場合、1つ以上の列で設計され、類似したフォント、テキスト、レイアウトなどのアイテムが複数行に表示されます。
これは興味深いアイデアです。 既存のコントロール名とは完全に競合しません。
@hartez Xamarin Formsの内部に精通している(そしてすでにUITableViewとUICollectionViewに精通している)インターネット上のランダムな男として、これは正しい動きだと思います。
カスタムレイアウトを提供することは可能ですか(プラットフォームごとに個別の実装を提供することを意味する場合でも)?
カスタムレイアウトを提供することは可能ですか(プラットフォームごとに個別の実装を提供することを意味する場合でも)?
絶対。 IItemsLayoutでマークされた独自のレイアウトを提供でき、カスタムレンダラーはそれを好きなように解釈できます。
たとえば、概念実証として、CollectionViewのAndroidレンダラーをサブクラス化し、一連のFlex Layoutプロパティを含むクラスFlexLayout : IItemsLayout
を解釈する機能を追加しました。 これらのプロパティをGoogleのFlexBoxLayoutManagerに渡し、そのレイアウトマネージャーをRecyclerViewで使用します。 公開プレビューを利用できるようになったら、おそらくその例をGitHubに表示して、そのようなことを行う方法を簡単に参照できるようにします。
目的は、これを非常に柔軟にすることです。
@hartez
https://github.com/xamarin/Xamarin.Forms/issues/3749で説明されている問題はCollectionViewで修正されていますか?
ここので、私は見CollectionView
唯一持っているItemTemplate
それのような音のような同じ問題がありますプロパティ、 ListView
。
@hartez
#3749で説明されている問題はCollectionViewで修正されていますか?
ここので、私は見CollectionView
唯一持っているItemTemplate
それのような音のような同じ問題がありますプロパティ、ListView
。
@andreinitescuその議論を指摘してくれてありがとう、私はDataTemplateのこの問題に気づいていませんでした。
来週は、DataTemplateの履歴を調べることにします。なぜこのように設計されているのか、そしてCreateContent
を修正して正しいことを自動的に実行することで下位互換性の問題があるかどうかを調べます(両方ともListViewおよびCollectionView)。
@hartez独自のリピーターコントロールを作成するときにこの問題を回避した例として。
//テンプレートセレクターがあるか、テンプレートだけがあるかを確認します
var templateToUse = itemTemplate is DataTemplateSelector templateSelector? templateSelector.SelectTemplate(item、null):itemTemplate;
したがって、そのような場合、CreateContentを修正するだけでは壊れることはなく、不要にするだけです。 しかし、私は@andreinitescuに同意します。
@bmacombe IMHO 、WPF / SLに合わせるのは好みの問題であるだけでなく、実際には問題であり、混乱を招きます。 #3544を参照
@andreinitescuそれは混乱を
CollectionViewでスクロールイベントをお願いできますか? CollectionViewがリリースされるまで、ListViewhttps ://github.com/xamarin/Xamarin.Forms/issues/4323の提案があり
そして、例としてPInterestのように、不規則で動的なレイアウトを作成することは可能でしょうか。
ほら、すべての画像には独自の高さがあります:-)
そのような種類のレイアウトをサポートできるかどうかわかりませんか?
更新:名前の提案のリストから、私たちが思いついた最も近いものは「ItemsView」です。これは、iOSの「UICollectionView」と同じくらい完全であるという印象を人々に与える「CollectionView」という用語の使用を避けるためです。
こんにちは、私はまだXamarinを初めて使用しますが、DataTemplateSelectorを使用してListViewを操作しています。
CollectionViewとDataTemplateSelectorを使用してテストしようとすると、エラーがスローされます
未処理の例外:
System.InvalidOperationException:LoadTemplateはnullが発生してはなりません
DataTemplateSelectorに関連する既知のバグはありますか?
間違って実装している可能性があります。 CollectionViewでDataTemplateSelectorを使用する例はありますか?
なぜ@hartez @davidortinau何らかの理由でKeepItemsInView
命名されていませんKeepFirstItemInView
と整合するようにKeepLastItemInView
? 現在の名前は複数形です(つまり、複数のアイテムを提案します)が、説明には、ビューポートに最初に表示されるアイテムのみが保持されると記載されています。
また、APIを公開して、現在ビューポートにあるビューのリストを取得する方法はありますか? 先日、 ListView
セルに埋め込まれ、ビューポートの可視性に基づいて自動再生/一時停止されるビデオビューの作成に取り組んでいましたが、現在のItemAppearing
とItemDisappearing
ではほぼ不可能CollectionView
この種の機能をより信頼できる方法でサポートすることを本当に楽しみにしています。
ユーザーが現在のフィードをスクロールできるようにしながら、親から切り離された、依存関係のある最小化されたビューを作成できることも素晴らしいことです。 YouTubeでこれを見たのは、ブラウジングを続けながら現在のビデオを見続けることができるようになったからです。 これがCollectionView
でサポートできるか、サポートする必要があるかはわかりませんが、検討する必要があります。
そこで、現在のナイトリービルド(4.0.1.43780-nightly)を少し試してみました。これにより、現在のプレビュービルドと比較してサイズ変更の問題がいくつか解決されました。
RowSpacing / ColumnSpacingやGridSpacingのようなものをグリッドレイアウトに追加することをお勧めします。これにより、個々のアイテムにマージン/パディングを使用せずに、アイテムを正しく配置するのがはるかに簡単になります。
もう1つの方法は、CollectionViewまたはLayoutにPaddingまたはEdgeOffsetを追加して、Marginの使用を回避することです。これにより、次のようなアイテムが切り取られます。
マージンは、Androidの「ドラッグ」アニメーションも、次のようにトリミングします。
RowSpacing / ColumnSpacingやGridSpacingのようなものをグリッドレイアウトに追加することをお勧めします。これにより、個々のアイテムにマージン/パディングを使用せずに、アイテムを正しく配置するのがはるかに簡単になります。
同意しました、そしてそれは私たちのレーダーにあります-#4681を参照してください。
更新:名前の提案のリストから、私たちが思いついた最も近いものは「ItemsView」です。これは、iOSの「UICollectionView」と同じくらい完全であるという印象を人々に与える「CollectionView」という用語の使用を避けるためです。
「FloatView」はどうですか?
上記のItemAppearing / Disappearingイベントのほかに、アイテムのビューを取得する方法の計画:
View GetView(object item)
アイテムが具体化されていない場合は、nullを返すはずです。
垂直リストを使用していますが、iOSとAndroidでのレンダリング方法に一貫性がないようです。
iOSでは、ラベルを使用すると幅の100%が使用されます。
Androidでは、コンテンツの幅のみを使用します。
静的な幅の定義でしか正しくレイアウトできませんでした。
グリッドWidth="Auto"
プロパティを尊重するAndroidの回避策はありますか?
垂直リストを使用していますが、iOSとAndroidでのレンダリング方法に一貫性がないようです。
@shwantonこのバグについては別の問題を開いてください。調べてみます。
@shwanton毎晩のフィードに切り替えたときに修正された、同様の問題がありました
@krdmllr確認できましたが、最新のビルドで修正されています。 ありがとう。
こんにちは。 ListViewのItemTappedと同様のItemTappedイベントがCollectionViewにありますか? スペックには載っていません。 ありがとう。
@uvirra DataTemplateSelector
問い合わせには既存の問題があります。 #4826を参照してください。
@hartez ListView
で存在する3つのようなアイテムリサイクル戦略が必要になることはありますか? CollectionView
活用するネイティブ仮想化について何度か言及しました。 これについてもっと明確にしたいと思います。
また、iOSでRefreshView
がどのように表示されるか知りたいです。 ListView
の現在のリフレッシャーでは、 UITableView
のBounces
プロパティをオンにする必要がありますが、Androidでは、更新ビューは最も表示されているアイテムの上に表示されます(私は個人的に好きです)。
@hartez
ListView
で存在する3つのようなアイテムリサイクル戦略が必要になることはありますか?CollectionView
活用するネイティブ仮想化について何度か言及しました。 これについてもっと明確にしたいと思います。
現在の設計では、リサイクル戦略のようなものは必要ありません。 現在、ネイティブコントロールが提供する仮想化を利用しているだけで、すぐに使用できます。
必要はありますか? 私の望みは「いいえ」です。それは(ユーザーとメンテナンスの両方で)非常に複雑になるため、これを回避するために最善を尽くします。 最終的にそのようなものが必要であると結論付けた場合、私たちは非常に慎重に設計に取り組みます。
スクロールされたイベントはどうですか? 最新のUI / UXのほとんどは、視差ヘッダー、スクロール時のアイテム(ボタン、ヘッダー、フィルターなど)の表示/非表示などを提供します。
このような新しい驚くべきコントロールは、最新のシナリオをサポートするはずだと思います。
問題はないはずです。recyclerviewとUICollectionviewはどちらも、すぐに使用できるスクロールイベントをサポートしています。
Carouselview(collectionviewに基づく)でさえ、方向、スクロール値、およびデルタを含むスクロールイベントをサポートしています: //github.com/xamarin/Xamarin.Forms/issues/4996
これが最新のシナリオをサポートする新しい驚くべきコントロールであるという@Evolutionlabのコメントをフォローアップするために、さらに優れた仮想化サポートを期待しています。
https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/listview-and-gridview-data-optimization
これが理解しにくい場合は、代わりにViewModelで仮想化を実行できるように、VisibleItemsにアクセスしたいと思います。
これからもいい結果を出し続けてください!
@hartez開発者に、選択したアイテムの数の最小/最大しきい値を定義させるのはクールだと思っていました。 現在、5枚を超える写真を選択できないカスタムフォトギャラリーを作成しています。 しきい値に達した場合、セルのタップイベントは、アイテムの選択を解除していない限り無視する必要があります。
これは、 CurrentSelection
カウントに基づいてSelectionChanged
イベントにSelectedItems
(まだ実装されていません)を設定することによっても実行できますが、これによりSelectionChanged
トリガーされます
今日、CollectionViewで少し遊んでみると、UWPがAndroidやiOSよりもはるかに遅れていることに気づきました。
ファイナライズ時に完全なUWPサポートが計画されていることを確認したいだけですか?
上記のItemAppearing / Disappearingイベントのほかに、アイテムのビューを取得する方法の計画:
View GetView(object item)
アイテムが具体化されていない場合は、nullを返すはずです。
ItemAppearingはどうですか? それについてのニュースは見当たりません
私はCollectionView
遊んでいて、行の高さが不均一であるという問題に直面していました。 最近ItemSizingStrategy
導入されたのを見ましたが、それでも奇妙な動作をしています。
DataTemplateGallery
を試してみましたが、 MeasureAllItems
に切り替えると、次の結果が得られます(iPhone 6、iOS 12.1.4)。
右にスワイプして戻ってくると、結果は次のように変わります。
@hartezこれは機能することが期待されていますか、それとも進行中です(その問題は見つかりませんでした)?
RemainingItemsThresholdReachedはまだ実装されていますか?
4.0.0.169046-pre5のCollectionViewコントロールXAMLでは使用できません。
RemainingItemsThresholdReachedは4.0リリースの一部であると誰かに教えてもらえますか? はいの場合、その機能の使用方法に関するサンプルコードを教えてください。
@Dreselこれがバグだと思われる場合は、新しいチケットを開くことができますか? 追跡された方が良いです。
@melucas @chandrubk RemainingItemsThresholdReached
はまだ作業中ではないと思います。
https://github.com/xamarin/Xamarin.Forms/branches/all
私も、この機能がないとCollectionView
触れることができないので、この機能(および更新ビュー)がすぐに実装されることを望んでいます。
ScrollViewのようにスクロールされたイベントが必要です
よろしく、
4323
ScrollViewのようにスクロールされたイベントが必要です
よろしく、
私はこれを支持します。
さらに、スクロールが停止/終了したときにイベントを取得してイベントを作成するのは素晴らしいことです。
IOSでは、UICollectionviewはUIScrollviewのサブクラスであるため、 UIScrollViewDelegate
からscrollViewDidEndDecelerating
を取得できます。
AndroidではRecyclerView.OnScrollListener
拡張できると思いますか?
これにより、カスタムリフレッシュ、視差、同期スクロール要素などのより高度で洗練されたシナリオが開かれます。
リサイクラービューのような、Android用のすぐに使えるアニメーションがある可能性はありますか?
リサイクラービューのような、Android用のすぐに使えるアニメーションがある可能性はありますか?
どのアニメーションを参照していますか? このためのAndroidレンダラーはRecyclerViewに基づいて構築されているため、アイテムの追加/削除などにデフォルトのアニメーションをすでに使用しています。
こんにちは、
4.0.0.304370-pre8を使用しています。
CarouselViewを使用する場合、(以下のリンク)の例ではUWPに何も表示されません。
ただし、CollectionViewはリストを表示します。 CarouselView for UWPを有効にするために必要な特定の構成はありますか?
ありがとう。
こんにちは@noypi 、
CollectionViewは技術的にはUWPでかなり「機能」しますが、CollectionViewとCarouselViewの完全な実装は、そもそもAndroidとiOSで厳密に行われています。 現時点では、UWPの正式な作業は予定されていませんが、フィードバックを継続的に収集しています。 特にUWPでどのような作業を行っているかについて話し合いたい場合は、ポールにメールを送ってください。 [email protected]。
仕様によると、TableViewはCollectionViewに完全に置き換えられますか?
別の質問:セルがもうないので、iOS用のディスクローアインジケーターを追加するにはどうすればよいですか? ListViewを使用すると、カスタムレンダラーを介してそれが可能でした。
仕様によると、TableViewはCollectionViewに完全に置き換えられますか?
TableViewは引き続き存在します。 既存のコントロールを削除することはありません。
別の質問:セルがもうないので、iOS用のディスクローアインジケーターを追加するにはどうすればよいですか? ListViewを使用すると、カスタムレンダラーを介してそれが可能でした。
iOSでは、CollectionViewはUICollectionViewを使用してレンダリングします。これは、そのセルがUICollectionViewCellsであることを意味します。 また、UICollectionViewCellsにはアクセサリビュー(開示インジケーターなど)がありません。 したがって、開示インジケーターやチェックマークなどのUI要素については、ItemTemplateでそれらを作成する必要があります。
特定の種類のアイテムの選択を無効にするにはどうすればよいですか? 複数のデータテンプレートがあり、そのうちのいくつかで選択を無効にしたい。
@hartez ItemTemplateをDataTemplateSelectorに設定すると、例外が発生します:
System.InvalidOperationException: LoadTemplate should not be null
テンプレートは箱から出してサポートされると思いました
@hartez ItemTemplateをDataTemplateSelectorに設定すると、例外が発生します:
System.InvalidOperationException: LoadTemplate should not be null
テンプレートは箱から出してサポートされると思いました
彼らはする必要があります; おそらくあなたはバグに遭遇しています。 調査できるように、問題を開いてください。
@toomasz問題をDataTemplateSelector
のサポートがなかったときに存在していました。
@hartezヘッダーとフッター、および更新ビューで現在行われている作業はありますか? 時間を空けることができれば、どちらかを調べるかもしれませんが、あなたのつま先を踏んでいないことを確認したいと思います。
@ adrianknight89 4.0で動作します! 素晴らしい
@hartezヘッダーとフッター、および更新ビューで現在行われている作業はありますか? 時間を空けることができれば、どちらかを調べるかもしれませんが、あなたのつま先を踏んでいないことを確認したいと思います。
現時点では何も行われていません。ひびを入れたいのであれば、それは素晴らしいことです。
ちょっと注意してください。今日のいくつかの議論の後、ヘッダーとフッターに関連する2つの新しいプロパティ( IsHeaderSticky
とIsFooterSticky
)を追加して、アイテムと一緒にスクロールするか、そのままにするかを指定します。 ヘッダー/フッターと一緒にそれらに取り組みたい場合、それは素晴らしいことですが、それらを何らかの方法で機能させ、後でそれらのプロパティを実装できれば素晴らしいことでもあります。
UWPのコレクションビューをサポートする計画はありますか?
はい。 現在、実装は他のプラットフォームより少し遅れていますが、完全にサポートする予定です。 https://gist.github.com/hartez/7d0edd4182dbc7de65cebc6c67f72e14で機能の進行状況を確認でき
RefreshViewに関する情報はありますか?
最新のXamarin4ベータバージョンを使用していますが、RefreshViewタイプが見つかりません
RefreshViewに関する情報はありますか?
最新のXamarin4ベータバージョンを使用していますが、RefreshViewタイプが見つかりません
RefreshViewはまだ実装されていません。 ここで機能の進行状況を追跡でき
GroupItemsBindingを追加し
GroupItemsBindingプロパティを追加して、グループの子アイテムを含むプロパティを指定するのはどうですか? これにより、グループにコレクションからの継承を強制する代わりに、子コレクションプロパティを埋め込むことができます。
利点:
ViewModelBase
)たとえば、docs.microsoft.comからこの
`` `C#
パブリッククラスPageTypeGroup:リスト
{{
public string Title {get; セットする; }
//その他のプロパティ..。
}
like this instead:
```C#
public class PageTypeGroup
{
public string Title { get; set; }
// More properties ...
public List<PageModel> Children { get; set; }
}
XAMLの場合:
C#
<CollectionView
GroupItemsBinding = "{Binding Children}"
...>
</CollectionView>
GroupItemsBindingを指定しないと、 GroupItemsBinding="{Binding .}"
と同等の既存の実装と互換性があります。
PS私はこの提案を2018年7月に提出しました。
2019年8月23日更新:グループ化が実装されましたが、この修正はありません。 グループデータを参照してください
これを追加するのに遅すぎないことを願っています。
複数のグループ化レベルをサポートするのはどうですか?
木を表示することができ
たとえば、FlutterにはExpansionTileがあります(例)
CollectionViewに関して、追加するのに最適な機能だと思う問題に遭遇しました。
水平リストでは、スクロールを使用して、通常はデザイナーが、画面に完全には表示されない要素に「シャドウ」効果を追加します。 現在(私が知る限り)Xamarin.Formsでこれを行う方法はありません。 これは機能を備えたニークだと思いませんか? たとえば、Xパーセントでしか表示されない要素に「ドロップシャドウ」を適用するブール値のように単純な場合もあります。
Positionプロパティを提案します。 このプロパティは、現在のアイテムのインデックスを保持します。 これにより、 ViewPagerIndicatorと同様のインジケーターを簡単に統合できます。
「現在のアイテム」を特定するのは難しい場合があることを理解しています。 スナップがオンになっている場合、ビューがどのアイテムにスナップされているかを判断するのは非常に簡単です。 スナップしない場合、正しい選択はユースケースに依存します。おそらく、ビューの開始点または中間点を占めるアイテムになります。
このプロパティにより、ScrollTo()の代わりに簡単な双方向アクセスが可能になる場合もあります。
@hartez 4.0リリースの準備が整うことを期待していましたが、まだ完成していないことに驚いています。 スクロールおよび更新機能なしでCollectionViewをテストすることはできません。 スプリントが展開されるまでに何回待つ必要があるか教えてください。 今後、ListViewには何も同梱しないことを決定し、このコントロールをできるだけ早く利用できるようにしたいと考えています。
@hartezリストレイアウトを使用してCollectionViewをアイテムの内容に合わせたサイズにする方法が必要です。 私はそれが一般的なユースケースだと思います:
この例では、ボタンはコレクションビューの真下にある必要があります。 VerticalOptionsがStartの場合、このように機能するはずです。
残りのアイテムのしきい値がプロパティテストに達したとき
画面サイズの変更に関して、個々のアイテムの動作のCollectionViewフローがiOSネイティブの動作を模倣しているかどうかについて質問があります。 例を挙げましょう:
iOSの画像ギャラリーセルはCollectionViewで作成され、個々のセルを定義します。 すぐに使用できる動作では、1行に描画するセルの数は、画面サイズに基づいて動的になります。 電話では4つのアイテムに収まるかもしれませんが、タブレットではおそらく8つまたは9つのアイテムに収まります。
フォームバージョンもこれを提供しますか? これまで読んだ例では、GridItemsLayoutSpanプロパティを設定した場所のみを確認しました。 これにより、描画できるアイテムの数がハードコーディングされた値になります。実際、さまざまな画面サイズの世界では、ハードコーディングは2014年のようです。:-P
UWPには4つの選択モード状態があります
{{
なし、
独身
多数、
拡張する、
}
AndroidとIOSの4つの状態も便利だと思います
ファイルエクスプローラーを見てください
シンプルなパディングプロパティの計画はありますか? #6605私の特定のユースケースでは、適切なサイズの空白のヘッダーとフッターを使用できますが(これらの機能が開発されたら)、それは少しハックであり、4辺すべてのパディングが可能なグリッドレイアウトには適していません。必要とされます。
コレクションビューでリストアイテムを再配置する計画。
仕様は、CollectionViewで特定のアイテムの選択を無効にする方法をカバーしていますか?
// Any possible API could be helpful
private void OnSelectionChanging(object sender, SelectionChangingEventArgs e)
{
if (...)
e.Cancel = true;
}
現在、回避策を講じていますが、SelectedVisualStateの適用を妨げることはありません。
void OnCollectionViewSelectionChanged(object sender, SelectionChangedEventArgs e)
{
// Deselect the item.
if (sender is CollectionView cv && e.CurrentSelection...)
{
cv.SelectedItem = null;
}
}
垂直スクロールバーの色と水平スクロールバーの色は素晴らしいでしょう!
スクロールの方向については、コンテンツ自体ではなく、右から左にスクロールを開始することを意味します
セパレーターが欲しいのですが...
スクロール位置を「メモ化」して適用する可能性があると便利です。
驚くべきことは、毎秒またはXアイテムに異なるアイテムテンプレートを使用する可能性です。 これにより、1つおきのアイテムや他の多くのスタイリングの可能性に対して灰色の背景を作成することが可能になります。
すでにテンプレートセレクターでそれを行うことはできませんか? で位置を使用する
モジュロ演算子?
火、2019年8月13日には、16:53 Legacyorder [email protected]は書きました:
なんてすごいのか、違うアイテムを使う可能性があるのか
1秒ごとまたはXアイテムのテンプレート。 これにより、作成が可能になります
1つおきのアイテムと他の多くのスタイリングの灰色の背景
可能性。—
このスレッドにサブスクライブしているため、これを受け取っています。
このメールに直接返信し、GitHubで表示してください
https://github.com/xamarin/Xamarin.Forms/issues/3172?email_source=notifications&email_token=AC4YCKDFCH3WFENRCLPWEC3QELDE3A5CNFSM4FHJRXPKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKT
またはスレッドをミュートします
https://github.com/notifications/unsubscribe-auth/AC4YCKHXX5YSR7M3S4VU5QLQELDE3ANCNFSM4FHJRXPA
。
円形スクロールがいいでしょう。 実装は簡単だと思います。
CollectionViewのItemsLayoutとして「AbsoluteItemsLayout」を使用して、リストに絶対位置を設定できるようにしたいと思います。現時点では、コードビハインドで行うのではなく、他の解決策はありません。
GridItemsLayoutを使用する場合、アイテムが複数の行または列にまたがることを許可することは可能ですか? それは間違いなく持つ価値のある機能でしょう。
Scrolledイベントをこのコントロールに公開することもできますか? その目的は、リストの一番下に到達したときに、追加のアイテムをリロードしたいということです。 CollectionViewがScrollView内にあるかどうかを検出し、スクロール機能を無効にするかどうかはわかりません。
Scrolledイベントをこのコントロールに公開することもできますか? その目的は、リストの一番下に到達したときに、追加のアイテムをリロードしたいということです。 CollectionViewがScrollView内にあるかどうかを検出し、スクロール機能を無効にするかどうかはわかりません。
あなたの願いは叶います! バージョン4.2を確認してください:)
https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/collectionview/scrolling
ScrollView内にCollectionViewを含めないでください。含めないと、仮想化が機能しません。
Scrolledイベントをこのコントロールに公開することもできますか? その目的は、リストの一番下に到達したときに、追加のアイテムをリロードしたいということです。 CollectionViewがScrollView内にあるかどうかを検出し、スクロール機能を無効にするかどうかはわかりません。
あなたの願いは叶います! バージョン4.2を確認してください:)
https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/collectionview/scrollingScrollView内にCollectionViewを含めないでください。含めないと、仮想化が機能しません。
私は4.2.0.709249にいます
私は何かが足りないのですか?
4.2.0.709249のScrolledイベントがあります。
bin / objフォルダーを削除し、NuGetの統合を確認してください。
AndroidとiOSの4.2でRTLサポートをすぐに利用できますか?
AndroidとiOSの4.2でRTLサポートをすぐに利用できますか?
いくつかのサポートはすでにあります。 FlowDirectionサポートは、CollectionViewアイテム内ですでに機能しているはずです。 まだ不完全なのは、CollectionViewの水平レイアウトのスクロール方向です。 スクロール方向はAndroidのFlowDirectionと一致する必要がありますが、他のプラットフォームではまだ作業が必要です。 その作業は4.3で完了することを目標としています。
CollectionViewでFlowDirectionを使用してバグに遭遇した場合は、問題を開いてください。調査します。
RTLサポートで行われていないことを説明してください。
仕様上、進行中または完了としてマークされていないためです。
2019年9月5日木曜日、午前2時19分EZ Hart、 notifications @ github.comは次のように書いています。
AndroidとiOSの4.2でRTLサポートをすぐに利用できますか?
いくつかのサポートはすでにあります。 FlowDirectionのサポートはすでに
CollectionViewアイテム内での作業。 まだ不完全なのは巻物です
水平CollectionViewレイアウトの方向。 スクロール方向
AndroidのFlowDirectionと一致する必要がありますが、まだいくつかの作業があります
他のプラットフォームについても同様です。CollectionViewでFlowDirectionを使用してバグに遭遇した場合は、
問題を開いてください。確認します。—
コメントしたのでこれを受け取っています。
このメールに直接返信し、GitHubで表示してください
https://github.com/xamarin/Xamarin.Forms/issues/3172?email_source=notifications&email_token=ACDWB3GSYAQSADERHWVTJX3QIANMNA5CNFSM4FHJRXPKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN
またはスレッドをミュートします
https://github.com/notifications/unsubscribe-auth/ACDWB3HMFCHBRZWD5AJMXH3QIANMNANCNFSM4FHJRXPA
。
未完了:水平レイアウトの場合はスクロール方向。
水平方向にスクロールするCollectionViewでFlowDirection = RightToLeftを設定した場合、現在、iOSとUWPではスクロール方向が右から左になりません(Androidでは機能すると思います)。
LoadingDataTemplateはどうですか?
ListView / CollectionViewに非同期でデータをロードした経験から、listview / collectionviewにデータが入力されるまで空のスペースが存在する場合があります。
LoadingDataTemplateを追加すると、大きなデータが入力されていて、ページがすでに表示されている場合に、応答性を高めることができます。
ローディングインジケーターの使い方は2つあると思います。 1つは、 CollectionView
が最初に表示されたときです。 データがItemsSource
コレクションに追加されるまで、複数のプレースホルダーセルが表示されます。 2つ目は、リストの下部にデータが追加された場合です。 2つ目は、フッターを活用できると思いますか?
最初のものはより多くの作業を必要とします(たとえば、最初に同じプレースホルダーデータテンプレートを持つ3〜5個のアイテムをソースにロードし、次にそれらのアイテムを削除して、フェッチされたときに実際のデータを追加します)。 もう1つのアプローチは、スケルトンビューをCollectionView
上に配置し、データの準備ができたら非表示にすることです。 私は現在、 ListView
このアプローチに従います。
私はこれを試していませんが、最初にEmptyView
を読み込みビューに設定し、結果がない場合は、 EmptyView
のテンプレートを変更して「何も見つかりません」というメッセージを表示します。
@ adrianknight89
もう1つのアプローチは、スケルトンビューを
CollectionView
上に配置し、データの準備ができたら非表示にすることです。 私は現在、ListView
このアプローチに従います。
これは私が従うのと同じ方法のように聞こえます。つまり、上記のアクティビティインジケーターを配置します。 ListViewをIsVisible = falseおよびActivityIndicatorIsVisible = trueに設定し、listviewが入力された後に両方の値を反転します。
@ adrianknight89
私はこれを試していませんが、最初にEmptyViewを読み込みビューに設定し、結果がない場合は、EmptyViewのテンプレートを変更して「nothingfound」メッセージを表示することができます。
アイデアがあります! それはうまくいくかもしれませんが、LoadingDataTemplateとEmptyViewに関してCollectionViewに別々のテンプレートプロパティを設定する方が簡単だと思います。
私は、2つの異なるプロパティを持つ方がよいことに同意します。 単純さの側面を除けば、2つの異なる目的で単一のプロパティを使用することはあまり意味がありません。 たぶん (編集: EmptyView
はBackgroundView
という名前になっているはずなので、どんな目的にも使用できます。BackgroundView
はまったく別のものです。)
@LeoJHarris BackgroundView
サポートのために#7447を追加しました。 EmptyView
とBackgroundView
を使用して、上記の2つのシナリオをサポートできますが、これはまだ100%必要なものではありませんが、 EmptyView
を使用して両方をサポートするよりも優れているはずです。シナリオ。 BackgroundView
をロード画面として使用し、データの準備ができたらそれを無効にすることができます。
@ adrianknight89データの準備ができたら、これを手動で制御するのではなく、CollectionViewが「
CollectionViewのRemainingItemsThresholdを利用するページをすばやくスクロールすると、2つの異なる問題が発生します。
この問題を抱えている他の人を見つけることができませんでした。 報告されているのを見たことがありますか?
@ Bronson15 RemainingItemsThresholdReached
イベントをどのように処理していますか? クイックスクロールはそれを数回トリガーするため、データソースの更新を待っている間はイベント呼び出しを無視する必要があります。そうしないと、イベント呼び出しが山積みになります。 また、メインスレッドでUIを更新してみてください。
それでも問題が解決しない場合は、調査のために再現機能を使用して新しい問題を開くことができます。
@ Bronson15両方の問題。
ObservableRangeCollectionで試して、#2を修正しました。
フリーズ/空白リストでまだ問題があります:エミュレータで実行すると、CPUスパイクが表示され、無限ループのようです。
編集:iOSでのみ中断し、Androidでは正常に動作します。
こんにちはチーム、
RemainingItemsThresholdとRemainingItemsThresholdReachedCommandを使用しようとしても、すばやくスクロールしなくても、RemainingItemsThresholdReachedCommandに割り当てられた関数が連続して複数回呼び出されることに気付きました(最初は2回、次回は4回など)。 また、新しいXamarin Formsプロジェクト(v.4.2.0.778463)で再現することもできます。
あなたはあなたの最後にそれを再現しようと試みることができますか? 以下に簡単なコードスニペットを示します。
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>
モデルの表示:
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 RemainingItemsThresholdReachedCommand
処理中押し続けるのが普通です。 ロックメカニズムで問題を処理する方法をご覧ください: https :
これを行う他の方法は、コマンドの有効化/無効化、またはリモートフェッチの進行中にイベントのサブスクライブ解除/サブスクライブを行うことです。 私の経験では、コールバックを有効/無効またはサブスクライブ解除/サブスクライブしようとするまでに複数の呼び出しが発生することがあるため、セマフォを使用するのが最も効果的でした。
@hartez @ samhouts @ davidortinauこの問題は将来かなり頻繁に発生すると思います。 上記の提案は、残りのアイテムのドキュメントの一部にする必要がありますか? ドキュメントチームにテスト用のリモートフィードを作成してもらい、参照用のコーディングパターンを推奨して、人々が助けを求め続けないようにします。
@techdugguコードにはさまざまな(マイナーな)問題があります。 StackExchangeでコードを確認してもらいます。 これは今のところその場所ではありません。
@ adrianknight89 「スクロールパターンのため」という用語を強調していただきありがとうございます。 これはそれについてもっと見つけることについての私のかゆみを引き起こしました。 RecyclerViewと他のいくつかのリソースの公式ドキュメントを確認した後、はい、スクロールパターンが原因で複数回呼び出され、それらのパターンがスクロール状態に応じてSCROLL_STATE_IDLE、SCROLL_STATE_DRAGGING、またはSCROLL_STATE_SETTLINGであることを確認できます。
https://developer.android.com/reference/android/support/v7/widget/RecyclerView.OnScrollListener
あなたのコードとこのAndroidガイド(https://github.com/codepath/android_guides/wiki/Endless-Scrolling-with-AdapterViews-and-RecyclerView)も、ロックまたは使用のいずれかを介して無限スクロールを処理する必要があることを確認しています上記のスクロール状態の(ほとんどの場合、カスタムレンダラーが必要です)。 したがって、Xamarin.Formsを使用して、私はあなたのコードを試しましたが、それは魅力のように機能しました。 :)私のような(知識が半分の)人々によって提起されたそのような問題を回避するために、この提案をドキュメントの一部として含めることをお勧めし、あなたの意見を支持します。 :)
また、reg。 上記のコードスニペットで言及したマイナーな問題-これは、コレクションビューで無限の読み込みをテストするためのPOCプロジェクトにすぎませんが、ばかげたnullチェックなど以外のことに気付いた場合は、入力をお知らせください。
ありがとう!
@ adrianknight89ああそうです。 ビジーチェックが欠落していたため、スタッキングの問題が発生しました。
また、あなたが提案したようにセマフォを実装しましたが、ItemsSourceに新しいアイテムを追加すると、ビューがスクロール位置を最初にリセットするという問題が軽減されたようです。 奇妙なことに、試してみて呼び出しを追加します。 ついに; テストファイルで行ったように、この問題が再発しました。
リストの最後までスクロールすると、まだフリーズの問題があります。 ビューが空白になり、アプリケーションがフリーズします。
編集:スクロール位置のリセットはまだありますが、それほど頻繁ではありません。 より多くのアイテムをロードするレンダリングは、デバイスでも非常に不安定です。
@techduggu VSを持っていませんが、コードを見るだけで、 RemainingStories()
を待って、リモート呼び出しをtry内に移動し、using for HttpClient
使用する必要があります(理想的にはアプリケーション全体で単一の静的インスタンスを破棄することはありません)が、ここで停止します。 :)
@ Bronson15 CollectionViewに問題があり、スクロール位置がリセットされ、UIがフリーズしました。 #7285で修正されたと思いますが、それはiOSのみです。 最新の毎晩のNugetをテストして、まだ問題が発生していないかどうかを確認できますか? 毎晩のフィードURLは、フォームのGitHubホームページにあります。 問題が解決しない場合は、再現コードの問題を開いて確認してください。
@ adrianknight89ナイトリービルドでスクロールします。 問題はほとんど修正されているようです(私はそれが一度発生するのを見ました)。 リストは終わりではなく、今は無限ループに入っているようです。 AFAIK仕様には、それを防ぐためのプロパティはありませんか?
@ Bronson15エンドレスループは発生しないはずです。 iOSまたはAndroidで表示されていますか? リモートフィードの最後に到達したら、ループを終了する必要があります(つまり、別のDB呼び出しを発行せずにRemainingItemsThresholdReachedCommand
すぐに戻ります)。
ビューのスクロールが停止すると、コマンドはトリガーされなくなります。 継続トークンを返すAzureCosmosを使用しています。 トークンがnullの場合、ロードするコンテンツがもうないことがわかっているので、 RemainingItemsThresholdReachedCommand
はそのトークンに基づいて機能します。 同様の実装を行う必要があります。
@ adrianknight89ああ。 面白い。 結果カウントのチェックを追加し、0の場合に返します。無限スクロールを修正しました。 お手伝いありがとう!
@ adrianknight89は、iOSのクラッシュの問題について
Androidでは1000アイテムがほぼリアルタイムであり、iOSではビューがレンダリングされるまで5〜7秒待つ必要があります。 デバッグ、iPhoneXsとRedmiNote7の両方
@andreabalducci XSシミュレーターを使用していますか? 物理デバイスでの動作はどうですか? ビューのレンダリングが遅い場合、これはiOSの別の問題である可能性があり、調査する必要があります。 繰り返しになりますが、再現を見るのは素晴らしいことです。
@ adrianknight89 @andreabalducciええ、Xs Maxでさらにアイテムをロードするのに約1〜5秒かかります。 ビューは、既にレンダリングされたリストにアイテムを追加するのではなく、すべてのアイテムを空白にして再ロードします。
@ adrianknight89両方の物理デバイス、iOSエミュレーターにも同じ問題があります。
iOSが20秒を超える前に、データテンプレートからすべてのスタックレイアウトを削除し、FormattedStringへの切り替えを高速化し、コンパイル済みバインディングを有効にしました。
iOSでは、(mvvmヘルパーからの)ObservableRangeCollectionを追加すると、ビューが黒くなり、すべて再描画されます。Androidでは正常に機能します。
これは私には別の問題のように聞こえます。 残りの関連アイテムではないと思います。
GridItemsLayoutを使用する場合、アイテムが複数の行または列にまたがることを許可することは可能ですか? それは間違いなく持つ価値のある機能でしょう。
これに関する情報はありますか?
@LynoDesuこれについて問題が追跡されています: https :
@LynoDesuこの問題が追跡されています:#6357
ああ、すごい! ありがとう。 これに貢献したい場合、どこから始めればよいですか?
ホームページのwikiとContributing.mdを読んでください。
@ adrianknight89は、空白を見つけて問題を開始しました。ここで再現して
空のコレクションから開始すると、すべてをバインドする前にコレクションにアイテムがある場合、問題が発生します。
iPhoneエミュレータでテスト済み。
問題があります。 これはおそらく#7548と同じです。 あなたはあそこにあなたの再現を投稿したいかもしれません。
IsGroupedを使用すると、AndroidでCollectionViewにバグが発生するようです。
CollectionView.GroupHeaderTemplate
はまったくレンダリングされません。 iOSでは正常に動作します。 Microsoftサイトのグループ化の例を使用してテストすることができます。
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
重要
CollectionViewを使用したデータのグループ化は、現在iOSでのみサポートされています。
Ops、私はその部分を逃しました。 ありがとう。
iOSとAndroidの両方でグループ化されたリストを表示したいが、ListViewを避けたいという人のために、今のところCollectionViewと同じくらい柔軟に使用できるものは他にありますか? それとも、ListViewで立ち往生していますか?
私はこれが質問するのに適切な場所であることを願っています。 元の投稿された仕様にはIsHeaderSticky
とIsFooterSticky
プロパティがあることがわかりますが、ディスカッションや実装されたソースコードのどこにもそれらについての言及はありません。 それらはまだこのビューのロードマップにありますか?
collectionviewでは、ItemAppeared、ITemDisappearedが必要です。
達成する方法はありますか?
@IosDeveloperHarsh Scrolled
イベントは、イベント引数に多くの有用な情報を提供します。 そこで最初と最後に表示されているアイテムのインデックスを確認します。
@ rafiwardak2003 CollectionViewグループを
@ cabal95私はこれに答える資格がありませんが、推測しなければならないとしたら、最終的には実装されるでしょう。 おそらく、これを追跡するためにアクティブな問題が必要です。 最初のヘッダー/フッターの作業で粘着性のあるものが除外されたことを私は知っています。
SelectionChangedCommandParameterを削除する必要があると思います。代わりに、選択したアイテムがパラメーターとして自動的に設定されます。
可能であれば、このようなプロパティを使用するとよいでしょう
public ICommand => new Command<MySelectedItemModel>((item) => {}
しかし、これも問題ないはずです。
public ICommand => new Command<object>((item) =>{ var selectedItem = item as MySelectedItemModel;}
SelectionChangedCommandParameterを削除する必要があると思います。代わりに、選択したアイテムがパラメーターとして自動的に設定されます。
可能であれば、このようなプロパティを使用するとよいでしょう
public ICommand => new Command<MySelectedItemModel>((item) => {}
しかし、これも問題ないはずです。
public ICommand => new Command<object>((item) =>{ var selectedItem = item as MySelectedItemModel;}
ユーザーがSelectedItem以外のものをコマンドのパラメーターとして使用したい場合はどうなりますか?
SelectionChangedCommandParameterを削除する必要があると思います。代わりに、選択したアイテムがパラメーターとして自動的に設定されます。
可能であれば、このようなプロパティを使用するとよいでしょうpublic ICommand => new Command<MySelectedItemModel>((item) => {}
しかし、これも問題ないはずです。
public ICommand => new Command<object>((item) =>{ var selectedItem = item as MySelectedItemModel;}
ユーザーがSelectedItem以外のものをコマンドのパラメーターとして使用したい場合はどうなりますか?
ポイントはありますが、CollectionViewレベルでパラメーターを設定しているため、そのユースケースを見つけるのは困難です。 初めて使った時は選ばれたアイテムになると思っていました。 しかし、おそらく選択したアイテムをデフォルトとして設定できますか? イベントを使用すると取得できるので、多くの開発者はコマンドにもそれを期待していると思います。
このCollectionViewが画面全体に拡大せず、アイテムの数に応じて高さだけを使用する機能もリクエストしたいと思います。
複数のリストを表示しようとしています
すなわち
購入
控除
合計
合計
トット
しかし、アイテム1と2(CollectionView)は、アイテムが3つまたは4つしかなく、控除セクションが表示される前に下にBIIIIIIIIIIIIIIIGギャップがある場合でも、高すぎます。
StackLayoutに基づいて独自のItemsCollectionコントロールを作成することになりました
この問題について議論してくれてありがとう! 追加の機能リクエストやバグレポートがある場合は、それぞれについて新しい問題を開いてください。 現在、この問題をクローズしています。
最も参考になるコメント
視差ヘッダーをサポートするためのスクロールイベントはどうですか