ํ์ฌ Forms ListView ๋์์ธ ๋ฐ ๊ตฌํ์ ๋งค์ฐ ๋ณต์กํ๊ณ ์ ์ง ๊ด๋ฆฌ๊ฐ ๊น๋ค๋กญ์ง๋ง ์ฌ์ฉ์๊ฐ ์ํ๋ ์ ์ฐ์ฑ์ ์ ๊ณตํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๊ตฌํ์ ๋ณต์ก์ฑ๊ณผ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ ์๊ตฌ ์ฌํญ์ผ๋ก ์ธํด ListView ๋ฒ๊ทธ๋ฅผ ์ฐพ๊ณ ์์ ํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
CollectionView ๋ ธ๋ ฅ์ ๋ชฉํ๋ API๋ฅผ ๋จ์ํํ๊ณ ๊ธฐ๋ณธ ํ๋ซํผ์ ๋ชฉ๋ก ์์ฑ ์ ์ด ๊ธฐ๋ฅ์ ์์ฉํ์ฌ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ ๋๋ค. ๋ง์ง๋ง๊น์ง:
CollectionView๋ Cell์ ๊ฐ๋ ์ ์์ ํ ์ ๊ฑฐํฉ๋๋ค. ์ด๋ค ๊ฒฝ์ฐ์๋ ํธ๋ฆฌํ์ง๋ง Cell ๊ฐ๋ ์ ListView์ ๊ธฐ๋ณธ ๊ตฌํ์ ์๋นํ ๋ณต์ก์ฑ์ ๋์ ํฉ๋๋ค. Cells๋ก ๊ฐ๋ฅํ ๋ชจ๋ ๊ฒ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ DataTemplates๋ก ๋ฌ์ฑํ ์ ์์ต๋๋ค.
CollectionView๋ API ํ๋ฉด์ ์ค์ ๋๋ค. ListView์ ์ฌ๋ฌ ์์ฑ๊ณผ ์ด๋ฒคํธ๋ CollectionView์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ค ์ค ๋ช ๊ฐ์ง๋ DataTemplates ๋ด์์ ์ฝ๊ฒ ๊ต์ฒดํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ๊ฒ๋ค์ ํน์ ํ๋ซํผ์ ๋งค์ฐ ๊ตฌ์ฒด์ ์ด์๊ณ ์ฒ์๋ถํฐ ์ค์ ๋ก ์ํ์ง ์์์ต๋๋ค. ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ ๋ชฉ๋ก์ ์๋์์ ์ฐพ์ ์ ์์ต๋๋ค.
CollectionView๋ ๋ ์ด์์์ ๋ํ ๊ฐ์ ์ ๊ตฝํ์ง ์์์ผ๋ก์จ ๋ณด๋ค ์ ์ฐํ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์๊ฐ ์ค๋ซ๋์ ์์ฒญํ ๋ ์ด์์(์: HorizontalListView)๊ณผ ๊ธฐ๋ณธ ๊ตฌํ์ด ์ด๋ฏธ ์ ๊ณตํ๋ ๋ ์ด์์์ ์ง์ํ ์ ์์ต๋๋ค.
_์ฐธ๊ณ : ์ด ๋ฌธ์์ ์ด๋ค ๋ด์ฉ๋ ํ์ฌ ListView๊ฐ ์ ๊ฑฐ๋๊ฑฐ๋ ์ ์ง ๊ด๋ฆฌ๊ฐ ์ค๋จ๋ ๊ฒ์ด๋ผ๋ ํ์๋ก ๊ฐ์ฃผ๋์ด์๋ ์ ๋ฉ๋๋ค. ์ด ๋ ธ๋ ฅ์ ๋จ์ํ ๋ง์ Forms ์ฌ์ฉ์์ ์๊ตฌ ์ฌํญ์ ๋ณด๋ค ์ฝ๊ฒ โโ์ถฉ์กฑํ ์ ์๋ ๋์ฒด ์ปจํธ๋กค์ ์ ๊ณตํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค._
_์ฐธ๊ณ : ์ด ์ฌ์์ ์ด๋ค ๊ฒ๋ ์ต์ข ์ ์์ ๋ณด์ฅํ์ง ์์ต๋๋ค. ๋ชจ๋ ๊ธฐ๋ฅ, ๊ตฌํ ๋ฐ ์ธํฐํ์ด์ค๋ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค._
์๋์ ์ง์ ๋ ๊ธฐ๋ฅ์ ํ์ฌ ์๋ฃ ์ํ
์ฌ์ฉ์์๊ฒ ๋ณด๋ค ํ๋์ ์ธ ๋ชฉ๋ก์ ์ ๊ณตํ๊ธฐ ์ํด CollectionView ์์ ์๋ ๋ช ๊ฐ์ง ์ง์ API๊ฐ ํฌํจ๋ฉ๋๋ค.
FontIconSource - ํ์ฅ ๊ฐ๋ฅํ ๊ธ๋ฆฌํ๋ฅผ ์์ด์ฝ์ผ๋ก ์ฌ์ฉํฉ๋๋ค. ๊ทธ ์๋๋ Forms๊ฐ ํ์ฌ ์ด๋ฏธ์ง๋ฅผ ์ง์ํ๋ ๋ชจ๋ ๊ณณ์์ ๊ธ๋ฆฌํ๋ฅผ ์ง์ํ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ Forms์ ๋ง์ ๋ถ๋ถ์์ ๋ถ๋ช ํ ๋ฐ๋์งํ ๊ธฐ๋ฅ์ด์ง๋ง CollectionView์์ ์ปจํ ์คํธ ์ค์์ดํ ์ ์ค์ฒ๋ฅผ ์ง์ํ๋ ๊ฒ๋ ์ ๋์ ์ผ๋ก ํ์์ ์ ๋๋ค( FontIconSource ์ฌ์ ์ฐธ์กฐ).
SwipeView - ์์๋ฅผ ์ค์์ดํํ์ฌ ์ถ๊ฐ ์์ ์ ์คํํ๊ฑฐ๋ ํ์ํ ์ ์๋๋ก ์ง์ํฉ๋๋ค( SwipeView ์ฌ์ ์ฐธ์กฐ).
์ด ์ฌ์์ ๊ฐ๋ฐ์๊ฐ ํญ๋ชฉ์ ์ธ๋ก ๋ชฉ๋ก, ๊ฐ๋ก ๋ชฉ๋ก ๋๋ ๊ทธ๋ฆฌ๋์ ๋ฐฐ์นํ ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋๋ก ์ ๊ณตํฉ๋๋ค. ๊ธฐ๋ณธ ๊ธฐ๋ณธ ํด๋์ค๋ ๋ชจ๋ ์ด๋ฌํ ๋ ์ด์์ ์ ํ์ ์ง์ํฉ๋๋ค. (iOS์์ ์ด ์ฌ์์ UITableView๊ฐ ์๋ โโUICollectionView๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.)
CollectionView์ ์ง์ ๋ ์ฌ์์ ๊ฐ ๋ ๋๋ฌ์ ๊ธฐ๋ณธ ๋ ์ด์์์ ๋งคํ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ๊ทธ๋ฆฌ๋ ๋ ์ด์์์ด ์ง์ ๋ ๊ฒฝ์ฐ iOS์์ ๋ ๋๋ฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก UICollectionViewFlowLayout์ ์ฌ์ฉํฉ๋๋ค. Android์์ ๊ธฐ๋ณธ๊ฐ์ GridLayoutManager์ ๋๋ค. UWP, GridView์์.
Forms๋ repeater์ ํญ๋ชฉ ๋ ์ด์์์ ์ฐธ์ฌํ์ง ์์ต๋๋ค(ํญ๋ชฉ ๋ณด๊ธฐ ์์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ ์ธ์). ๋ ์ด์์์ ์ด ๋ถ๋ถ์ ์์ ํ ๊ธฐ๋ณธ์ ๋๋ค.
๊ฐ ๋ ๋๋ฌ์์ ์ฌ์ฉํ ๋ ์ด์์ ๋ฐฉ๋ฒ ์ ํ์ ์ฌ์ฉ์๊ฐ ์์ ํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ 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 | ์ค๋ช
|
| -------------- | -------------- |
| ํ
์คํธ | ํญ๋ชฉ์ ํ์๋๋ ํ
์คํธ ์ค๋ช
์ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ค์ ํฉ๋๋ค. |
| ๋ช
๋ น | ์ด ํญ๋ชฉ์ด ํธ์ถ๋ ๋ ์คํํ ๋ช
๋ น์ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ค์ ํฉ๋๋ค. |
| ๋ช
๋ น ๋งค๊ฐ๋ณ์ | |
| ํ์ฑํ๋จ | ์ฌ์ฉ์๊ฐ ์ปจํ
์คํธ ํญ๋ชฉ๊ณผ ์ํธ ์์ฉํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ๊ฐ์ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ค์ ํฉ๋๋ค. |
| ์์ด์ฝ | ํญ๋ชฉ์ ๊ทธ๋ํฝ ์ฝํ
์ธ ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ค์ ํฉ๋๋ค. |
| 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 | ์ค๋ช
|
| -------------- | -------------- |
| ์ด์ ์ ํ | ์ ํ ํญ๋ชฉ์ด ๋ณ๊ฒฝ๋๊ธฐ ์ ์ ์ ํ๋ ํญ๋ชฉ ๋ชฉ๋ก์ ๊ฐ์ ธ์ต๋๋ค. |
| ํ์ฌ ์ ํ | ์ ํ ๋ณ๊ฒฝ ํ์ ์ ํ๋ ํญ๋ชฉ์ ๋ชฉ๋ก์ ๊ฐ์ ธ์ต๋๋ค. |
๊ตฌํ ํด๋์ค๊ฐ ํญ๋ชฉ์ ์ ๋ ฌํ๊ธฐ ์ํด CollectionView์์ ์ฌ์ฉํ๋ ๋ ์ด์์์ ์ง์ ํจ์ ๋ํ๋ด๋ ๋ง์ปค ์ธํฐํ์ด์ค.
public interface IItemsLayout {}
ItemsLayout
๋ํ ๊ฐ๋ฅํ ๋ฐฉํฅ์ ์ด๊ฑฐํฉ๋๋ค. ํญ๋ชฉ์ด ์ถ๊ฐ๋๋ฉด CollectionView๊ฐ ๋ฐฉํฅ ๋ฐฉํฅ์ผ๋ก ํ์ฅ๋ฉ๋๋ค.
public enum ItemsLayoutOrientation
{
Vertical,
Horizontal
}
Forms ์ ๊ณต ํญ๋ชฉ ๋ ์ด์์์ ๊ธฐ๋ณธ ํด๋์ค์ ๋๋ค.
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 | ์ค๋ช
|
| -------------- | -------------- |
| ํญ๋ชฉ ๋ ์ด์์ ๋ฐฉํฅ | ํญ๋ชฉ์ด ์ถ๊ฐ๋ ๋ CollectionView๊ฐ ํ์ฅ๋๋ ๋ฐฉํฅ์ ์ง์ ํฉ๋๋ค. |
| ์ค๋
ํฌ์ธํธ ์ ํ | ๋ณด๊ธฐ๋ฅผ ์คํฌ๋กคํ ๋ ์ค๋
์ ์ ๋์์ ์ง์ ํฉ๋๋ค. |
| SnapPointsAlignment | ์ค๋
ํฌ์ธํธ๊ฐ ๋ทฐ์ ํญ๋ชฉ๊ณผ ์ ๋ ฌ๋๋ ๋ฐฉ์์ ์ง์ ํฉ๋๋ค. |
| ํญ๋ชฉ ๊ฐ๊ฒฉ | ๊ฐ ํญ๋ชฉ ์ฃผ์์ ๋น ๊ณต๊ฐ์ ์ง์ ํฉ๋๋ค. |
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 | ์ค๋ช
|
| -------------- | -------------- |
| ์์ง ๋ชฉ๋ก | ์ ํญ๋ชฉ์ด ์ถ๊ฐ๋ ๋ ๋ชฉ๋ก์ด ์ธ๋ก๋ก ์ปค์ง๋ ๋จ์ผ ์ด ๋ชฉ๋ก์ ์ง์ ํฉ๋๋ค. |
| ์ํ ๋ชฉ๋ก | ์ ํญ๋ชฉ์ด ์ถ๊ฐ๋ ๋ ๋ชฉ๋ก์ด ๊ฐ๋ก๋ก ์ปค์ง๋ ๋จ์ผ ํ ๋ชฉ๋ก์ ์ง์ ํฉ๋๋ค. |
๋ค์ค ํ ๋๋ ๋ค์ค ์ด ๋ ์ด์์์ ์ ์ํฉ๋๋ค.
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 | ์ค๋ช
|
| -------------- | -------------- |
| ์์ | ์คํฌ๋กค์ด ํญ๋ชฉ์ ๋ง์ถฐ์ง์ง ์์ต๋๋ค. |
| ์ ํ์ฌํญ | ์ค๋
ํฌ์ธํธ๊ฐ ์ถฉ๋ถํ ๊ฐ๊น๋ค๋ฉด ์ฝํ
์ธ ๊ฐ ๊ด์ฑ ๋ฐฉํฅ์ ๋ฐ๋ผ ์์ฐ์ค๋ฝ๊ฒ ์คํฌ๋กค์ด ๋ฉ์ถ๋ ๊ฐ์ฅ ๊ฐ๊น์ด ์ค๋
ํฌ์ธํธ๋ก ์ค๋
๋ฉ๋๋ค. |
| ํ์ | ์ฝํ
์ธ ๋ ํญ์ ๊ด์ฑ ๋ฐฉํฅ์ ๋ฐ๋ผ ์คํฌ๋กค์ด ์์ฐ์ค๋ฝ๊ฒ ๋ฉ์ถ๋ ๊ฐ์ฅ ๊ฐ๊น์ด ์ค๋
์ง์ ์ผ๋ก ์ค๋
๋ฉ๋๋ค. |
| ์ต์
๋์ฑ๊ธ | ์ ํ ์ฌํญ๊ณผ ๊ฐ์ ๋์์ด์ง๋ง ํ ๋ฒ์ ํ๋์ ํญ๋ชฉ๋ง ์คํฌ๋กคํฉ๋๋ค. |
| ํ์์ฑ๊ธ | ํ์์ ๊ฐ์ ๋์์ด์ง๋ง ํ ๋ฒ์ ํ๋์ ํญ๋ชฉ๋ง ์คํฌ๋กคํฉ๋๋ค. |
| API | ์ค๋ช
|
| -------------- | -------------- |
| ์คํฌ | ์ ํ๋ ๋ฐฉํฅ์ผ๋ก ๋ฐฐ์นํ ํญ๋ชฉ ์๋ฅผ ์ง์ ํฉ๋๋ค. |
CollectionView์์ ์ฌ์ฉํ ์ ์๋ ํญ๋ชฉ ์ธก์ ์ ๋ต์ ์ ๊ณตํฉ๋๋ค.
public enum ItemSizingStrategy
{
MeasureAllItems,
MeasureFirstItem
}
| API | ์ค๋ช
|
| -------------- | -------------- |
| ๋ชจ๋ ํญ๋ชฉ ์ธก์ | ๊ฐ ํญ๋ชฉ์ ๊ฐ๋ณ์ ์ผ๋ก ์ธก์ ๋ฉ๋๋ค. |
| ์ฒซ ๋ฒ์งธ ํญ๋ชฉ ์ธก์ | ์ฒซ ๋ฒ์งธ ํญ๋ชฉ๋ง ์ธก์ ๋ฉ๋๋ค. ๋ชจ๋ ํ์ ํญ๋ชฉ์ ์ฒซ ๋ฒ์งธ ํญ๋ชฉ๊ณผ ๋์ผํ ํฌ๊ธฐ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. |
์ ๋ฐ์ดํธํ๋ ๋์ ํญ๋ชฉ์ ์คํฌ๋กค ๋์์ ์ง์ ํ๋ ์์๋ฅผ ์ ์ํฉ๋๋ค.
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 | ์ค๋ช
|
| -------------- | -------------- |
| ํญ๋ชฉ ๋ ์ด์์ | ๋ชฉ๋ก์ ๋ํ ๋ ์ด์์ ์ฌ์์ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ค์ ํฉ๋๋ค. |
| ํญ๋ชฉ ํฌ๊ธฐ ์กฐ์ ์ ๋ต | ์ฑ๋ฅ ํฅ์์ ์ํด ์ปจํธ๋กค์ ์ ๊ณตํ ์ ์๋ ์ฌ์ฉ์ ํํธ์
๋๋ค. MeasureAllItems
(๊ธฐ๋ณธ๊ฐ)์ผ๋ก ์ค์ ํ๋ฉด ๊ฐ ํญ๋ชฉ์ด ๊ฐ๋ณ์ ์ผ๋ก ์ธก์ ๋ฉ๋๋ค. ํญ๋ชฉ ํฌ๊ธฐ๊ฐ ๊ท ์ผํด์ผ ํ๋ ์ํฉ์์๋ ์ด ๊ฐ์ MeasureFirstItem
๋ก ์ค์ ํ ์ ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ํญ๋ชฉ๋ง ์ธก์ ๋๊ณ ๋ชจ๋ ํ์ ํญ๋ชฉ์๋ ์ฒซ ๋ฒ์งธ ํญ๋ชฉ๊ณผ ๋์ผํ ํฌ๊ธฐ๊ฐ ์ง์ ๋ฉ๋๋ค. |
| ํญ๋ชฉ ํ
ํ๋ฆฟ | ๊ฐ ํญ๋ชฉ์ ํ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ DataTemplate์ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ค์ ํฉ๋๋ค.|
| ํญ๋ชฉ์
๋ฐ์ดํธ ์คํฌ๋กค ๋ชจ๋ | ํญ๋ชฉ์ด ์
๋ฐ์ดํธ๋ ๋ ์คํฌ๋กค ๋์์ ์ง์ ํ๋ ๊ฐ์ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ค์ ํฉ๋๋ค. |
| IsGroupingํ์ฑํ | ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃน์ผ๋ก ํ์ํด์ผ ํ๋์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ๊ฐ์ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ค์ ํฉ๋๋ค. |
| ํค๋ | ์ปจํธ๋กค์ ๋งจ ์์ ํ์๋ ๋ฌธ์์ด, ๋ฐ์ธ๋ฉ ๋๋ ๋ณด๊ธฐ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ค์ ํฉ๋๋ค. |
| ํค๋ ํ
ํ๋ฆฟ | ํค๋์ ํ์์ ์ง์ ํ๋ ๋ฐ ์ฌ์ฉํ ๋ฐ์ดํฐ ํ
ํ๋ฆฟ์ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ค์ ํฉ๋๋ค. |
| IsHeaderSticky | ์ฌ์ฉ์๊ฐ ์คํฌ๋กคํ ๋ ํค๋๊ฐ ์ ์๋ฆฌ์ ๋จ์ ์๋์ง ์ฌ๋ถ๋ฅผ ์ง์ ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ True
|
| ๋ฐ๋ฅ๊ธ | ์ปจํธ๋กค์ ๋งจ ์๋์ ํ์๋ ๋ฌธ์์ด, ๋ฐ์ธ๋ฉ ๋๋ ๋ณด๊ธฐ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ค์ ํฉ๋๋ค. |
| ๋ฐ๋ฅ๊ธ ํ
ํ๋ฆฟ | ๋ฐ๋ฅ๊ธ ์์์ ์ง์ ํ๋ ๋ฐ ์ฌ์ฉํ ๋ฐ์ดํฐ ํ
ํ๋ฆฟ์ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ค์ ํฉ๋๋ค. |
| IsFooterSticky | ์ฌ์ฉ์๊ฐ ์คํฌ๋กคํ ๋ ๋ฐ๋ฅ๊ธ์ด ์ ์๋ฆฌ์ ์ ์ง๋๋์ง ์ฌ๋ถ๋ฅผ ์ง์ ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ True
|
| ๋น๋ณด๊ธฐ | ItemsSource๊ฐ ๋น์ด ์์ ๋ ํ์๋ ๋ฌธ์์ด, ๋ฐ์ธ๋ฉ ๋๋ ๋ณด๊ธฐ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ค์ ํฉ๋๋ค. |
| ์ ํฐ๋ทฐํ
ํ๋ฆฟ | EmptyView์ ํ์์ ์ง์ ํ๋ ๋ฐ ์ฌ์ฉํ ๋ฐ์ดํฐ ํ
ํ๋ฆฟ์ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ค์ ํฉ๋๋ค. |
| ๊ทธ๋ฃน ํค๋ ํ
ํ๋ฆฟ | ๊ทธ๋ฃน ํค๋์ ๋ํ DataTemplate์ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ค์ ํฉ๋๋ค. |
| ๊ทธ๋ฃน ๋ฐ๋ฅ๊ธ ํ
ํ๋ฆฟ | ๊ทธ๋ฃน ๋ฐ๋ฅ๊ธ์ ๋ํ DataTemplate์ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ค์ ํฉ๋๋ค.* |
| ํญ๋ชฉ ์์ค | ์ปจํธ๋กค์ ํ์ํ ๊ฐ์ฒด ๋ชฉ๋ก์
๋๋ค. |
| ์ ํ ๋ชจ๋ | ์ปจํธ๋กค์ ์ ํ ๋์์ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ค์ ํฉ๋๋ค. |
| ์ ํ ํญ๋ชฉ | SelectionMode
์ค Single
SelectionMode
์ ๋ํด ์ ํํ ํญ๋ชฉ์ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ค์ ํฉ๋๋ค. ์ ํํ ํญ๋ชฉ์ด ํญ๋ชฉ ์์ค์์ ์ ๊ฑฐ๋๋ฉด SelectedItem
๊ฐ null
๋ก ์ค์ ๋ฉ๋๋ค. |
| ์ ํ ํญ๋ชฉ | SelectionMode
์ค Multiple
SelectionMode
์ ๋ํด ์ ํํ ํญ๋ชฉ์ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ค์ ํฉ๋๋ค. ์ ํํ ํญ๋ชฉ์ด ํญ๋ชฉ ์์ค์์ ์ ๊ฑฐ๋๋ฉด SelectedItems
์์ ์ ๊ฑฐ๋๊ณ SelectionChanged
๊ฐ ๋ฐ์ํฉ๋๋ค. |
| ์ ํ ๋ณ๊ฒฝ ๋ช
๋ น โโ| ์ ํ ํญ๋ชฉ์ด ๋ณ๊ฒฝ๋ ๋ ์คํํ ICommand๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ค์ ํฉ๋๋ค. |
| SelectionChanged๋ช
๋ น ๋งค๊ฐ๋ณ์ | SelectionChangedCommand์ ๋ํ ๋งค๊ฐ ๋ณ์๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ค์ ํฉ๋๋ค. |
| ๊ทธ๋ฃน๋์คํ๋ ์ด๋ฐ์ธ๋ฉ | ๊ทธ๋ฃน ํค๋๋ฅผ ํ์ํ๋ ๋ฐ ์ฌ์ฉํ ๋ฐ์ธ๋ฉ์ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ค์ ํฉ๋๋ค. |
| ๋จ์ ํญ๋ชฉ ์๊ณ๊ฐ | RemainingItemsThresholdReached
์ด๋ฒคํธ๊ฐ ๋ฐ์ํ CollectionView์ ์์ง ํ์๋์ง ์๋ ํญ๋ชฉ์ ์๊ณ๊ฐ์ ์ง์ ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ง ์์์ ์๋ฏธํ๋ -1์
๋๋ค. A 0์ด๋ฉด ํ์ฌ ItemsSource
์๋ ์ต์ข
ํญ๋ชฉ์ด ํ์๋ ๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํฉ๋๋ค. ๊ฐ์ด 0๋ณด๋ค ํฌ๋ฉด ItemsSource
์์ง ์คํฌ๋กค๋์ง ์์ ํญ๋ชฉ ์๊ฐ ํ์ฌ ํฌํจ๋์ด ์์ผ๋ฉด ์ด๋ฒคํธ๊ฐ ๋ฐ์ํฉ๋๋ค. |
| API | ์ค๋ช
|
| -------------- | -------------- |
| ScrollTo(๊ฐ์ฒด ํญ๋ชฉ, ๊ฐ์ฒด ๊ทธ๋ฃน = null, ScrollToPosition ์์น = ScrollToPosition.MakeVisible, bool ์ ๋๋ฉ์ด์
= true) | ์ง์ ๋ ํญ๋ชฉ์ ๋ณด๊ธฐ๋ก ์คํฌ๋กคํฉ๋๋ค. |
| ScrollTo(int ์ธ๋ฑ์ค, int groupIndex = -1, ScrollToPosition ์์น = ScrollToPosition.MakeVisible, bool ์ ๋๋ฉ์ด์
= true) | ์ง์ ๋ ์ธ๋ฑ์ค์ ํญ๋ชฉ์ ๋ณด๊ธฐ๋ก ์คํฌ๋กคํฉ๋๋ค. |
| API | ์ค๋ช
|
| -------------- | -------------- |
| ์ ํ ๋ณ๊ฒฝ๋จ | 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
๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ ์ ์์ต๋๋ค.
์์ฐจ ํค๋๋ฅผ ์ง์ํ๋ Scrolling ์ด๋ฒคํธ๋ ์ด๋ป์ต๋๊น?
์ด๊ฒ์ ๋ํด ์ข์ํ ๊ฒ์ด ๋ง์ด ์์ต๋๋ค.
FontIconSource์ ๊ฒฝ์ฐ ์ ๋์ฝ๋ ๊ฐ์ ์ฌ์ฉํ์ง ์๋ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค(์ํ์ง ์๋ ๊ฒฝ์ฐ). f370
๊ฐ์ ๊ฐ์ง FontIconSource๋ฅผ ๋ณด๊ณ ์๋ค๋ฉด ๊ทธ๊ฒ์ด ๋ฌด์์ธ์ง ์ ํ ์ ์ ์์ต๋๋ค.
๋ฐ๋ฉด์ ๋ด๊ฐ ์ฌ์ฉํ๊ณ ์๋ ์์ด์ฝ ๊ธ๊ผด์ ์ ํํ๊ณ Forms์์ fa-app-store-ios
๋ฅผ f370
ํด๋นํ๋ ์ ๋์ฝ๋๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ฉด ์ด์ ํ ๋์ ์ ์ ์์ต๋๋ค. ๋ด๊ฐ ์ฌ์ฉํ๋ ์์ด์ฝ์ Font Awesome์์ ๊ฐ์ ธ์จ ๊ฒ์ด๋ฉฐ iOS App Store ์์ด์ฝ์
๋๋ค. ๊ฒฐ์ฝ Forms๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ๊ธ๊ผด(๋๋ ํด๋น ๋ฌธ์ ์ ๋ํ ๋ชจ๋ ๊ฒ)์ ๋ํด ์ดํดํด์ผ ํ๋ค๋ ๋ง์ ์๋๋๋ค. ์ผ๋ถ ๊ณต๊ฐ ์์ง์์ ๊ฐ์ ธ์ค๊ฑฐ๋ Community Toolkit ๋ฑ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ด๋ ์ชฝ์ด๋ ์ฐ๋ฆฌ๋ ํ์ํฉ๋๋ค. ์๋ฏธ ์๋ ์ด๋ฆ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ.
๋ง์ง๋ง์ผ๋ก ์ด๋ฅผ ์ํด XAML Extension์์ ๊ตฌ์์ง ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
<Image Source="{FontIcon fa-app-store-ios,Color={StaticResource primaryColor}}" />
์์ @davidortinau ์ iOS CollectionView ๋ฌธ์์ ํ์๋ ๊ฒ๊ณผ ๊ฐ์ ์ ๋ฉ๋ด ์ ๊ทผ ๋ฐฉ์์ ๋๋ค.
๋ด๊ฐ ํธํฅ๋์ด ์๋ค๊ณ ๋งํ๋ ๊ฒ์ด ์์ ํ๋ค๊ณ ์๊ฐํ์ง๋ง ์ปค๋ฎค๋ํฐ์ ๋งค์ฐ ๋ง์ ๋ถ๋ถ์ด MVVM ๋์์ธ ํจํด์ ๋ฐ๋ฅด๊ณ ์์ต๋๋ค. SelectionChanged
& RemainingItemsThresholdReached
์ด๋ฒคํธ๋ฅผ ๊ฐ๋ ๊ฒ์ ๋ชจ๋ API์ ์ค์ํ์ง๋ง ViewModel์ ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ฒ์ ์ผ๋ก ์ด๋ฌํ OOB๋ฅผ ์ง์ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์๋ค๋ฉด ํ์์ ์ผ ๊ฒ์
๋๋ค... ๋๋ ๋ช
๋ นํ๋ค.
RemainingItemsThresholdReached๋ ํ๋ฒํ ์ค๋๋ EventArgs๋ฅผ ๋ณด๋ด๊ธฐ๋ง ํ๋ฉด ๋ช ๋ น์ ์คํํ๊ธฐ๋ง ํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ๋ช ๋ น์ null์ ์ ๋ฌํ๋ ๊ฒ์ด ์ข๋ค๊ณ ๊ฐ์ ํ ์ ์์ต๋๋ค. SelectionChanged์ ๊ฒฝ์ฐ ์ด์ ํญ๋ชฉ์ ๋นํด ์ ํญ๋ชฉ์ ์๋ ๊ฒ์ด ๋ ์ค์ํ๋ค๊ณ ์๊ฐํ๋ ๊ฒฝํฅ์ด ์์ผ๋ฏ๋ก ๋จ์ํ ์ ํญ๋ชฉ OOB๋ฅผ SelectionChangedCommand์ ์ ๋ฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๊ฒ์ ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก์ ์ ์ฉ๋๋ ๊ฒ์ ์๋์ง๋ง ์ต์ํ ๊ฐ๋ฐ์๊ฐ ์ผ๋ถ EventToCommandBehavior์ ํจ๊ป ์ถ๊ฐํด์ผ ํ๋ ์ต์ํ์ ์ค๋ฒํค๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
ํ์ฌ ๋ชฉ๋ก ๋ณด๊ธฐ๋ฅผ ์ข
๋ฃํ๋ ์๋ฒฝํ ์ํ์ ๋ค์ ์์น์์ ์บ๋ฆฐ๋ ์ ์ด๋ฅผ ๋ง๋๋ ๊ฒ์
๋๋ค.
-์ผ(์
)์ ๋ค์ํ ์คํ์ผ์ ๊ฐ์ง ์ ์์ต๋๋ค.
์น์ง์ผ, ์์ผ, ์ฅ์ ์ธ / ๋ฌด์ธ์ผ / ๊ณตํด์ผ๋ก ...
๋ค๋ฅธ ์ฌ์ฉ์ ์ ์ ๊ธ๊ผด์ด ํฌํจ๋ ์์ด์ฝ, ์ ํํ ๊ฒฝ์ฐ ์
์ ๊ทธ๋ฆผ์๊ฐ ์๊ณ , r์ ์๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ์คํ์ผ
๋ถ๋
ธ, ๋ฒ์์ ์์๊ณผ ๋์์ ๊ธฐํ
- ๋ ์ง ๋ฒ์ ์ ํ ๊ฐ๋ฅ
-month ํค๋ ๋ฐ ์ฌ์ฉ์ ์ ์ ํค๋ ์คํ์ผ
-month ํค๋์๋ ํ์ฌ ๋ฌ์ ๋ํ ๋ช ๊ฐ์ง ํน๋ณํ ๋ณด๊ธฐ/๋์/ํ์๋ฅผ ํ์ฉํ๋ ๋ฒํผ์ด ์์ต๋๋ค.
GroupFooterTemplate๋ ์ถ๊ฐํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
์ด๊ฒ์ Forms์์ ๋งค์ฐ ํ์ํฉ๋๋ค :-) CollectionView๋ ์ง๋ 5๋ ๋์ ๋ด๊ฐ ๋ง๋ ๊ฑฐ์ ๋ชจ๋ Forms ์ฑ์์ ๊ฐ๋น์ผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ๊ฑฐํ๊ณ ์ ํ ์ฌํญ์ ํด๊ฒฐํ๋ฉฐ ์ฑ๋ฅ์ ๊ฐ์ ํ ๊ฒ์ ๋๋ค. ์ ํํ ์ฌ๋ฐ๋ฅธ ์ ๊ทผ ๋ฐฉ์ - ๊ธฐ๋ณธ ํ๋ซํผ์ ํ์ ํ์ฉํ๊ณ ๋ ธ์ถํฉ๋๋ค.
Forms์ ๋ํด ์์ฒญํ ์ ์๋ ๊ฐ์ ์ฌํญ์ด ํ๋๋ง ์๋ค๋ฉด ์ด๊ฒ์ด ๋ ๊ฒ์
๋๋ค.
(์ค์ ๋ก 2017๋
@davidortinau๋์
์ด๊ฒ์ ์ ๋ง ๊ต์ฅํ๊ณ ์ค๋ซ๋์ ๊ธฐ๋ค๋ ค์จ ๊ฒ์ ๋๋ค! API๋ ๊นจ๋ํ๊ณ ๊ฐ๋จํฉ๋๋ค(HasUnevenRows์ ์ด๋ฆ์ ๋ฐ๊ฟ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!).
@dhaligas๊ฐ ์ ์ํ ๊ฒ์ฒ๋ผ ์คํฌ๋กค ์ด๋ฒคํธ๊ฐ ๋งค์ฐ ํ์ํฉ๋๋ค. ์์ฐจ ์ ๋๋ฉ์ด์ ์ ๊ฒฝ์ฐ๋ฟ๋ง ์๋๋ผ ์๋ฅผ ๋ค์ด ์คํฌ๋กคํ๋ ๋์ ๋ถ๋ ์์ ๋ฒํผ์ ์จ๊น๋๋ค.
FontIconSource๋ ์ข์ ์๊ฐ์ ๋๋ค. ๋ชจ๋ ํ๋ซํผ(iOS ๋๋ UWP์ ์ ์ฌ)์ ๋ํด ์ ๋์ฝ๋๊ฐ ๋งคํ๋ ๊ธฐ๋ณธ ์์ด์ฝ ๋ชฉ๋ก์ ์ ๊ณตํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ด๊ฒ์ ์ ํํ ํ์ํ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. API๋ ํจ์ฌ ๋ ๊น๋ํด ๋ณด์ด๋ฉฐ ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ๊ตฌ์กฐํ๋ ์ฌ๋ฌ ๋ณด๊ธฐ/์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ฅผ ๋ ๊นจ๋ํ๊ณ ๋จ์ํ๊ฒ ์ ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์ง๊ธ๊น์ง ๋ด ์๊ฒฌ:
@dansiegel ๋จ์ ํญ๋ชฉ ์๊ณ๊ฐ์ด ์ถฉ์กฑ๋๋ฉด ๋ช ๋ น์ ํ์ํฉ๋๋ค. SelectedItems์ ํ์ํ์ง ํ์คํ์ง ์์ต๋๋ค. SelectedItems๊ฐ ObservableCollection(๋๋ INotifyCollectionChanged๋ฅผ ๊ตฌํํ๋ ๋ชจ๋ ๊ฒ)์ธ ํ ์ฌ์ฉ์๊ฐ ๋งํ ๋ชจ๋ ๊ฒ(๋ณ๊ฒฝ ์ฌํญ, ๋ณ๊ฒฝ๋ ์ฌํญ, ์ฌ์ง์ด ์ด์ ๊น์ง)์ด ์๋์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. ๋ณต์ก์ฑ์ ์ค์ด๊ธฐ ์ํด CollectionView์ ๊ฐ๋ฅํ ํ ์ ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ต๋๋ค.
์คํฌ๋กค๋ง: ์คํฌ๋กค๋ง ์ด๋ฒคํธ์ ๋ํด ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. ํ์ฌ 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://fontawesome.com/how-to-use/on-the-web/styling/stacking-icons
๋ด ํผ๋๋ฐฑ:
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; }
}
๋ด ์์ด๋์ด๋ Windows XAML์ ItemsControl๊ณผ ์ ์ฌํ CollectionView๋ฅผ ๊ฐ๋ ๊ฒ์
๋๋ค. ItemsControl์ ํญ๋ชฉ์ ๋ฐฐ์นํ๋ Panel ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค. Forms์๋ CollectionView ๋ฐ IItemsLayout์ด ์์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก IItemLayout์ด ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ๋ ์ด์์์ ์คํ ๋ ์ด์์์ด ๋ ์ ์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ผ๋ก ๊ธฐ๋ณธ์ ์ผ๋ก Windows XAML์ StackPanel๊ณผ ๊ฒฐํฉ๋ ItemsSource๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ์ฆ, ๋ฐ์ธ๋ฉ ๊ฐ๋ฅํ StackLayout !
ํญ๋ชฉ ์ ํ ์ธ์๋ CollectionView์ ๋ฃ์ง ์์ ๋ค๋ฅธ ๊ธฐ๋ฅ์ด ์์ผ๋ฉฐ ์ด๋ฅผ ListCollectionView์ ์ถ๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด CollectionView์๋ ์คํฌ๋กค์ด ์์ด์ผ ํฉ๋๋ค. ์ด๋ ๊ฒํ๋ฉด ์ด ์ค๋ ๋๋ฅผ ๋ฎ์ ๊ฒ์ ๋๋ค.
IItemsLayout ์ธํฐํ์ด์ค์ ์ด๋ฆ์ ICollectionViewLayout์ผ๋ก ๋ณ๊ฒฝํ๊ฒ ์ต๋๋ค. ํ๋ ์์ํฌ์๋ ์ด๋ฏธ Layout
๋ฐ ItemsView
์์ต๋๋ค. ๋ ๊ธด ์ด๋ฆ์ด์ง๋ง ICollectionViewLayout์ ํญ๋ชฉ์ ํ์ํ๋ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ด ์๋๋ผ CollectionView์๋ง ํด๋นํ๋ ์ฉ๋๋ฅผ ๋ํ๋ด๋ ๊ฐ๋ ฅํ ํ์์
๋๋ค.
ItemsLayout ํด๋์ค์ ์ด๋ฆ์ OrientedCollectionViewLayout์ผ๋ก ๋ณ๊ฒฝํ๊ฒ ์ต๋๋ค. ์ถ์ ๊ธฐ๋ณธ ํด๋์ค๊ฐ ์ค์ ๋ก ๋ฌด์์ ์ํ ๊ฒ์ธ์ง์ ๋ํ ๊ฐ๋ ฅํ ํ์์ด๋ฉฐ ๋ชจ๋ ํ์ ํด๋์ค๋ ํญ๋ชฉ์ ์งํฅ์ ์ธ ๋ฐฉ์์ผ๋ก ๋ ์ด์์ํฉ๋๋ค. ๋ํ ์ด๋ฆ์ "Oriented"๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ค์ "CollectionViewLayout"์ด๋ผ๋ ์ถ์ ๊ธฐ๋ณธ ํด๋์ค๋ฅผ ์ถ๊ฐํ ์ ์๋ ์ต์ ์ด ์ ๊ณต๋ฉ๋๋ค. ๋ฐฉํฅ์ด ์๋ ํด๋์ค๋ฟ๋ง ์๋๋ผ ๋ชจ๋ ์ปฌ๋ ์ ๋ณด๊ธฐ ๋ ์ด์์ ํด๋์ค์ ๋ช ๊ฐ์ง ์๋ก์ด ๊ณตํต ๊ธฐ๋ฅ์ด ํ์ํ ๊ฒฝ์ฐ.
ViewCell์ ์ ๊ฑฐํ๊ณ DataTemplate๋ง ์ฌ์ฉํ๋ ๊ฒ์ ๋งค์ฐ ํ์ํ๋ฉฐ ์ฌ์ฌ์ฉ์ฑ์ ํฅ์์ํต๋๋ค.
๊ด์ฌ์ด ์๋ ์ฌ๋์ด ์์ผ๋ฉด ์์ ์ฒซ ๋ฒ์งธ ์๊ฒฌ์ ์ ๋ฐ์ดํธํ์ต๋๋ค.
๋๋ @andreinitescu ๊ฐ ์คํฌ๋กคํ์ง ์๋ ์ปฌ๋ ์ ์ ๊ฐ์ง ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉด
์คํฌ๋กค ๊ธฐ๋ฅ์ ์ ์ดํ๋ค๋ ์์ด๋์ด๊ฐ ๋ง์์ ๋ค๊ธด ํ์ง๋ง ListView์ ๋ชจ๋ ๊ณ ๊ธ ๊ธฐ๋ฅ์ด๋ ๋จธ๋ฆฌ ์์์ ์ ์๋ CollectionView๋ฅผ ํฌํจํ๋ ์คํฌ๋กค๋์ง ์๋ "์ปฌ๋ ์ "์ ๋ํ ์ค๋๋ ฅ ์๋ ์ฌ์ฉ ์ฌ๋ก๋ ์๊ฐํ์ง ์์ต๋๋ค. ์คํฌ๋กค๋์ง ์๋ ๋ชฉ๋ก์ ๋ํ ๋์ ์ฌ์ฉ ์ฌ๋ก๋ ํญ์ ์ฌ์ํ ํญ๋ชฉ ๋ชฉ๋ก์ผ๋ก ํด๊ฒฐ๋์์ต๋๋ค. ListView๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ผ๋ฐ์ ์ธ ์ด์ ๋ ์ ํ์ ์ํ์ง ์๊ฑฐ๋ ๋ชฉ๋ก์ ๊ฐ๋ก๋ก ๋ ์ด์์ํ๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ ์๋ ์ฌ์์ ํฌํจ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ์คํฌ๋กค ์์ด ์ฌ์ฉํ ์ ์๋ ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก์ ๊ด์ฌ์ด ์์ต๋๋ค.
@bmacombe ๋ฐ์ธ๋ฉ ๊ฐ๋ฅํ StackLayout์ ๊ตฌํํ๋ ๊ฒ์ด "๊ฐ๋จํ๋ค"๋ ๋ฐ ๋์ํ์ง๋ง ๊ทธ๊ฒ ์ ๊ฐ ์๊ฐํ๋ ์์ง๋ ์๋๋๋ค. ์ด๊ฒ์ ๋งค์ฐ ์ผ๋ฐ์ ์ธ ๊ธฐ๋ฅ์ ๋๋ค. ํ๋ ์์ํฌ์ ํฌํจํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๊ทธ๋ฆฌ๊ณ ์ฝ๊ฐ์ ๊ณํ๋ง ์์ผ๋ฉด ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์์์ ์ด๋ฏธ ๋งํ๋ฏ์ด ๊ธฐ๋ณธ ํด๋์ค(Windows XAML์ ItemsControl๊ณผ ์ ์ฌ) ๋ฐ CollectionView(ListView)์ ๋ ๊ฐ์ง ํด๋์ค์ ๊ธฐ๋ฅ์ ๋ถ์ฐํ๋ฉด ํด๊ฒฐํ ์ ์์ต๋๋ค. ์ด์์ ์ผ๋ก๋ ๊ณ์ธต ๊ตฌ์กฐ์ ์ ํ๊ธฐ ํด๋์ค๊ฐ ์์ด์ผ ํฉ๋๋ค(https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.controls.primitives.selector ์ฐธ์กฐ).
์คํฌ๋กคํ์ง ์๋ ์ต์ ์ด ์๋ ์ฌ์ํ ์ด์ ๋ ์ผ๋ถ ํ์ด์ง์๋ ์ ์ฒด ํ์ด์ง์ ๋ํ ScrollView์ ํญ๋ชฉ ๋ชฉ๋ก์ด ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋ ๊ฒ ํ๋ฉด ํ์ฌ๋ก์๋ ScrollView์ ListView๋ฅผ ๋๋ ๊ฒ์ ๊ถ์ฅํ์ง ์์ต๋๋ค. ์ฌ์ ํ ์ ์ฌ์ ์ผ๋ก ListView์ ๋ชจ๋ ๊ธฐ๋ฅ์ ๊ฐ๊ณ ์๊ณ ๊ฑฐ๊ธฐ์ ๋ฃ์ ์ ์๋ ๋ฐ์ธ๋ฉ ๊ฐ๋ฅํ CollectionView๋ ์ฌ๋ฌ ๋ฒ ํ์ํ๋ ๊ฒ์ ๋๋ค.
๋๋ ๋ค๋ฅธ ๋ชจ๋ ์ฌ๋๋ค์ด ํ๋ ๊ฒ๊ณผ ๋์ผํ BindableStack์ ์์ฑํ์ง๋ง ํ๋์์ ๊ตฌ์ด ๊ฒ์ด ์์ ํ๊ธฐ์ ํจ์ฌ ๋ ์ข์ ๊ฒ์ ๋๋ค.
@adammeaney ๊ทธ๊ฒ์ ๋ง์ด ๋๋ฉฐ ์ง๊ธ ์๊ฐํด๋ณด๋ฉด ๋น์ทํ ์ผ์ ํ์ต๋๋ค.
@andreinitescu ๋๋ ๊ทธ๊ฒ์ด ๋ด์ฅ๋์ด ์์ผ๋ฉด ์ข์ ๊ฒ์ด๋ผ๋ ๋ฐ ๋์ํ์ง ์์ต๋๋ค. ๋๋ ๋ชจ๋ ์ฌ๋์ด ํ์ํ ๊ฒ๊ณผ ์ต์ ์ ๋ฐฉ๋ฒ์ ๋ํด ๊ฐ์ ํ์ด์ง์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ค ์ ํ์ "์คํฌ๋กค ์์" ์ต์ ์ด ์๋ ํ ๋ ์ ๊ทผ ๋ฐฉ์ ๋ชจ๋ ๊ด์ฐฎ์ต๋๋ค.
๋ด ์์ ์ ํ๋ ์์ํฌ์์๋ ํญ์ ๋ง์ ๊ธฐ๋ฅ์ ํ๋์ ์ปจํธ๋กค์ ๊ตฌ์ถํ๊ฑฐ๋ ์ฆ๋ถ ๊ธฐ๋ฅ์ด ์๋ ์ ์ฌํ ํด๋์ค๋ฅผ ๋ง์ด ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฌ๋ Forms ํ์ ํนํ ๊ธฐ๋ณธ ํ๋ซํผ ๊ตฌํ์ ๊ณ ๋ คํ์ฌ ๊ฐ์ฅ ์ ๊ตฌํํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
@bmacombe ๊ณํ์ ํ๋ฉด ํ ๋๋ก ๋ ๋ง๋ฆฌ์ ์๋ฅผ ์ป์ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์๋ฅผ ๋ค์ด ๋ด๊ฐ ์ธ๊ธํ ๋ฐฉ์์ผ๋ก ์๋ํ๋ 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 ๋ฐ Forms์ ๊ธฐํ ์ฌ๋ฌ ํญ๋ชฉ์ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ๋ด๋ถ์ ์ผ๋ก ์ฝ๊ฐ ๊ณ ์ฌํ์ต๋๋ค. "ํ๋ฉด์ ๋ง์ ํญ๋ชฉ"์ ๋ํด ๊ฐ๋ฅํ ์ด๋ฆ์ด ๋๋ฌด ๋ง์ต๋๋ค.
"CollectionView"๋ ํ์ฌ Forms์ ์๋ ๊ฒ๊ณผ ์ถฉ๋ํ์ง ์์ผ๋ฉฐ UWP ์ปจํธ๋กค ์ด๋ฆ("ListView"๊ฐ ํ๋ ๋ฐฉ์)๊ณผ ์ถฉ๋ํ์ง ์์ผ๋ฉฐ UICollectionView์ _์ ํํ_ ๊ฐ์ง ์์ต๋๋ค("UI" ์ ๋์ฌ ๋๋ฌธ์). ๊ฒ์ ๋ชฉ์ ์ผ๋ก๋ 100% ์ด์์ ์ด์ง๋ ์์ง๋ง ์ปจํธ๋กค์ ์๋๋ฅผ ๊ฐ์ฅ ์ ํํํ ๊ฒ ๊ฐ์ต๋๋ค.
์ฆ, ๋๊ตฐ๊ฐ ์ฐ๋ฆฌ๊ฐ ์ฆ์ ์ฌ๋์ ๋น ์ง๋ ๋ค๋ฅธ ์ด๋ฆ์ ์ ์ํ๋ฉด ๊ธฐ๊บผ์ด ๊ฒ์ํ์ฌ ๊ต์ฒดํฉ๋๋ค.
(์ด๋ฆ์ "ListView2ColonRevengeOfTheListView"๋ก ์ง์ ํ๊ณ ์ถ์์ง๋ง @davidortinau๊ฐ ์ ๋ฅผ ๊ฒฉ์ถ
@dansiegel
์ด์ ๋ํ ๋ช ๊ฐ์ง ์ข์ ๋งฅ๋ฝ์ ์ผ์ชฝ์ผ๋ก ์ค์์ดํํ ๋ ํ๋์ ๋ฉ๋ด๊ฐ ํ์๋๊ณ ์ค๋ฅธ์ชฝ์ผ๋ก ์ค์์ดํํ ๋ ๋ค๋ฅธ ๋ฉ๋ด๊ฐ ํ์๋๋ ์ด๋ฉ์ผ ํด๋ผ์ด์ธํธ๋ฅผ ์๊ฐํ๋ ๊ฒ์ ๋๋ค.
SwipeView ์ฌ์์ ์ดํด๋ณด์ญ์์ค. ์ด๊ฒ์ด ๋ฐ๋ก ์ฐ๋ฆฌ๊ฐ ๋ชฉํ๋ก ํ๋ ๊ฒ์ ๋๋ค.
@GalaxiaGuy
์คํํน ์์ด์ฝ ์ง์
์ข์ ์ ์ ๋๋ค. ๊ฐ๋ฅํ๋ฉด ์ง์ํด์ผ ํฉ๋๋ค. ๊ธฐ๋ณธ ์ ๊ณต UWP ๊ธ๋ฆฌํ์ ํจ๊ป ์๋ํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ์คํ ์ ํ์ด ๋ค๋ฅธ ํ๋ซํผ์์ ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด ์ฝ๊ฐ์ ์กฐ์ฌ๋ฅผ ํด์ผ ํ ๊ฒ์ ๋๋ค(๋ต์ "์"๋ผ๊ณ ์๊ฐํฉ๋๋ค).
์ ๋ฐ์ดํธ: ์ด ์ฌ์์ FontIconSource ๋ถ๋ถ์ด ์์ฒด ์ฌ์ ์ผ๋ก ์ด๋๋์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์จ๋ฒ์์ ํ๋ ์ด์์ ์ฌ์ง์ ์ ํํ๋ ๊ฒ๊ณผ ๊ฐ์ด ์ ํ ํญ๋ชฉ์์ ํญ๋ชฉ์ ์ฌ๋ฌ ๊ฐ ์ ํํ๋ ์ฌ์ฉ์ ์๋๋ฆฌ์ค์ ๋๋ค. OneDrive ๋๋ WhatsApp๊ณผ ๊ฐ์ ์ฑ์์ ํํ ๋ณผ ์ ์๋ ์๋๋ฆฌ์ค์ ๋๋ค.
@hartez
์ฆ, ๋๊ตฐ๊ฐ ์ฐ๋ฆฌ๊ฐ ์ฆ์ ์ฌ๋์ ๋น ์ง๋ ๋ค๋ฅธ ์ด๋ฆ์ ์ ์ํ๋ฉด ๊ธฐ๊บผ์ด ๊ฒ์ํ์ฌ ๊ต์ฒดํฉ๋๋ค.
๋ค๋ฅธ ์ด์ ๋ก ์ด๋ฏธ ์ ์ด๋ฆ์ ์ ์ํ์ต๋๋ค.
SelectionMode
์ด Multiple
์ผ ๋ SelectedItem
์ ๊ฐ์ ์ผ๋ง์
๋๊น? ๋ด๊ฐ ์๊ฐํ ์์๋ 5 ๊ฐ์ง ์ต์
์ด ์์ต๋๋ค.
SelectionMode
๊ฐ Multiple
๊ฒฝ์ฐ SelectedItem
๋ฅผ ์ ํ ์ง์ํ์ง ์์ผ๋ ค๋ ๊ฒฝ์ฐ.@AmrAlSayed0
SelectionMode๊ฐ ๋ค์ค์ผ ๋ SelectedItem์ ๊ฐ์ ๋ฌด์์ ๋๊น?
์ง๊ธ ๋๋ต์ " SelectionMode
๋ฅผ Multiple
๋ก ์ ํํ๊ธฐ ์ ์ ์ํ"์
๋๋ค.
@๋ก๊ธฐํฌ
์ ํ ํญ๋ชฉ์์ ํญ๋ชฉ์ ์ฌ๋ฌ ๊ฐ ์ ํํ๋ ์ฌ์ฉ์ ์๋๋ฆฌ์ค์ ๋๋ค.
์ด ์ ํ ์๋๋ฆฌ์ค๊ฐ ์ง์๋๋์ง ์ฌ๋ถ๋ฅผ ๋ฌป๊ณ ์์ต๋๊น? AFAIK, ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ค๋ ๋ชจ๋ ๊ธฐ๋ณธ ์ปจํธ๋กค์ด ์ด๋ฅผ ์ง์ํ๋ฏ๋ก CollectionView์์ _์ง์ํด์ผ ํฉ๋๋ค_.
SelectionMode์ ๋ํ ๋ฐ์ธ๋ฉ ๊ฐ๋ฅํ ์คํ์ผ์ ์ ์ฉํ ๊ฒ์ ๋๋ค. SelectionMode=None, Transparent ๋ฑ์ธ ๊ฒฝ์ฐ ์ด๊ฒ์ Radlist๊ฐ ์ํํ๋ ์์ ์ผ๋ก ๋ฐ์ธ๋ฉ์ ๊ธฐ๋ฐ์ผ๋ก ์๊ฐ์ ์ํ๋ฅผ ์ฒ๋ฆฌํ๋ ๋งค์ฐ ์ ์ฉํ๊ณ ์ฌ์ด ๋ฐฉ๋ฒ์ ๋๋ค. ๊ฐ ์ ํ ๋ชจ๋์ ๋ํ ์คํ์ผ์ ์ด๋ฌํ ์๋๋ฆฌ์ค๋ฅผ ๋ค๋ฃน๋๋ค.
@andreinitescu
https://github.com/xamarin/Xamarin.Forms/issues/3172#issuecomment -401015625(๋ฐ ๊ธฐํ)์์ ๊ทํ์ ์๊ฒฌ์ ์๋ต:
๋น์ ์ ๋ง์ ์ข์ ์ ์ ์ง์ ํ๊ณ ์์ผ๋ฉฐ ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ๋ฌด์ํ์ง ์๋๋ค๋ ๊ฒ์ ํ์คํ ํ๊ณ ์ถ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์์ง ๋ชจ๋ ๋ต์ ์์ง ๋ชปํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด API๊ฐ ์ด๋์์ ์๋ํ๊ณ ์ด๋์์ ๋ฌด๋์ง๋์ง ๋ณผ ์ ์๋๋ก ์ด API๋ฅผ ์ถ๊ฐํ๋ ์ค์ ๋๋ค. ๋๋ ๋น์ ์ด ์ ์ํ๋ ํด๋์ค ๋ถ๋ฅ๊ฐ ์ฐ๋ฆฌ๊ฐ ๋๋ด์ผ ํ ์์น์ ๊ฝค ๊ฐ๊น๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฐ๋ฆฌ๋ ๋น์ (๊ทธ๋ฆฌ๊ณ ๋ช๋ช ๋ค๋ฅธ ์ฌ๋๋ค)์ด ํ ํ๋ฆฟ ํญ๋ชฉ์ StackLayouts ๋ฐ Grids(์ฆ, "BindableRepeater")๋ก ๋ ๋๋งํ ์ ์๋ ์ค๊ฐ ํด๋์ค๋ฅผ ๊ฐ๋ ๋ฐ ๋งค์ฐ ์ด์คํ๊ณ ์์ผ๋ฉฐ ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ํ์ ์ค์ธ ์ฌ์ฉ ์ฌ๋ก ์ค ํ๋๋ผ๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
@alexhardwicke
์ผ๋ฐ์ ์ผ๋ก ์ API์์๋ ํ์ํ ๊ฒฝ์ฐ ๋์์ ํ์ฅํ ์ ์๋ ์ง์ ์ ์ถ๊ฐํ์ญ์์ค.
๋ ๋๋ฌ์ UpdateX
๋ฉ์๋๋ protected virtual
์
๋๋ค. :)
์ง์งํ๊ฒ, ์ฐ๋ฆฌ๋ ์ด๊ฒ์ด ๊ณผ๊ฑฐ์ ๊ณจ์นซ๊ฑฐ๋ฆฌ์์์ ์๊ณ ์์ผ๋ฉฐ CollectionView
๋ฅผ ์์ฑํ๋ ๋์ ์ด๋ฅผ ์ผ๋์ ๋๊ณ ์์ต๋๋ค.
๋ค์ ์๊ฐํด ๋ณด๋ฉด CollectionView๊ฐ ์ด ๋ณด๊ธฐ์ ํด๋์ค ์ด๋ฆ์ผ๋ก ์ข์ ์ ํ์ด ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.
Windows XAML์์ CollectionView๋ ๊ทธ๋ฃนํ ํํฐ๋ง์ ์ฌ์ฉ๋๋ ํญ๋ชฉ์ ๋ฐ์ดํฐ ์๋ณธ์ ๋ํ ๊ธฐ๋ณธ ํด๋์ค์
๋๋ค. https://msdn.microsoft.com/en-us/library/system.windows.data.collectionview(v=vs . 110).aspx
์๋ง๋ ์ด๋ ์์ ์์ Xamarin Forms๋ ๋์ผํ ๋ชฉ์ ์ ์ํ ํด๋์ค๋ฅผ ๊ฐ๊ฒ ๋ ๊ฒ์ด๋ฉฐ, ํนํ XAML Standard์ ๋ํด ์๊ฐํ ๋ ๋์ผํ ์ด๋ฆ(CollectionView)์ ๊ฐ๋ ๊ฒ์ด ์๋ฏธ๊ฐ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค(์์ง๋ ๊ณํ๋์ด ์์ต๋๊น?).
๋ณด๊ธฐ ํํ๊ณ ์ฌ๋ฏธ์์ง๋ง ListView2๊ฐ ์ข์ ์ ํ์ ๋๋ค. ๊ธฐ์กด ์ด๋ฆ์ด ์๋ฏธ๊ฐ ์๋ ์ ์ผํ ์ด๋ฆ์ธ ๊ฒฝ์ฐ ๋ฒ์ ๊ด๋ฆฌ์ ์ ๋ฏธ์ฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด .NET์์ ๊ถ์ฅ๋๋ ๋ฐฉ๋ฒ์ ๋๋ค.
๊ธฐ์กด API์ ์ ๋ฒ์ ์ ๋ํ๋ด๊ธฐ ์ํด ์ซ์ ์ ๋ฏธ์ฌ๋ฅผ ์ฌ์ฉํ์ญ์์ค. ํนํ API์ ๊ธฐ์กด ์ด๋ฆ์ด ์ ์ผํ๊ฒ ์๋ฏธ๊ฐ ์๋ ์ด๋ฆ์ธ ๊ฒฝ์ฐ(์ฆ, ์ฐ์ ํ์ค์ธ ๊ฒฝ์ฐ) ์๋ฏธ ์๋ ์ ๋ฏธ์ฌ๋ฅผ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ(๋๋ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ) name)์(๋) ์ ์ ํ ์ต์ ์ด ์๋๋๋ค.
_ํ๋ ์์ํฌ ๋์์ธ ์ง์นจ: ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ .NET ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ๊ท์น, ๊ด์ฉ๊ตฌ ๋ฐ ํจํด, 2ํ_
https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/general-naming-conventions
๋์ค์ ์ด๋ ์์ ์์ ๋ชจ๋ ์ฌ๋๋ค์ด ์๋กญ๊ณ ๋ฐ์ง์ด๋ ๊ฒ์ ์ฌ์ฉํ ๊ฒ์ ๋๋ค. ์์ ์ ์ด๊ณ ์ฑ๋ฅ์ด ์ข์ ListView2 :). ๋นจ๋ฆฌ ๊ฐ๊ธฐ, ๋น๋ก ๋ธ๋ ์ดํน ์ฒด์ธ์ง์๋ ๋ถ๊ตฌํ๊ณ ListView2์ ์ด๋ฆ์ ListView๋ก ๋ฐ๊พธ๋ ๊ฒ์ ๋ชจ๋ ์ฌ๋์๊ฒ ๊ฐ๋จํ๊ณ ํ์๋ฐ๋ ๋ฆฌํฉํ ๋ง์ด ๋ ๊ฒ์ ๋๋ค.
Xamarin Forms์๋ ์ด๋ฏธ ItemsView๊ฐ ์์ต๋๋ค.
์ CollectionView ํด๋์ค๋ฅผ ๋ง๋๋ ๋์ ๊ธฐ์กด ItemsView๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๊น?
API ์ค๊ณ ๋ฐ ๊ตฌํ์๋ ๋ชฉ๋ก ํญ๋ชฉ์ ํ์ํ์ง๋ง ๋จ์ํ๊ณ ๊ฐ๋ณ๊ณ ์คํฌ๋กคํ ์ ์๊ณ ์คํฌ๋กคํ ์ ์๋ ํญ๋ชฉ์ ํ์ํ๊ธฐ ์ํ "BindableRepeater"์ ๊ฐ์ ๊ฒ์ ๊ฐ์ง ์ ์๋ ์ ์ฐ์ฑ์ด ์๋ ๊ธฐ๋ณธ ํ๋ซํผ ์ปจํธ๋กค์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ด๋ จ๋ ๋ช
๋ฐฑํ ๋์ ์ด ์์ต๋๋ค. -์ ํ ๊ฐ๋ฅํ ํญ๋ชฉ ๋ชฉ๋ก.
Uno๊ฐ ํด๋ธ ๊ฒ ๊ฐ์ต๋๋ค.
์ CollectionView ํด๋์ค๋ฅผ ๋ง๋๋ ๋์ ๊ธฐ์กด ItemsView๋ฅผ ์ ListView์ ๊ธฐ๋ณธ ํด๋์ค๋ก ์ฌ์ฉํ ์๋ ์์ต๋๊น?
ItemsView<T>
๊ฐ ์์ง๋ง ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์ฌ์ฉํ๊ณ ์ถ์ง ์์ต๋๋ค. TemplatedItemsList
. ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ด ์๋ก์ด ์ปจํธ๋กค์์ ํผํ๋ ค๊ณ ํ๋ cruft์ ์ผ๋ถ์
๋๋ค.
๋์ค์ ์ด๋ ์์ ์์ ๋ชจ๋ ์ฌ๋๋ค์ด ์๋กญ๊ณ ๋ฐ์ง์ด๋ ๊ฒ์ ์ฌ์ฉํ ๊ฒ์ ๋๋ค. ์์ ์ ์ด๊ณ ์ฑ๋ฅ์ด ์ข์ ListView2 :). ๋นจ๋ฆฌ ๊ฐ๊ธฐ, ๋น๋ก ๋ธ๋ ์ดํน ์ฒด์ธ์ง์๋ ๋ถ๊ตฌํ๊ณ ListView2์ ์ด๋ฆ์ ListView๋ก ๋ฐ๊พธ๋ ๊ฒ์ ๋ชจ๋ ์ฌ๋์๊ฒ ๊ฐ๋จํ๊ณ ํ์๋ฐ๋ ๋ฆฌํฉํ ๋ง์ด ๋ ๊ฒ์ ๋๋ค.
๋น์ ์ ๋๊ด์ฃผ์๋ ๋งค๋ ฅ์ ์ด์ง๋ง ListView(1)์ด ์์ํ๊ณ ListView2 ์ด๋ฆ ๋ฐ๊พธ๊ธฐ์ ๊ฐ์ ์ฃผ์ ๋ณ๊ฒฝ์ด ํ์ฉ๋์ง ์๋๋ค๋ ๊ฐ์ ํ์ ์์ ํด์ผ ํฉ๋๋ค.
Windows XAML๊ณผ ๋๋ฑํ๊ฒ ์ ์งํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ์ ์ปจํธ๋กค์ด ์ฝ์์ ์งํค๋ ํ ์ํ๋ ์ด๋ฆ์ ์ฌ์ฉํ์ญ์์ค. Uno ํ๋ ์์ํฌ๋ ๊ทธ๋ ๊ฒ ํ๋ ๋ฐ ์ฑ๊ณตํ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฏ๋ก ์ด์ ์ฌ๋ฌ๋ถ์ด Xamarin Forms์์ ๋ฌด์์ ๊ฐ์ ธ์ค๊ณ ์๋์ง ๋ณด๊ณ ์ถ์ต๋๋ค.
@gmwilhelm
https://github.com/xamarin/Xamarin.Forms/issues/3172#issuecomment -400925994
์ข์ ์ง์ . API์ ์ ์ ์ ์ผ๋ก ์ถ๊ฐํ์ต๋๋ค. iOS์ Android์์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์์ ํ ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ ์ ์ผ๋ก ๋งํ์ง๋ง UWP๋ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๊ณ ์ ์พํ๊ฒ ๋์นญ์ ์ด๋ผ๋ ๊ฒ์ ๋ถ์ ํ ์ ์์ต๋๋ค.
GroupItemsBinding
์ถ๊ฐํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
์ด๋ ๊ฒ ํ๋ฉด ListView์ ๊ฐ์ด ๊ทธ๋ฃน์ด ์ปฌ๋ ์
์์ ํ์๋๋๋ก ์๊ตฌํ๋ ๋์ Group์ ์ปฌ๋ ์
์ ํ ์์ฑ์ด ํฌํจ๋ ์ ์์ต๋๋ค . ์ด ๊ธฐ์กด ListView ์ ํ์ผ๋ก ์ธํด ์ฌ๋ฌ ๊ฒฝ์ฐ์ ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ์ฑ๋ฅ์ด ๋ง์ด ์๋ชจ๋๋ ๋ณต์ ๋ฅผ ์ํํด์ผ ํ์ต๋๋ค. GroupItemsBinding
์ถ๊ฐํ๋ฉด ์ด๋ฅผ ๋ฐฉ์งํ๊ณ ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋ํ ๋ณด๋ค ์ ์ฐํ ๋งคํ์ ํ์ฉํฉ๋๋ค.
์ฆ, GroupDisplayBinding ๋ฌธ์์ ์ฌ์ฉ๋ ์๋ ๋ค์๊ณผ
```C#
class Group // Group์ ObservableCollection์์ ํ์๋ ํ์๊ฐ ์์ต๋๋ค.
{
๊ณต๊ฐ ๊ทธ๋ฃน(๋ฌธ์์ด firstInitial) { FirstInitial = firstInitial; }
public string FirstInitial { get; private set; }
public ObservableCollection<Person> Persons { get; set; } // We use a property for the group items instead
}
๋ชฉ๋ก ๋ณด๊ธฐ ๋ง๋ค๊ธฐ ๋ชฉ๋ก ๋ณด๊ธฐ()
{
var listView = ์๋ก์ด ListView {
GroupItemsBinding = ์ ๋ฐ์ธ๋ฉ(nameof(Group.Persons))
// ...
};
// ...
}
```
์ด๊ฒ์ด UICollectionView๊ฐ ๋ ์ด์์ ์ธก๋ฉด์์ ์ํํ๋ ์์ ์ ํ์ ์งํฉ์์ ๊ฐ์ํ ๋ ์ปจํธ๋กค์ ๊ธฐ๋ฅ๊ณผ ํผ๋์ ํผํ๊ธฐ ์ํด ๋ค๋ฅธ ์ด๋ฆ์ ์ ํํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ช ํํํ๊ธฐ ์ํด์ด ์ปจํธ๋กค์ ์์ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ํํฉ๋๊น? ์ฐธ์กฐํ๋ ค๊ณ ํ์ง๋ง ํ๋ก์ ํธ์์ ์ฐพ์ ์ ์์ต๋๋ค.
@titonton ์ด๊ฒ์ CollectionView์ ๋ํ ์ฌ์์ ๋ ผ์ํ๊ธฐ ์ํ ๋ฌธ์ ์ด๋ฉฐ ๊ตฌํ์ด ์์ง ์์๋์ง๋ ์์์ผ๋ฉฐ ์ฌ์์ด ํ์ ๋ ๋๊น์ง ๊ทธ๋ด ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
@AmrAlSayed0 ์ฌ์ค 11์ผ ์ ์ "Sprint 139์์ ์งํ ์ค"์ผ๋ก ์ด๋ํ๊ธฐ ๋๋ฌธ์ ์์ํ์ด์ผ ํฉ๋๋ค.
API์ ๋ํ ๊ฒฐ์ ์ด ๋ฌด์์ธ์ง ๋ช ํํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ์ด๋ป๊ฒ ์์๋์๋์ง๋ ๋งค์ฐ ๋ถ๋ถ๋ช ํฉ๋๋ค.
@opcodewriter ๊ทธ๊ฒ ๋ด๊ฐ ์๊ฐํ ๊ฒ์ ๋๋ค. @AmrAlSayed0 ์ค๋ช ๊ฐ์ฌํฉ๋๋ค.
๋๊ตฐ๊ฐ ์ด ์ฌ์์ ํ์ฌ ์ํ๋ฅผ ๋ช ํํ ํ ์ ์์ต๋๊น? ์ปค๋ฎค๋ํฐ์์ ๋์์ ์ค ์ ์๋ ๋ถ๋ถ์ด ๋๋ฝ๋์์ต๋๊น?
@migueldeicaza @hartez ์ด๋ฆ์ CollectionView
๋ก ์ง์ ํ์ง ์์ผ๋ ค๋ฉด ์ด๋ฆ์ ์ง์ ํ๋ ๊ฒ์ด ์ด๋ ค์ธ ๊ฒ์
๋๋ค. CatalogView
์ด๋ป์ต๋๊น?
์นดํ๋ก๊ทธ๋ ์ข ์ข ํ๋ ์ด์์ ์ด๊ณผ ์ ์ฌํ ๊ธ๊ผด, ํ ์คํธ, ๋ ์ด์์ ๋ฑ์ ๊ฐ์ง ์ฌ๋ฌ ํ์ ํญ๋ชฉ์ผ๋ก ๋์์ธ๋ฉ๋๋ค.
๊ฒฌ๋ณธ:
@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 ๋ฑ)์ ์ฝ๊ฒ ํ์ฉํ ์ ์๋๋ก ํ๋ ๊ฒ์ด์์ต๋๋ค.
Forms Layouts(FlexLayout, StackLayout, etc. ). ๊ทธ๋ฆฌ๊ณ ๋ช ๊ฐ์ง ๋ช ๋ฐฑํ ๊ธฐ๋ฅ ์ค๋ณต์ด ์์ต๋๋ค(์: ๋ ์๋๋ฆฌ์ค ๋ชจ๋ DataTemplate ์ฌ์ฉ). ๊ทธ๋ฌ๋ ๊ฒฐ๊ตญ์๋ ๊ทผ๋ณธ์ ์ธ ์ํคํ ์ฒ ์ฐจ์ด๊ฐ ํฌ๋ฉฐ ํจ๊ป ๋ณผํธ๋ก ๋ฌถ์ผ๋ ค๊ณ ํ๋ฉด ๋จ์ํ ๋ณ๋์ ์ปจํธ๋กค๋ก ๋๋ ๊ฒ๋ณด๋ค ์ ์ง ๊ด๋ฆฌ๊ฐ ๋ ์ด๋ ต๊ณ ํผ๋์ค๋ฌ์ด ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ช ๋ ์์ ListView3๋ฅผ ๊ตฌํํด์ผ ํ๋ ๋ณต์กํ ๊ฒ์ ๋ง๋ค๊ณ ์ถ์ง ์์์ต๋๋ค. ์๋์์ ๋ ์์ธํ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
์ด๊ฒ์ ๊ฒฐ๊ณผ๋ CollectionView๊ฐ Forms ์ฌ์ฉ์๊ฐ ๊ธฐ๋ณธ ๋ชฉ๋ก/๊ทธ๋ฆฌ๋ ์ปจํธ๋กค์ ํ์ฉํ๊ณ ๋ ์ด์์ ์์ง๊ณผ ๊ฐ์ํ์ ์ด์ ์ ๋๋ฆด ์ ์๋๋ก ํ๋ ๋ฌธ์ ์ ๊ณ์ ์ด์ ์ ๋ง์ถ ๊ฒ์ด๋ผ๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ #1718์ Forms ์ฌ์ฉ์๊ฐ ItemsSource
๋ฐ ItemTemplate
๋ฅผ ๋ค์ํ Forms Layout ์์ง์ ๋ฐ์ธ๋ฉํ ์ ์๋๋ก ํ๋ API๋ฅผ ๋ฐ์ํ๋๋ก ์
๋ฐ์ดํธ๋ฉ๋๋ค.
๋ ์ปจํธ๋กค ๋ ํ๋์ _์ด์ _์ ๊ด์ฌ์ด ์๋ ์ฌ๋๋ค์ ์ํด:
์ฌ๊ธฐ์ ์ค๋ช ๋ ๊ฒ(CollectionView๋ก)๊ณผ #1718์ ์ ์ ๊ฐ์ ๊ทผ๋ณธ์ ์ธ ์ฐจ์ด์ ์ ๋ ์ด์์์ด ๋ฐ์ํ๋ _where_์ ๋๋ค.
CollectionView๋ ๊ธฐ๋ณธ ๋ ์ด์์ ์์ง(ํ๋ซํผ ๊ฐ๋ฐ์์ ์ํด ํฌ๊ฒ ์ต์ ํ๋จ)์ ์ฌ์ฉํ์ฌ ๋ ์ด์์์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. Forms์ ์ผ๋ถ ์ฌ์ฉ์ ์ ์ ์ฝ๋๊ฐ ๊ด๋ จ๋์ง๋ง(์: Android ๋ฐ iOS์์ SnapPoints ๋ก์ง๊ณผ ๊ฐ์ ๊ฒ์ ์ ๊ณตํ๋ ๊ฒฝ์ฐ) ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ๋ ์ด์์ ์์ง(๋ฐ ๊ธฐ๋ณธ ๊ฐ์ํ ๊ตฌํ)์ด ๋ฌด๊ฑฐ์ด ์์ ์ ์ํํ๊ณ ์์ต๋๋ค. ์ด๊ฒ์ ์ฑ๋ฅ๊ณผ ๊ด๋ จํ์ฌ ํฐ ์ฐจ์ด๋ฅผ ๋ง๋ญ๋๋ค.
๋ฐ๋ผ์ ๊ฐ๋ฐ์๊ฐ CollectionView์ ์ ๊ณตํ๋ ๋ ์ด์์ ์ ๋ณด๋ ํด์์ ์ํด ๊ฐ ํ๋ซํผ์ ๋ ๋๋ฌ์ ์ ๋ฌ๋ ๋ฟ์ ๋๋ค. ์ด๋ ํจ๊ณผ์ ์ผ๋ก ํ์ง ์ธ์ด๋ก ๋ฒ์ญ๋๋ ์ฌ์์ ๋๋ค(Android์ LinearLayoutManager/GridLayoutManager, iOS์ UICollectionViewFlowLayout ๋ฑ). DataTemplate ์ธ์ Forms๋ ๋ ์ด์์ ์์ ์ ์ํํ์ง ์์ต๋๋ค.
๋์กฐ์ ์ผ๋ก, Forms ๋ ์ด์์(FlexLayout, StackLayout, AbsoluteLayout ๋ฑ)์ ์์ ํ Forms ๋ ์ด์ด์ ๋ฐฐ์น๋ฉ๋๋ค. Forms Layout์ ๋ ๋๋ฌ๋ ๊ฑฐ์ ์ํํ์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ์ํ๊ฐ ์ผ์ด๋์ง ์์ต๋๋ค. ๋ชจ๋ ํญ๋ชฉ์ด ์์ฑ๋์ด ์ฒ์๋ถํฐ ๋ ์ด์์์ ๋ฐฐ์น๋ฉ๋๋ค.
์ด ๋ ๊ฐ์ง๋ฅผ ๊ฒฐํฉํ๋ ค๊ณ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ด๋ ค์ด ์ง๋ฌธ์ด ๋์ต๋๋ค.
๋ ๋๋ฌ ๋งคํ์ ์ด๋ป๊ฒ ์๋ํฉ๋๊น? StackLayout์ ์ฌ์ฉํ๋ CollectionView์๋ RecyclerView๋ฅผ ์ฌ์ฉํด์ผ ํ๋ CollectionView์ ๋งค์ฐ ๋ค๋ฅธ ๋ ๋๋ฌ๊ฐ ์์ต๋๋ค. ๊ทธ๊ฒ๋ค์ ํจ๊ป ๋งค์ฌํ๊ณ ํ์ํ์ง ์์ ๋ RecyclerView๋ฅผ ์จ๊น๋๊น? DefaultRenderer์์ ํ์๋ ๋ ๋๋ฌ๊ฐ ์์ต๋๊น? ๊ทธ๋ ๊ฒ ํ๋ฉด ์ค์ ๋ก ํ์ํ์ง ์์ ์ถ๊ฐ ViewGroup ๋ ์ด์ด๊ฐ ํญ์ ์์ต๋๋ค.
ScrollView๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํฉ๋๊น? UICollectionView๋ ์์ฒด ์คํฌ๋กค ํ์๋ฅผ ์ฒ๋ฆฌํ์ง๋ง StackLayout์ด ์คํฌ๋กคํด์ผ ํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ์๋ ์ผ๋ฐ์ ์ผ๋ก Forms์ ์๋์ผ๋ก ์ถ๊ฐํฉ๋๋ค. ํ์ํ ๊ฒฝ์ฐ ์คํฌ๋กค์ ์๋์ผ๋ก ์ฝ์ ํ๊ธฐ ์ํด ๋ค๋ฅธ ๋ ์ด์ด๋ฅผ ์ถ๊ฐํฉ๋๊น? ๋ ์ด์์์ด UICollectionView๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ ์๋์ผ๋ก ์ถ๊ฐํ ScrollView๋ฅผ ๋นํ์ฑํ/์ ๊ฑฐํฉ๋๊น?
๊ทธ ๋ฌธ์ ์ ๋ํด ScrollTo ๋ฉ์๋๋ ์ด๋๋ก ์ด๋ํฉ๋๊น?
... ๋ฑ๋ฑ. ์ด๋ฌํ ๋ชจ๋ ๋ฌธ์ ๋ _ํด๊ฒฐ ๊ฐ๋ฅ_ํ์ง๋ง ๋ชจ๋ ์๋ฃจ์ ์ _๋ณต์ก์ฑ_์ ์ถ๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ #1718์์ ์ง์ ํ๋ฏ์ด Forms Layout์ ItemsSource ๋ฐ ItemsTemplate์ ์ถ๊ฐํ๋ ๊ฒ์ ๊ทธ๋ฆฌ ์ด๋ ต๊ฑฐ๋ ๋ณต์กํ์ง ์์ต๋๋ค. ์ด ๋ ๊ฐ์ง ๋ณ๊ฐ์ ์๋๋ฆฌ์ค๋ฅผ ๊ฒฐํฉํ๊ธฐ ์ํด ๋ณต์กํ๊ฒ ๋ง๋๋ ๊ฒ์ ์ด์ ์ ๋๋ฆด ๊ฐ์น๊ฐ ์์ต๋๋ค.
ํผ๋์ค๋ฌ์์. ์ด๋ฏธ ๋ด๋ถ ๋ฐ๋ชจ๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ตฌํ์ ๋ํด์๋ ์ด๋ฏธ ๊ฝค ๋ฉ๊ฒ ๋ค๋ฆฝ๋๋ค. ์ด๊ฒ์ ๋ง์ 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), ์ ๋ ๋ค๋ฅธ ์ด๋ฆ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์นดํ๋ก๊ทธ๋ทฐ๋ ์ด๋ป์ต๋๊น?
์นดํ๋ก๊ทธ๋ ์ข ์ข ํ๋ ์ด์์ ์ด๊ณผ ์ ์ฌํ ๊ธ๊ผด, ํ ์คํธ, ๋ ์ด์์ ๋ฑ์ ๊ฐ์ง ์ฌ๋ฌ ํ์ ํญ๋ชฉ์ผ๋ก ๋์์ธ๋ฉ๋๋ค.
์ด๊ฒ์ ํฅ๋ฏธ๋ก์ด ์์ด๋์ด์ ๋๋ค. ํ์คํ ๊ธฐ์กด ์ปจํธ๋กค ์ด๋ฆ๊ณผ ์ถฉ๋ํ์ง ์์ต๋๋ค.
@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
CollectionView๋ก #3749์ ์ค๋ช ๋ ๋ฌธ์ ๊ฐ ์์ ๋์์ต๋๊น?
์ฌ๊ธฐ์CollectionView
์๋ItemTemplate
์์ฑ๋ง ์๋ ๊ฒ์ ๋ณด์๊ธฐ ๋๋ฌธ์ListView
์ ๊ฐ์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
@andreinitescu ๊ทธ ํ ๋ก ์ ์ง์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ ๋ DataTemplate์์ ์ด ๋ฌธ์ ๋ฅผ ์์ง ๋ชปํ์ต๋๋ค.
์ ๋ ๋ค์ ์ฃผ์ DataTemplate์ ์ญ์ฌ๋ฅผ ์ดํด๋ณด๋ ๋ฐ ์๊ฐ์ ํ ์ ํ ๊ฒ์
๋๋ค. DataTemplate์ด ์ ์ด๋ฐ ์์ผ๋ก ์ค๊ณ๋์๋์ง, ๊ทธ๋ฆฌ๊ณ ์๋์ผ๋ก ์ฌ๋ฐ๋ฅธ ์์
์ ์ํํ๋๋ก CreateContent
๋ฅผ ์์ ํ๋ ๋ฐ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ ๋ฌธ์ ๊ฐ ์๋์ง ์ฌ๋ถ(๋ ๋ค ListView ๋ฐ CollectionView).
@hartez ๋ด ์์ ์ ๋ฆฌํผํฐ ์ปจํธ๋กค์ ๋ง๋ค ๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ฐฉ๋ฒ์ ์์ ๋๋ค.
// ํ
ํ๋ฆฟ ์ ํ๊ธฐ๊ฐ ์๋์ง ๋๋ ํ
ํ๋ฆฟ๋ง ์๋์ง ํ์ธํฉ๋๋ค.
var templateToUse = itemTemplate์ DataTemplateSelector templateSelector์
๋๊น? templateSelector.SelectTemplate(ํญ๋ชฉ, null) : itemTemplate;
๋ฐ๋ผ์ ๊ทธ๋ฐ ๊ฒฝ์ฐ CreateContent๋ฅผ ์์ ํ๋ ๊ฒ๋ง์ผ๋ก๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์๊ณ ๋ถํ์ํ๊ฒ ๋ง๋ญ๋๋ค. ๊ทธ๋ฌ๋ ItemTemplate๊ณผ ItemTemplateSelector๋ฅผ ๋ณ๋์ ์์ฑ์ผ๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ด์์ ์ด๋ผ๋ @andreinitescu์ ์๊ฒฌ์๋ ๋์ํฉ๋๋ค. ์๋ง๋ ์ WPF ๋ฐ SL ๋ฐฐ๊ฒฝ ๋๋ฌธ์ผ ๊ฒ์ ๋๋ค.
@bmacombe IMHO, WPF/SL์ ๋ง๊ฒ ์ ๋ ฌํ๋ ๊ฒ์ ์ ํธ๋์ ๋ฌธ์ ์ผ ๋ฟ๋ง ์๋๋ผ ์ค์ ๋ก ๋ฌธ์ ์ด๋ฉฐ ํผ๋์ ์ผ๊ธฐํฉ๋๋ค. #3544 ์ฐธ์กฐ
@andreinitescu ํผ๋์
CollectionView์์ ์คํฌ๋กค ์ด๋ฒคํธ๋ฅผ ํ ์ ์์ต๋๊น? CollectionView๊ฐ ์ถ์๋ ๋๊น์ง ListView https://github.com/xamarin/Xamarin.Forms/issues/4323์ ๋ํ ์ ์์ด
๊ทธ๋ฆฌ๊ณ ์๋ฅผ ๋ค์ด PInterest์ ๊ฐ์ ๋ถ๊ท์นํ๊ณ ๋์ ์ธ ๋ ์ด์์์ ๋ง๋ค ์ ์์ต๋๊น?
๋ชจ๋ ์ด๋ฏธ์ง์๋ ๊ณ ์ ํ ๋์ด๊ฐ ์์ต๋๋ค :-)
์ด๋ฌํ ์ข ๋ฅ์ ๋ ์ด์์์ด ์ง์๋ ์ ์๋์ง ํ์ ์ด ์์ง ์์ต๋๊น?
์ ๋ฐ์ดํธ: ์ด๋ฆ ์ ์ ๋ชฉ๋ก์์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฒ์ "ItemsView"์ ๋๋ค. ์ด๋ ์ฌ๋๋ค์๊ฒ ์ด๊ฒ์ด iOS "UICollectionView"๋งํผ ์์ ํ๋ค๋ ์ธ์์ ์ฃผ๋ "CollectionView"๋ผ๋ ์ฉ์ด์ ์ฌ์ฉ์ ํผํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค.
์๋
ํ์ธ์, ์ ๋ ์ฌ์ ํ Xamarin์ ์ฒ์ ์ฌ์ฉํ์ง๋ง DataTemplateSelector๋ฅผ ์ฌ์ฉํ์ฌ ListView๋ก ์์
ํด ์์ต๋๋ค.
DataTemplateSelector์ ํจ๊ป CollectionView๋ฅผ ์ฌ์ฉํ์ฌ ํ
์คํธํ๋ ค๊ณ ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ฒ๋ฆฌ๋์ง ์์ ์์ธ:
System.InvalidOperationException: LoadTemplate์ด null์ด ์๋์ด์ผ ํฉ๋๋ค.
DataTemplateSelector์ ๊ด๋ จ๋ ์๋ ค์ง ๋ฒ๊ทธ๊ฐ ์์ต๋๊น?
๋๋ ๊ทธ๊ฒ์ ์๋ชป ๊ตฌํ ํ ์ ์์ต๋๋ค. CollectionView์ ํจ๊ป DataTemplateSelector๋ฅผ ์ฌ์ฉํ๋ ์๊ฐ ์์ต๋๊น?
@hartez @davidortinau KeepItemsInView
๊ฐ KeepLastItemInView
์ ์ ๋ ฌ๋๋๋ก KeepFirstItemInView
๋ก ๋ช
๋ช
๋์ง ์์ ์ด์ ๊ฐ ๋ฌด์์
๋๊น? ํ์ฌ ์ด๋ฆ์ ๋ณต์ํ(์ฆ, ์ฌ๋ฌ ํญ๋ชฉ์ ์ ์ํจ)์ธ ๋ฐ๋ฉด ์ค๋ช
์๋ ๋ทฐํฌํธ์์ ๋ณด์ด๋ ์ฒซ ๋ฒ์งธ ํญ๋ชฉ๋ง ์ ์งํ๋ค๊ณ ๋์ ์์ต๋๋ค.
๋ํ ํ์ฌ ๋ทฐํฌํธ์ ์๋ ๋ทฐ ๋ชฉ๋ก์ ๊ฐ์ ธ์ค๊ธฐ ์ํด API๋ฅผ ๋
ธ์ถํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? ๋ค๋ฅธ ๋ฐค์ ListView
์
์ ์ฝ์
ํ๊ณ ๋ทฐํฌํธ ๊ฐ์์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ์๋ ์ฌ์/์ผ์ ์ค์ง๋๋ ๋น๋์ค ๋ณด๊ธฐ๋ฅผ ๋ง๋๋ ์์
์ ํ๊ณ ์์์ง๋ง ํ์ฌ ItemAppearing
๋ฐ ItemDisappearing
์์๋ ๊ฑฐ์ ๋ถ๊ฐ๋ฅํ์ต๋๋ค CollectionView
๋ณด๋ค ์์ ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ์ด๋ฌํ ์ข
๋ฅ์ ๊ธฐ๋ฅ์ ์ง์.
๋ ๋ค๋ฅธ ์ข์ ์ ์ ์ฌ์ฉ์๊ฐ ํ์ฌ ํผ๋๋ฅผ ์คํฌ๋กคํ ์ ์๋ ๋์ ๋ถ๋ชจ๋ก๋ถํฐ ๋ถ๋ฆฌ๋๋ ์ต์ํ๋ ์ข
์ ๋ณด๊ธฐ๋ฅผ ๋ง๋๋ ๊ธฐ๋ฅ์
๋๋ค. YouTube์์ ํ์ฌ ๋์์์ ๊ณ์ ๋ณผ ์ ์๋ ๋์์ ํ์์ ๊ณ์ํ ์ ์๋ ๊ฒ์ ๋ณด์์ต๋๋ค. ์ด๊ฒ์ด CollectionView
๊ฐ btw๋ฅผ ์ง์ํ ์ ์๊ฑฐ๋ ์ง์ํด์ผ ํ๋์ง ํ์คํ์ง ์์ง๋ง ์๊ฐํด ๋ณผ ๋ฌธ์ ์
๋๋ค.
๊ทธ๋์ ๋๋ ํ์ฌ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋น๋์ ๋น๊ตํ์ฌ ์ผ๋ถ ํฌ๊ธฐ ์กฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ํ์ฌ ๋์ดํ๋ฆฌ ๋น๋ ๋นํธ(4.0.1.43780-nightly)๋ฅผ ๊ฐ์ง๊ณ ๋์์ต๋๋ค.
๋ด๊ฐ ์ ์ํ๋ ๊ฒ์ RowSpacing/ColumnSpacing ๋๋ GridSpacing๊ณผ ๊ฐ์ ๊ฒ์ ๊ทธ๋ฆฌ๋ ๋ ์ด์์์ ์ถ๊ฐํ๋ ๊ฒ์
๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ๋ณ ํญ๋ชฉ์ ์ฌ๋ฐฑ/ํจ๋ฉ์ ์ฌ์ฉํ์ง ์๊ณ ํญ๋ชฉ์ ๊ฐ๊ฒฉ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ง์ ํ๋ ๊ฒ์ด ํจ์ฌ ๋ ์ฌ์์ง๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ Padding ๋๋ EdgeOffset์ CollectionView ๋๋ ๋ ์ด์์์ ์ถ๊ฐํ์ฌ ์ฌ๊ธฐ์ ํ์๋ ํญ๋ชฉ๊ณผ ๊ฐ์ ํญ๋ชฉ์ ์๋ผ๋ด๋ Margin ์ฌ์ฉ์ ๋ฐฉ์งํ๋ ๊ฒ์
๋๋ค.
Margin์ ๋ํ ์ฌ๊ธฐ์์ ๋ณผ ์ ์๋ ๊ฒ์ฒ๋ผ Android์์ "๋๋๊ทธ" ์ ๋๋ฉ์ด์
์ ์๋ฆ
๋๋ค.
๋ด๊ฐ ์ ์ํ๋ ๊ฒ์ RowSpacing/ColumnSpacing ๋๋ GridSpacing๊ณผ ๊ฐ์ ๊ฒ์ ๊ทธ๋ฆฌ๋ ๋ ์ด์์์ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ๋ณ ํญ๋ชฉ์ ์ฌ๋ฐฑ/ํจ๋ฉ์ ์ฌ์ฉํ์ง ์๊ณ ํญ๋ชฉ์ ๊ฐ๊ฒฉ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ง์ ํ๋ ๊ฒ์ด ํจ์ฌ ๋ ์ฌ์์ง๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋์ํฉ๋๋ค. ์ฐ๋ฆฌ ๋ ์ด๋์ ์์ต๋๋ค. #4681 ์ฐธ์กฐ.
์ ๋ฐ์ดํธ: ์ด๋ฆ ์ ์ ๋ชฉ๋ก์์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฒ์ "ItemsView"์ ๋๋ค. ์ด๋ ์ฌ๋๋ค์๊ฒ ์ด๊ฒ์ด iOS "UICollectionView"๋งํผ ์์ ํ๋ค๋ ์ธ์์ ์ฃผ๋ "CollectionView"๋ผ๋ ์ฉ์ด์ ์ฌ์ฉ์ ํผํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค.
"FloatView"๋ ์ด๋ป์ต๋๊น?
์์์ ์ธ๊ธํ ItemAppearing/Disappearing ์ด๋ฒคํธ ์ธ์๋ ํญ๋ชฉ์ ๋ณผ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ณํ:
View GetView(object item)
ํญ๋ชฉ์ด ๊ตฌ์ฒดํ๋์ง ์์ผ๋ฉด null์ ๋ฐํํด์ผ ํฉ๋๋ค.
์์ง ๋ชฉ๋ก์ ์ฌ์ฉ ํ๊ณ ์๋๋ฐ iOS์ Android์์ ๋ ๋๋ง๋๋ ๋ฐฉ์์ ๋ถ์ผ์น๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
iOS์์ ๋ ์ด๋ธ์ ๋๋น์ 100%๋ฅผ ์ฐจ์งํฉ๋๋ค.
Android์์๋ ์ฝํ
์ธ ๋๋น๋ง ์ฐจ์งํฉ๋๋ค.
์ ์ ๋๋น ์ ์๋ฅผ ํตํด์๋ง ๋ ์ด์์์ ์ฌ๋ฐ๋ฅด๊ฒ ์ง์ ํ ์ ์์์ต๋๋ค.
Grid Width="Auto"
์์ฑ์ ์กด์คํ๋ Android ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
์์ง ๋ชฉ๋ก์ ์ฌ์ฉ ํ๊ณ ์๋๋ฐ iOS์ Android์์ ๋ ๋๋ง๋๋ ๋ฐฉ์์ ๋ถ์ผ์น๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
@shwanton ์ด ๋ฒ๊ทธ์ ๋ํ ๋ณ๋์ ์ด์๋ฅผ ์ด์ด ์ฃผ์๋ฉด ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
@shwanton ์ผ๊ฐ ํผ๋๋ก ์ ํํ์ ๋ ์์ ๋ ์ ์ฌํ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
@krdmllr ํ์ธํ ์ ์์ต๋๋ค. ์ต์ ๋น๋์์ ์์ ๋์์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
์๋ . ListView์ ItemTapped์ ์ ์ฌํ ItemTapped ์ด๋ฒคํธ๊ฐ CollectionView์ ์์ต๋๊น? ์คํ์๋ ์๋ณด์ด๋ค์. ๊ฐ์ฌํฉ๋๋ค.
@uvirra DataTemplateSelector
๋ฌธ์์ ๋ํ ๊ธฐ์กด ๋ฌธ์ ๊ฐ ์์ต๋๋ค. #4826์ ์ฐธ์กฐํ์ญ์์ค.
@hartez ListView
๋ํด ์กด์ฌํ๋ ์ธ ๊ฐ์ง์ ๊ฐ์ ํ๋ชฉ ์ฌํ์ฉ ์ ๋ต์ด ํ์ํ ๊น์? CollectionView
ํ์ฉํ๋ ๊ธฐ๋ณธ ๊ฐ์ํ์ ๋ํด ์ฌ๋ฌ ๋ฒ ์ธ๊ธํ์
จ์ต๋๋ค. ๋๋ ์ด๊ฒ์ ๋ํด ๋ ๋ช
ํํ๊ฒ ์๊ณ ์ถ์ต๋๋ค.
RefreshView
์ด iOS์์ ์ด๋ป๊ฒ ๋ณด์ผ์ง ์ ๋ ๊ถ๊ธํฉ๋๋ค. ListView
๋ํ ํ์ฌ ์๋ก ๊ณ ์นจ์ ์ฌ์ฉํ๋ ค๋ฉด UITableView
์ Bounces
์์ฑ์ด ์ผ์ ธ ์์ด์ผ ํ์ง๋ง Android์์๋ ์๋ก ๊ณ ์นจ ๋ณด๊ธฐ๊ฐ ๊ฐ์ฅ ๋ง์ด ๋ณด์ด๋ ํญ๋ชฉ(์ด๋ ๊ฐ์ธ์ ์ผ๋ก ์ ํธ).
@hartez
ListView
๋ํด ์กด์ฌํ๋ ์ธ ๊ฐ์ง์ ๊ฐ์ ํ๋ชฉ ์ฌํ์ฉ ์ ๋ต์ด ํ์ํ ๊น์?CollectionView
ํ์ฉํ๋ ๊ธฐ๋ณธ ๊ฐ์ํ์ ๋ํด ์ฌ๋ฌ ๋ฒ ์ธ๊ธํ์ จ์ต๋๋ค. ๋๋ ์ด๊ฒ์ ๋ํด ๋ ๋ช ํํ๊ฒ ์๊ณ ์ถ์ต๋๋ค.
ํ์ฌ ๋์์ธ์ ์ฌํ์ฉ ์ ๋ต๊ณผ ๊ฐ์ ๊ฒ์ ์๊ตฌํ์ง ์์ต๋๋ค. ํ์ฌ ์ฐ๋ฆฌ๋ ๊ธฐ๋ณธ ์ปจํธ๋กค์ด ์ ๊ณตํ๋ ๊ฐ์ํ๋ฅผ ํ์ฉํ๊ณ ์์ผ๋ฉฐ, ๊ธฐ๋ณธ ์ปจํธ๋กค์ ์ฆ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ์ํ ๋๊ฐ ์์ต๋๊น? ๋ด ํฌ๋ง์ "์๋์"์ด๋ฉฐ ๋ง์ ๋ณต์ก์ฑ์ ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์ (์ฌ์ฉ์์ ์ ์ง ๊ด๋ฆฌ ๋ชจ๋) ํผํ๊ธฐ ์ํด ์ต์ ์ ๋คํ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ฒฐ๊ตญ ๊ทธ๋ฐ ๊ฒ์ด ํ์ํ๋ค๋ ๊ฒฐ๋ก ์ ๋ด๋ฆฐ๋ค๋ฉด, ์ฐ๋ฆฌ๋ ๋์์ธ์ ๋งค์ฐ, ๋งค์ฐ ์กฐ์ฌ์ค๋ฝ๊ฒ ์ ๊ทผํ ๊ฒ์ ๋๋ค.
์คํฌ๋กค๋ ์ด๋ฒคํธ๋ ์ด๋ป์ต๋๊น? ์ต์ UI/UX์ ๋๋ถ๋ถ์ ์คํฌ๋กค ์ ์์ฐจ ํค๋, ํญ๋ชฉ ํ์/์จ๊ธฐ๊ธฐ(๋ฒํผ, ํค๋, ํํฐ, ๊ธฐํ ๋ฑ๋ฑ)๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ด์ ๊ฐ์ ์๋กญ๊ณ ๋๋ผ์ด ์ปจํธ๋กค์ ์ต์ ์๋๋ฆฌ์ค๋ฅผ ์ง์ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฌธ์ ๊ฐ ๋์ง ์์์ผ ํฉ๋๋ค. recyclerview์ UICollectionview๋ ๋ชจ๋ ์คํฌ๋กค๋ ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํฉ๋๋ค.
Carouselview(collectionview ๊ธฐ๋ฐ)๋ ๋ฐฉํฅ, ์คํฌ๋กค ๊ฐ ๋ฐ ๋ธํ๊ฐ ์๋ ์คํฌ๋กค ์ด๋ฒคํธ๋ฅผ ์ง์ํฉ๋๋ค. https://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์ ๊ฐ์ Scrolled ์ด๋ฒคํธ๊ฐ ํ์ํฉ๋๋ค.
๋ฌธ์ ์ธ์ฌ,
4323
ScrollView์ ๊ฐ์ Scrolled ์ด๋ฒคํธ๊ฐ ํ์ํฉ๋๋ค.
๋ฌธ์ ์ธ์ฌ,
๋๋ ์ด๊ฒ์ ์ง์งํ๋ค.
๋ํ ์คํฌ๋กค์ด ์ค์ง/์๋ฃ๋๋ฉด ์ด๋ฒคํธ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ด๋ฒคํธ๋ฅผ ์ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ป์ ์ ์๋๋ก IOS์์ UICollectionview์ด์๋ UIScrollView์ ํ์ ํด๋์ค scrollViewDidEndDecelerating
๋ก๋ถํฐ UIScrollViewDelegate
Android์์๋ RecyclerView.OnScrollListener
ํ์ฅํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์ฌ์ฉ์ ์ง์ ์๋ก ๊ณ ์นจ, ์์ฐจ, ๋๊ธฐํ๋ ์คํฌ๋กค ์์, ๊ธฐํ ๋ฑ๋ฑ์ ๋ํ ๋ณด๋ค ๊ณ ๊ธ์ค๋ฝ๊ณ ์ธ๋ จ๋ ์๋๋ฆฌ์ค๊ฐ ์ด๋ฆฝ๋๋ค.
Recycler View์ ๊ฐ์ Android์ฉ ๊ธฐ๋ณธ ์ ๋๋ฉ์ด์ ์ด ์์ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๊น?
Recycler View์ ๊ฐ์ Android์ฉ ๊ธฐ๋ณธ ์ ๋๋ฉ์ด์ ์ด ์์ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๊น?
์ด๋ค ์ ๋๋ฉ์ด์ ์ ๋ง์ํ์๋ ๊ฑด๊ฐ์? ์ด๋ฅผ ์ํ Android ๋ ๋๋ฌ๋ RecyclerView์ ๊ตฌ์ถ๋์ด ์์ผ๋ฏ๋ก ํญ๋ชฉ ์ถ๊ฐ/์ ๊ฑฐ์ ๊ฐ์ ์์ ์ ์ด๋ฏธ ๊ธฐ๋ณธ ์ ๋๋ฉ์ด์ ์ ์ฌ์ฉํฉ๋๋ค.
์๋ ,
4.0.0.304370-pre8์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
(์๋ ๋งํฌ)์ ์์ ๋ CarouselView๋ฅผ ์ฌ์ฉํ ๋ UWP์ ์๋ฌด ๊ฒ๋ ํ์ํ์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ CollectionView๋ ๋ชฉ๋ก์ ํ์ํฉ๋๋ค. UWP์ฉ CarouselView๋ฅผ ํ์ฑํํ๋ ๋ฐ ํ์ํ ํน์ ๊ตฌ์ฑ์ด ์์ต๋๊น?
๊ฐ์ฌ ํด์.
์๋ ํ์ธ์ @noypi ์ ๋๋ค .
CollectionView๋ ๊ธฐ์ ์ ์ผ๋ก UWP์์ ๋ค์ "์๋"ํ ์ ์์ง๋ง CollectionView ๋ฐ CarouselView์ ์ ์ฒด ๊ตฌํ์ ์ฒ์๋ถํฐ Android ๋ฐ iOS์์ ์๊ฒฉํ๊ฒ ์ํ๋๊ณ ์์ต๋๋ค. ํ์ฌ UWP์ ๋ํ ๊ณต์ ์์ ์ ์์ ๋์ด ์์ง ์์ง๋ง ์ง์์ ์ผ๋ก ํผ๋๋ฐฑ์ ์์งํ๊ณ ์์ต๋๋ค. ํนํ UWP์์ ์ด๋ค ์ข ๋ฅ์ ์์ ์ ํ๊ณ ์๋์ง ๋ ผ์ํ๊ณ ์ถ๋ค๋ฉด paul๋ก ์ด๋ฉ์ผ์ ๋ณด๋ด์ฃผ์ธ์. [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 ๋ฌธ์ ๋ฅผ ์ด๊ธฐ ์ ์ Nuget์ ์ต์ ์ํํ(๋๋ ์ผ๊ฐ)์ผ๋ก ์
๋ฐ์ดํธํ๊ณ ์ ํ๊ธฐ๋ฅผ ๋ค์ ํ
์คํธํด ์ฃผ์๊ฒ ์ต๋๊น? ๋ณด๊ณ ์๋ ๋ฌธ์ ๋ DataTemplateSelector
๋ํ ์ง์์ด ์์ ๋ ๋ฐ์ํ ๊ฒ์
๋๋ค.
@hartez ํ์ฌ ๋จธ๋ฆฌ๊ธ&๋ฐ๋ฅ๊ธ๊ณผ ์๋ก๊ณ ์นจ ๋ณด๊ธฐ์ ๋ํ ์์ ์ด ์งํ ์ค์ธ๊ฐ์? ์๊ฐ ์ฌ์ ๊ฐ ์๋ค๋ฉด ๋ ์ค ํ๋๋ฅผ ์ดํด๋ณด๊ณ ์ถ์ง๋ง ๋น์ ์ ๋ฐ์ ๋ฐ๊ณ ์์ง๋ ์์์ง ํ์ธํ๊ณ ์ถ์ต๋๋ค.
@adrianknight89 4.0์์ ์๋ํฉ๋๋ค! ์์ฒญ๋
@hartez ํ์ฌ ๋จธ๋ฆฌ๊ธ&๋ฐ๋ฅ๊ธ๊ณผ ์๋ก๊ณ ์นจ ๋ณด๊ธฐ์ ๋ํ ์์ ์ด ์งํ ์ค์ธ๊ฐ์? ์๊ฐ ์ฌ์ ๊ฐ ์๋ค๋ฉด ๋ ์ค ํ๋๋ฅผ ์ดํด๋ณด๊ณ ์ถ์ง๋ง ๋น์ ์ ๋ฐ์ ๋ฐ๊ณ ์์ง๋ ์์์ง ํ์ธํ๊ณ ์ถ์ต๋๋ค.
ํ์ฌ ์งํ ์ค์ธ ์์
์ ์์ต๋๋ค. ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ถ๋ค๋ฉด ์ข์ ๊ฒ์
๋๋ค.
์ฐธ๊ณ ๋ก, ์ค๋ ํ ๋ก ํ ๋จธ๋ฆฌ๊ธ ๋ฐ ๋ฐ๋ฅ๊ธ๊ณผ ๊ด๋ จ๋ ๋ ๊ฐ์ ์๋ก์ด ์์ฑ์ธ IsHeaderSticky
๋ฐ IsFooterSticky
๋ฅผ ์ถ๊ฐํ์ฌ ํญ๋ชฉ๊ณผ ํจ๊ป ์คํฌ๋กคํ ์ง ์๋๋ฉด ์ ์๋ฆฌ์ ์ ์งํ ์ง๋ฅผ ์ง์ ํฉ๋๋ค. ๋จธ๋ฆฌ๊ธ/๋ฐ๋ฅ๊ธ๊ณผ ํจ๊ป ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ถ๋ค๋ฉด ํ๋ฅญํ ๊ฒ์
๋๋ค. ํ์ง๋ง ์ด๋ค ์์ผ๋ก๋ ์๋ํ๊ฒ ํ๊ณ ๋์ค์ ํด๋น ์์ฑ์ ๊ตฌํํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์
๋๋ค.
UWP์์ ์ปฌ๋ ์ ๋ณด๊ธฐ๋ฅผ ์ง์ํ ๊ณํ์ด ์๋์?
์. ๊ตฌํ์ ํ์ฌ ๋ค๋ฅธ ํ๋ซํผ์ ์ฝ๊ฐ ๋ค์ฒ์ ธ ์์ง๋ง ์์ ํ ์ง์ํ ๊ณํ์ ๋๋ค. https://gist.github.com/hartez/7d0edd4182dbc7de65cebc6c67f72e14 ์์ ๊ธฐ๋ฅ ์งํ ์ํฉ์
RefreshView์ ๋ํ ์ ๋ณด๊ฐ ์์ต๋๊น?
์ต์ Xamarin 4 ๋ฒ ํ ๋ฒ์ ์ด ์๊ณ RefreshView ์ ํ์ ์ฐพ์ ์ ์์ต๋๋ค.
RefreshView์ ๋ํ ์ ๋ณด๊ฐ ์์ต๋๊น?
์ต์ Xamarin 4 ๋ฒ ํ ๋ฒ์ ์ด ์๊ณ RefreshView ์ ํ์ ์ฐพ์ ์ ์์ต๋๋ค.
RefreshView๋ ์์ง ๊ตฌํ๋์ง ์์์ต๋๋ค. ์ฌ๊ธฐ ์์ ๊ธฐ๋ฅ ์งํ ์ํฉ์ ์ถ์ ํ ์ ์์ต๋๋ค.
GroupItemsBinding์ ์ถ๊ฐํ์๊ฒ ์ต๋๊น?
GroupItemsBinding ์์ฑ์ ์ถ๊ฐํ์ฌ ๊ทธ๋ฃน์ ์์ ํญ๋ชฉ์ด ํฌํจ๋ ์์ฑ์ ์ง์ ํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น? ๊ทธ๋ฌ๋ฉด ๊ทธ๋ฃน์ด ์ปฌ๋ ์ ์์ ์์ ํ๋๋ก ๊ฐ์ ํ๋ ๋์ ์์ ์ปฌ๋ ์ ์์ฑ์ ํฌํจ ํ ์
์ฅ์ :
ViewModelBase
)์๋ฅผ ๋ค์ด docs.microsoft.com์์ ์ด
```C#
๊ณต๊ฐ ํด๋์ค PageTypeGroup : ๋ชฉ๋ก
{
๊ณต๊ฐ ๋ฌธ์์ด ์ ๋ชฉ { 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 .}"
ํด๋นํ๋ ๊ธฐ์กด ๊ตฌํ๊ณผ ํธํ๋ฉ๋๋ค.
์ถ์ : ์ ๋ ์ด ์ ์์ 2018๋ 7์์ ๋ ์ผ์ฐ ์ ์ถํ์ต๋๋ค.
2019๋ 8์ 23์ผ ์ ๋ฐ์ดํธ: ๊ทธ๋ฃนํ๊ฐ ๊ตฌํ๋์์ง๋ง ์ด ์์ ์ฌํญ์ด ์์ต๋๋ค. ๊ทธ๋ฃน ๋ฐ์ดํฐ ์ฐธ์กฐ
์ด๊ฒ์ ์ถ๊ฐํ๋ ๊ฒ์ด ๋๋ฌด ๋ฆ์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ฌ๋ฌ ๊ทธ๋ฃนํ ์์ค์ ์ง์ํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
๋๋ฌด ๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
์: Flutter์๋ ExpansionTile์ด ์์ต๋๋ค ( ์์ )
CollectionView์ ๊ด๋ จํ์ฌ ์ถ๊ฐํด์ผ ํ ํ๋ฅญํ ๊ธฐ๋ฅ์ด๋ผ๊ณ ์๊ฐ๋๋ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค.
์ํ ๋ชฉ๋ก์์ ์คํฌ๋กค์ ์ฌ์ฉํ์ฌ ์ผ๋ฐ์ ์ผ๋ก ๋์์ด๋๋ ํ๋ฉด์ ์์ ํ ํ์๋์ง ์๋ ์์์ "๊ทธ๋ฆผ์" ํจ๊ณผ๋ฅผ ์ถ๊ฐํฉ๋๋ค. ํ์ฌ(๋ด๊ฐ ์๋ ํ) Xamarin.Forms์์ ์ด ์์ ์ ์ํํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ด๋ฐ ๊ธฐ๋ฅ์ด ์์ผ๋ฉด ์กฐ์นด๊ฐ ๋ ๊ฒ ๊ฐ์ง ์๋์? ์๋ฅผ ๋ค์ด X ๋ฐฑ๋ถ์จ๋ก๋ง ํ์๋๋ ์์์ "๊ทธ๋ฆผ์"๋ฅผ ์ ์ฉํ๋ ๋ถ์ธ๋งํผ ๊ฐ๋จํ ์ ์์ต๋๋ค.
Position ์์ฑ์ ์ ์ํฉ๋๋ค. ์ด ์์ฑ์ ํ์ฌ ํญ๋ชฉ์ ์ธ๋ฑ์ค๋ฅผ ๋ณด์ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ViewPagerIndicator ๋ฐ ์ ์ฌํ ํ์๊ธฐ๋ฅผ ์ฝ๊ฒ ํตํฉํ ์ ์์ต๋๋ค.
"ํ์ฌ ํญ๋ชฉ"์ ๊ฒฐ์ ํ๋ ๊ฒ์ด ๊น๋ค๋ก์ธ ์ ์์์ ์ดํดํฉ๋๋ค. ์ค๋ ์ด ์ผ์ ธ ์์ผ๋ฉด ๋ทฐ๊ฐ ์ค๋ ๋ ํญ๋ชฉ์ ๊ฒฐ์ ํ๊ธฐ๊ฐ ๋งค์ฐ ์ฌ์์ผ ํฉ๋๋ค. ์ค๋ ์์ด ์ฌ๋ฐ๋ฅธ ์ ํ์ ์ฌ์ฉ ์ฌ๋ก์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ์๋ง๋ ๋ณด๊ธฐ์ ์์ ๋๋ ์ค๊ฐ์ ์ ์ฐจ์งํ๋ ํญ๋ชฉ์ผ ๊ฒ์ ๋๋ค.
์ด ์์ฑ์ ๋ํ ScrollTo()์ ๋์์ผ๋ก ์ฌ์ด ์๋ฐฉํฅ ์ก์ธ์ค๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
@hartez ์ฐ๋ฆฌ๋ ์ด๊ฒ์ด 4.0 ๋ฆด๋ฆฌ์ค๋ฅผ ์ํด ์ค๋น๋ ๊ฒ์ด๋ผ๊ณ ์์ํ์ง๋ง ์์ง ์๋ฃ๋์ง ์์ ๊ฒ์ ๋ณด๊ณ ๋๋์ต๋๋ค. ์คํฌ๋กค ๋ฐ ์๋ก ๊ณ ์นจ ๊ธฐ๋ฅ ์์ด๋ CollectionView๋ฅผ ํ ์คํธํ ์ ์์ต๋๋ค. ์ผ๋ง๋ ๋ง์ ์คํ๋ฆฐํธ๊ฐ ์ถ์๋๊ธฐ ์ ์ ๊ธฐ๋ค๋ ค์ผ ํ๋์ง ์๋ ค์ฃผ์ค ์ ์๋์? ์์ผ๋ก ListView์ ํจ๊ป ์๋ฌด๊ฒ๋ ์ ๊ณตํ์ง ์๊ธฐ๋ก ๊ฒฐ์ ํ์ผ๋ฉฐ ์ด ์ปจํธ๋กค์ ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ ์ฌ์ฉํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@hartez ๋ชฉ๋ก ๋ ์ด์์์ด ์๋ CollectionView๊ฐ ํญ๋ชฉ ๋ด์ฉ์ ๋ง๊ฒ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ด ์์์ ๋ฒํผ์ ์ปฌ๋ ์
๋ณด๊ธฐ ๋ฐ๋ก ์๋์ ์์ด์ผ ํฉ๋๋ค. VerticalOptions๊ฐ ์์์ผ ๋ ์ด๋ฐ ์์ผ๋ก ์๋ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์์ฌ ํญ๋ชฉ ์๊ณ ๊ฐ์ด ์์ฑ ํ ์คํธ์ ๋๋ฌํ์ ๋
๊ฐ๋ณ ํญ๋ชฉ ๋์์ CollectionView ํ๋ฆ์ด ํ๋ฉด ํฌ๊ธฐ ๋ณ๊ฒฝ๊ณผ ๊ด๋ จํ์ฌ iOS ๊ธฐ๋ณธ ๋์์ ๋ชจ๋ฐฉํ๋์ง์ ๋ํ ์ง๋ฌธ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋๋ฆฌ๊ฒ ์ต๋๋ค.
iOS์ ์ด๋ฏธ์ง ๊ฐค๋ฌ๋ฆฌ ์ ์ CollectionView๋ก ์์ฑ๋๋ฉฐ ๊ฐ๋ณ ์ ์ ์ ์ํฉ๋๋ค. ๊ธฐ๋ณธ ๋์์ ๋จ์ผ ํ์ ๊ทธ๋ฆฌ๋ ์ ์ ์๊ฐ ํ๋ฉด ํฌ๊ธฐ์ ๋ฐ๋ผ ๋์ ์ผ๋ก ๊ฒฐ์ ๋๋ค๋ ๊ฒ์ ๋๋ค. ํด๋ํฐ์์๋ 4๊ฐ ํญ๋ชฉ์ ๋ฃ์ ์ ์์ง๋ง ํ๋ธ๋ฆฟ์์๋ 8๊ฐ ๋๋ 9๊ฐ ํญ๋ชฉ์ ๋ฃ์ ์ ์์ต๋๋ค.
Forms ๋ฒ์ ๋ ์ด๊ฒ์ ์ ๊ณตํฉ๋๊น? ์ง๊ธ๊น์ง ์ฝ์ ์์ ์์๋ GridItemsLayout Span ์์ฑ์ ์ค์ ํ ์์น๋ง ๋ณด์์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ผ๋ง๋ ๋ง์ ํญ๋ชฉ์ ๊ทธ๋ฆด ์ ์๋์ง์ ๋ํ ํ๋ ์ฝ๋ฉ๋ ๊ฐ์ด ์์ฑ๋๋ฉฐ ์ค์ ๋ก ๋ค์ํ ํ๋ฉด ํฌ๊ธฐ์ ์ธ๊ณ์์ ํ๋ ์ฝ๋ฉ์ 2014๋ ์ฒ๋ผ ๋ณด์ ๋๋ค. :-P
UWP์๋ 4๊ฐ์ง ์ ํ ๋ชจ๋ ์ํ๊ฐ ์์ต๋๋ค.
{
์์,
ํ๋์
๋ค์์,
์ฐ์ฅํ๋ค,
}
Android ๋ฐ IOS์ Four state๋ ์ ์ฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํ์ผ ํ์๊ธฐ๋ฅผ ์ดํด๋ณด์ญ์์ค.
๊ฐ๋จํ ํจ๋ฉ ์์ฑ์ ๋ํ ๊ณํ์ด ์์ต๋๊น? ๋ด ํน์ ์ฌ์ฉ ์ฌ๋ก์ ๊ฒฝ์ฐ ์ ์ ํ ํฌ๊ธฐ์ ๋น ๋จธ๋ฆฌ๊ธ๊ณผ ๋ฐ๋ฅ๊ธ์ ์ฌ์ฉํ ์ ์์ง๋ง(์ผ๋จ ํด๋น ๊ธฐ๋ฅ์ด ๊ฐ๋ฐ๋๋ฉด) ์ฝ๊ฐ์ ํดํน์ด ๋ ์ ์์ผ๋ฉฐ 4๋ฉด ๋ชจ๋์ ํจ๋ฉ์ด ์์ ์ ์๋ ๊ทธ๋ฆฌ๋ ๋ ์ด์์์๋ ์ ํฉํ์ง ์์ต๋๋ค. ์๊ตฌ๋๋.
์ปฌ๋ ์ ๋ณด๊ธฐ์์ ๋ชฉ๋ก ํญ๋ชฉ์ ์ฌ์ ๋ ฌํ ๊ณํ์ ๋๋ค.
์ฌ์์ CollectionView์ ํน์ ํญ๋ชฉ์ ๋ํ ์ ํ์ ๋นํ์ฑํํ๋ ๋ฐฉ๋ฒ์ด ํฌํจ๋์ด ์์ต๋๊น?
// Any possible API could be helpful
private void OnSelectionChanging(object sender, SelectionChangingEventArgs e)
{
if (...)
e.Cancel = true;
}
ํ์ฌ ๋๋ ๊ทธ๊ฒ์ ํด๊ฒฐํ์ง๋ง ์ด๊ฒ์ด Selected VisualState๊ฐ ์ ์ฉ๋๋ ๊ฒ์ ๋ง์ง๋ ์์ต๋๋ค.
void OnCollectionViewSelectionChanged(object sender, SelectionChangedEventArgs e)
{
// Deselect the item.
if (sender is CollectionView cv && e.CurrentSelection...)
{
cv.SelectedItem = null;
}
}
์์ง ์คํฌ๋กค ๋ง๋ ์์ ๋ฐ ์ํ ์คํฌ๋กค ๋ง๋ ์์์ด ์ข์ ๊ฒ์ ๋๋ค!
์คํฌ๋กค ๋ฐฉํฅ์ ์ด๋ป์ต๋๊น? ๋ด์ฉ ์์ฒด๊ฐ ์๋๋ผ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ์คํฌ๋กค์ ์์ํ๋ค๋ ๋ป์ ๋๋ค.
๋ถ๋ฆฌ์๊ฑฐํ๊ณ ์ถ๋ค...
"๋ฉ๋ชจ๋ฆฌํ"ํ๊ณ ์คํฌ๋กค ์์น๋ฅผ ์ ์ฉํ ์ ์๋ ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
๋งค์ฐ ๋๋ผ์ด ๊ฒ์ ๋งค์ด ๋๋ X๊ฐ ํญ๋ชฉ์ ๋ํด ๋ค๋ฅธ ํญ๋ชฉ ํ ํ๋ฆฟ์ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ ๋ฒ์งธ ํญ๋ชฉ๋ง๋ค ํ์ ๋ฐฐ๊ฒฝ์ ๋ง๋ค ์ ์๊ณ ๋ค๋ฅธ ๋ง์ ์คํ์ผ์ ์ง์ ํ ์ ์์ต๋๋ค.
ํ
ํ๋ฆฟ ์ ํ๊ธฐ๋ก ์ด๋ฏธ ๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๊น? ์์น ์ฌ์ฉ
๋ชจ๋๋ก ์ฐ์ฐ์?
2019๋ 8์ 13์ผ ํ์์ผ 16:53 Legacyorder [email protected]์์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ์ต๋๋ค.
์ ๋ง ๋๋ผ์ด ๊ฒ์ ๋ค๋ฅธ ์์ดํ ์ ์ฌ์ฉํ ๊ฐ๋ฅ์ฑ์ด ์๋ค๋ ๊ฒ์ ๋๋ค.
๋ชจ๋ ์ด ๋๋ X ํญ๋ชฉ์ ๋ํ ํ ํ๋ฆฟ. ์ด๋ ๊ฒ ํ๋ฉด ์์ฑํ ์ ์์ต๋๋ค.
๋ชจ๋ ๋ ๋ฒ์งธ ํญ๋ชฉ ๋ฐ ๊ธฐํ ๋ง์ ์คํ์ผ์ ๋ํ ํ์ ๋ฐฐ๊ฒฝ
๊ฐ๋ฅ์ฑ.โ
์ด ์ค๋ ๋์ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฉ์์ง๋ฅผ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/xamarin/Xamarin.Forms/issues/3172?email_source=notifications&email_token=AC4YCKDFCH3WFENRCLPWEC3QELDE3A5CNFSM4FHJRXPKY5DAPWSM4FHJRXPKYY3PNVWWK3TUL52HS4DFVEXG43VMVBW63
๋๋ ์ค๋ ๋ ์์๊ฑฐ
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์์ ์๋ฆผ @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=ACDWB3GSYAQSADERHWVTJX3QIANMNA5CNFSM4FHJRXPKYY5DLOWSM4FHJRXPKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ACDWB3HMFCHBRZWD5AJMXH3QIANMNANCNFSM4FHJRXPA
.
์๋ฃ๋์ง ์์: ๊ฐ๋ก ๋ ์ด์์์ ์คํฌ๋กค ๋ฐฉํฅ์ ๋๋ค.
์ํ์ผ๋ก ์คํฌ๋กค๋๋ CollectionView์์ FlowDirection = RightToLeft๋ฅผ ์ค์ ํ๋ฉด ํ์ฌ iOS ๋ฐ UWP์์ ์คํฌ๋กค ๋ฐฉํฅ์ด ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ด ์๋๋๋ค(Android์์ _does_ ์๋ํ๋ค๊ณ ์๊ฐํฉ๋๋ค).
LoadingDataTemplate์ ์ด๋ป์ต๋๊น?
๋ฐ์ดํฐ๋ฅผ ListView/CollectionView์ ๋น๋๊ธฐ์์ผ๋ก ๋ก๋ํ๋ ๋ด ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด listview/collectionview๊ฐ ์ฑ์์ง ๋๊น์ง ๋๋๋ก ๋น ๊ณต๊ฐ์ด ์์ ์ ์์ต๋๋ค.
LoadingDataTemplate์ ์ถ๊ฐํ๋ฉด ๋์ฉ๋ ๋ฐ์ดํฐ๊ฐ ์ฑ์์ง๊ณ ํ์ด์ง๊ฐ ์ด๋ฏธ ํ์๋ ๊ฒฝ์ฐ ์ถ๊ฐ ์๋ต์ฑ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
๋ก๋ฉ ์ธ๋์ผ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ๋๋ CollectionView
๊ฐ ์ฒ์ ํ์๋ ๋์
๋๋ค. ๋ฐ์ดํฐ๊ฐ ItemsSource
์ปฌ๋ ์
์ ์ถ๊ฐ๋ ๋๊น์ง ์ฌ๋ฌ ์๋ฆฌ ํ์์ ์
์ด ํ์๋ฉ๋๋ค. ๋ ๋ฒ์งธ๋ ๋ชฉ๋ก ๋งจ ์๋์ ๋ ๋ง์ ๋ฐ์ดํฐ๊ฐ ์ถ๊ฐ๋๋ ๊ฒฝ์ฐ์
๋๋ค. ๋ ๋ฒ์งธ ๊ฒฝ์ฐ ๋ฐ๋ฅ๊ธ์ ํ์ฉํ ์ ์์ต๋๊น?
์ฒซ ๋ฒ์งธ ๊ฒ์ ๋ ๋ง์ ์์
์ด ํ์ํฉ๋๋ค(์: ์ฒ์์๋ ๋์ผํ ์๋ฆฌ ํ์์ ๋ฐ์ดํฐ ํ
ํ๋ฆฟ์ด ์๋ 3-5๊ฐ์ ํญ๋ชฉ์ผ๋ก ์์ค๋ฅผ ๋ก๋ํ ๋ค์ ํด๋น ํญ๋ชฉ์ ์ ๊ฑฐํ๊ณ ๊ฐ์ ธ์ฌ ๋ ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํฉ๋๋ค). ๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ CollectionView
์์ ์ค์ผ๋ ํค ๋ทฐ๋ฅผ ๋ฐฐ์นํ๊ณ ๋ฐ์ดํฐ๊ฐ ์ค๋น๋๋ฉด ์จ๊ธฐ๋ ๊ฒ์
๋๋ค. ๋๋ ํ์ฌ ListView
์ด ์ ๊ทผ ๋ฐฉ์์ ๋ฐ๋ฆ
๋๋ค.
๋๋ ์ด๊ฒ์ ์๋ํ์ง ์์์ง๋ง ๋จผ์ ๋ก๋ ๋ณด๊ธฐ์ EmptyView
๋ฅผ ์ค์ ํ ์ ์์ผ๋ฉฐ ๊ฒฐ๊ณผ๊ฐ ์์ผ๋ฉด EmptyView
์ ๋ํ ํ
ํ๋ฆฟ์ ๋ณ๊ฒฝํ์ฌ "nothing found" ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค.
@adrianknight89
๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์
CollectionView
์์ ์ค์ผ๋ ํค ๋ทฐ๋ฅผ ๋ฐฐ์นํ๊ณ ๋ฐ์ดํฐ๊ฐ ์ค๋น๋๋ฉด ์จ๊ธฐ๋ ๊ฒ์ ๋๋ค. ๋๋ ํ์ฌListView
์ด ์ ๊ทผ ๋ฐฉ์์ ๋ฐ๋ฆ ๋๋ค.
์ด๊ฒ์ ๋ด๊ฐ ๋ฐ๋ฅด๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ์ฆ, ์์ ํ๋ ํ์๊ธฐ๋ฅผ ๋์ญ์์ค. ListView๋ฅผ IsVisible = false ๋ฐ ActivityIndicator IsVisible = true๋ก ์ค์ ํ ๋ค์ listview๊ฐ ์ฑ์์ง ํ ๋ ๊ฐ์ ๋ชจ๋ ๋ฐ์ ํฉ๋๋ค.
@adrianknight89
๋๋ ์ด๊ฒ์ ์๋ํ์ง ์์์ง๋ง ์ฐ๋ฆฌ๋ ๋จผ์ EmptyView๋ฅผ ๋ก๋ฉ ๋ณด๊ธฐ๋ก ์ค์ ํ ์ ์์๊ณ ๊ฒฐ๊ณผ๊ฐ ์์ผ๋ฉด "nothing found" ๋ฉ์์ง๋ฅผ ํ์ํ๋๋ก EmptyView์ ๋ํ ํ ํ๋ฆฟ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
์์ด๋์ด๊ฐ ์์ต๋๋ค! ๊ทธ๊ฒ์ด ์๋ํ ์๋ ์์ง๋ง LoadingDataTemplate ๋ฐ EmptyView์ ๊ด๋ จํ์ฌ CollectionView์ ๋ณ๋์ ํ ํ๋ฆฟ ์์ฑ์ ๊ฐ๋ ๊ฒ์ด ๋ ๋จ์ํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ ๊ฐ์ง ๋ค๋ฅธ ์์ฑ์ ๊ฐ๋ ๊ฒ์ด ๋ ๋ซ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ๋จ์์ฑ ์ธก๋ฉด ์ธ์ ๋ ๊ฐ์ง ๋ค๋ฅธ ๋ชฉ์ ์ ์ํด ๋จ์ผ ์์ฑ์ ์ฌ์ฉํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์๋ง๋ (ํธ์ง: A EmptyView
๋ BackgroundView
๋ก ์ด๋ฆ์ด ์ง์ ๋์ด์ผ ํ๋ฏ๋ก ์ด๋ค ์ฉ๋๋ก๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.BackgroundView
๋ ์์ ํ ๋ค๋ฅธ ๊ฒ์
๋๋ค.)
@LeoJHarris BackgroundView
์ง์์ ์ํด #7447์ ์ถ๊ฐํ์ต๋๋ค. ์์ ๋ ์๋๋ฆฌ์ค๋ฅผ ์ง์ํ๊ธฐ ์ํด EmptyView
๋ฐ BackgroundView
๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง ์ด๊ฒ์ด ์ฌ์ ํ 100% ์ํ๋ ๊ฒ์ ์๋์ง๋ง ๋ ๊ฐ์ง๋ฅผ ๋ชจ๋ ์ง์ํ๊ธฐ ์ํด EmptyView
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ซ์ต๋๋ค. ์๋๋ฆฌ์ค. BackgroundView
๋ฅผ ๋ก๋ฉ ํ๋ฉด์ผ๋ก ์ฌ์ฉํ๊ณ ๋ฐ์ดํฐ๊ฐ ์ค๋น๋๋ฉด null๋ก ์ค์ ํ ์ ์์ต๋๋ค.
@adrianknight89 ๋ฐ์ดํฐ๊ฐ ์ค๋น๋๋ฉด CollectionView๊ฐ ์ด๋ฅผ ์๋์ผ๋ก ์ ์ดํ๋ โโ๋์ 'null out' ์ฒ๋ฆฌํ๋ฉด
CollectionView์ RemainingItemsThreshold๋ฅผ ํ์ฉํ๋ ํ์ด์ง๋ฅผ ๋น ๋ฅด๊ฒ ์คํฌ๋กคํ ๋ ๋ ๊ฐ์ง ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด ๋ฌธ์ ๊ฐ ์๋ ๋ค๋ฅธ ์ฌ๋์ ์ฐพ์ ์ ์์ต๋๋ค. ๋ณด๊ณ ๋ ๊ฒ์ ๋ณด์์ต๋๊น?
@Bronson15 RemainingItemsThresholdReached
์ด๋ฒคํธ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๊ณ ๊ณ์ ๊ฐ์? ๋น ๋ฅธ ์คํฌ๋กค์ ์ฌ๋ฌ ๋ฒ ํธ๋ฆฌ๊ฑฐํ๋ฏ๋ก ๋ฐ์ดํฐ ์์ค ์
๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ์ด๋ฒคํธ ํธ์ถ์ ๋ฌด์ํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋์ ๋ฉ๋๋ค. ๋ํ ๋ฉ์ธ ์ค๋ ๋์์ UI๋ฅผ ์
๋ฐ์ดํธํด ๋ณด์ธ์.
์ฌ์ ํ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ ์กฐ์ฌ๋ฅผ ์ํด ์ฌํ์ผ๋ก ์ ๋ฌธ์ ๋ฅผ ์ด โโ์ ์์ต๋๋ค.
@ Bronson15 ๋ ๊ฐ์ง ๋ฌธ์ ์
๋๋ค.
ObservableRangeCollection์ผ๋ก ์๋ํ๊ณ #2๋ฅผ ์์ ํ์ต๋๋ค.
์ฌ์ ํ ์ ์ง/๋น ๋ชฉ๋ก์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์๋ฎฌ๋ ์ดํฐ์์ ์คํํ ๋ CPU ์คํ์ดํฌ๊ฐ ํ์๋๊ณ ๋ฌดํ ๋ฃจํ๊ฐ ๋ณด์
๋๋ค.
ํธ์ง: iOS์์๋ง ์ค๋จ๋๊ณ Android์์๋ ์ ๋๋ก ์๋ํฉ๋๋ค.
์๋
ํ์ธ์ ํ,
RemainingItemsThreshold์ RemainingItemsThresholdReachedCommand๋ฅผ ์ฌ์ฉํด๋ RemainingItemsThresholdReachedCommand์ ํ ๋น๋ ํจ์๊ฐ ๋น ๋ฅด๊ฒ ์คํฌ๋กคํ์ง ์์๋ ์์ฐจ์ ์ผ๋ก ์ฌ๋ฌ ๋ฒ(์ฒ์์๋ ๋ ๋ฒ, ๋ค์์๋ 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
์ด ์ฒ๋ฆฌ๋๋ ๋์ UI๋ฅผ ์ฐจ๋จํ์ง ์๊ธฐ ๋๋ฌธ์ ์คํฌ๋กค ํจํด์ผ๋ก ์ธํด ๋ช
๋ น์ ์ฌ๋ฌ ๋ฒ ๊ณ์ ๋๋ฅด๋ ๊ฒ์ด ์ ์์
๋๋ค. ์ ๊ธ ๋ฉ์ปค๋์ฆ์ผ๋ก ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ฐธ์กฐํ์ญ์์ค. https://github.com/xamarin/Xamarin.Forms/pull/7516/files#diff -2be3eff4d53f761cd581cca1d2ec3bc0R48
์ด๋ฅผ ์ํํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์๊ฒฉ ๊ฐ์ ธ์ค๊ธฐ๊ฐ ์งํ๋๋ ๋์ ๋ช ๋ น์ ํ์ฑํ/๋นํ์ฑํํ๊ฑฐ๋ ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋ ์ทจ์/๊ตฌ๋ ํ๋ ๊ฒ์ ๋๋ค. ๋ด ๊ฒฝํ์ ์ฝ๋ฐฑ์ ํ์ฑํ/๋นํ์ฑํ ๋๋ ๊ตฌ๋ ์ทจ์/๊ตฌ๋ ํ๋ ค๊ณ ํ ๋ ์ฌ๋ฌ ํธ์ถ์ด ์์๋๊ธฐ ๋๋ฌธ์ ์ธ๋งํฌ์ด๊ฐ ๊ฐ์ฅ ์ ์๋ํ์ต๋๋ค.
@hartez @samhouts @davidortinau ์์ผ๋ก ์ด ๋ฌธ์ ๊ฐ ๊ฝค ์์ฃผ ์ ๊ธฐ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์์ ์ ์์ ๋๋จธ์ง ํญ๋ชฉ์ ๋ํ ๋ฌธ์์ ์ผ๋ถ์ฌ์ผ ํฉ๋๊น? ๋ฌธ์ ํ์ด ํ ์คํธ์ฉ ์๊ฒฉ ํผ๋๋ฅผ ๋ง๋ค๊ณ ์ฐธ์กฐ์ฉ ์ฝ๋ฉ ํจํด์ ์ถ์ฒํ์ฌ ์ฌ๋๋ค์ด ๊ณ์ ๋์์ ์์ฒญํ์ง ์๋๋ก ํ๊ณ ์ถ์ต๋๋ค.
@techduggu ์ฝ๋์ ๋ค๋ฅธ(์ฌ์ํ) ๋ฌธ์ ๊ฐ ์์ต๋๋ค. Stack Exchange์์ ์ฝ๋๋ฅผ ๊ฒํ ํ๊ฒ ์ต๋๋ค. ์ง๊ธ์ ๊ทธ๋ฐ ๊ณณ์ด ์๋๋๋ค.
@adrianknight89 "์คํฌ๋กค ํจํด์ผ๋ก ์ธํด"๋ผ๋ ์ฉ์ด๋ฅผ ๊ฐ์กฐํด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. ์ด๊ฒ์ ๊ทธ๊ฒ์ ๋ํด ๋ ๋ง์ด ์ฐพ๋ ๊ฒ์ ๋ํ ๊ฐ๋ ค์์ฆ์ ์ ๋ฐํ์ต๋๋ค. RecyclerView ๋ฐ ๊ธฐํ ๋ฆฌ์์ค์ ๋ํ ๊ณต์ ๋ฌธ์๋ฅผ ์ดํด๋ณธ ํ ์, ์คํฌ๋กค ํจํด์ผ๋ก ์ธํด ์ฌ๋ฌ ๋ฒ ํธ์ถ๋๊ณ ํด๋น ํจํด์ด ์คํฌ๋กค ์ํ์ ๋ฐ๋ผ SCROLL_STATE_IDLE, SCROLL_STATE_DRAGGING ๋๋ SCROLL_STATE_SETTLING์์ ํ์ธํ ์ ์์ต๋๋ค.
https://developer.android.com/reference/android/support/v7/widget/RecyclerView.OnScrollListener
๊ทํ์ ์ฝ๋์ ์ด ์๋๋ก์ด๋ ๊ฐ์ด๋(https://github.com/codepath/android_guides/wiki/Endless-Scrolling-with-AdapterViews-and-RecyclerView)๋ ์ ๊ธ ๋๋ ์ฌ์ฉ์ ํตํด ๋ฌดํ ์คํฌ๋กค์ ์ฒ๋ฆฌํด์ผ ํจ์ ํ์ธํฉ๋๋ค. ์์ ์คํฌ๋กค ์ํ(๋๋ถ๋ถ ์ฌ์ฉ์ ์ง์ ๋ ๋๋ฌ๊ฐ ํ์ํจ). ๋ฐ๋ผ์ Xamarin.Forms๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ์๋ํ๊ณ ๋งค๋ ฅ์ฒ๋ผ ์๋ํ์ต๋๋ค. :) ์ ์ ๊ฐ์ ์ฌ๋๋ค(๋ฐ ์ง์์ ๊ฐ์ง)์ด ์ ๊ธฐํ๋ ๊ทธ๋ฌํ ๋ฌธ์ ๋ฅผ ํผํ๊ธฐ ์ํด ์ด ์ ์์ ๋ฌธ์์ ์ผ๋ถ๋ก ํฌํจํ๋๋ก ๊ทํ์ ์๊ฒฌ์ ์ถ์ฒํ๊ณ ์ง์งํฉ๋๋ค. :)
๋ํ, reg. ์์ ์ฝ๋ ์กฐ๊ฐ์ ๋ํด ์ธ๊ธํ ์ฌ์ํ ๋ฌธ์ - ์ด๊ฒ์ ์ปฌ๋ ์ ๋ณด๊ธฐ๋ก ๋ฌดํ ๋ก๋ฉ์ ํ ์คํธํ๊ธฐ ์ํ POC ํ๋ก์ ํธ์ผ ๋ฟ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฆฌ์์ null ๊ฒ์ฌ ๋ฑ์ ์ ์ธํ๊ณ ๋ ๋น์ ์ ์๊ฒฌ์ ์๊ณ ์ถ์ต๋๋ค.
๊ฐ์ฌ ํด์!
@adrianknight89 ์ ๋ค. ๋ฐ์ ์ํ๊ฐ ๋๋ฝ๋์ด ์คํํน ๋ฌธ์ ์ ๋์์ด ๋์์ต๋๋ค.
๋ํ ์ ์ํ ๋๋ก ์ธ๋งํฌ์ด๋ฅผ ๊ตฌํํ์ผ๋ฉฐ ItemsSource์ ์ ํญ๋ชฉ์ ์ถ๊ฐํ ๋ ๋ณด๊ธฐ๊ฐ ์คํฌ๋กค ์์น๋ฅผ ์ฒ์์ผ๋ก ์ฌ์ค์ ํ๋ ๋ฌธ์ ๋ฅผ ์ํํ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ์ด์ํ๊ฒ๋ ํธ์ถ์ ์๋์ ์ถ๊ฐํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก; ํ ์คํธ ํ์ผ์์ ํ๋ ๊ฒ์ฒ๋ผ ์ด ๋ฌธ์ ๊ฐ ๋ค์ ๋ฐ์ํ์ต๋๋ค.
๋ชฉ๋ก์ ๋๊น์ง ์คํฌ๋กคํ ๋ ์ฌ์ ํ ์ ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ณด๊ธฐ๊ฐ ๋น์ด ์๊ณ ์์ฉ ํ๋ก๊ทธ๋จ์ด ์ ์ง๋ฉ๋๋ค.
ํธ์ง: ์คํฌ๋กค ์์น ์ฌ์ค์ ์ ์ฌ์ ํ โโ์์ง๋ง ์์ฃผ๋ ์๋๋๋ค. ๋ ๋ง์ ํญ๋ชฉ์ ๋ก๋ํ๋ ๋ ๋๋ง์ ์ฅ์น์์๋ ๋งค์ฐ ๊ณ ๋ฅด์ง ์์ต๋๋ค.
@techduggu ์ ๋ VS๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ง๋ง ์ฝ๋๋ฅผ ๋ณด๋ฉด RemainingStories()
๊ธฐ๋ค๋ ค์ผ ํ๊ณ , try ๋ด์์ ์๊ฒฉ ํธ์ถ์ ์ด๋ํ๊ณ , HttpClient
๋ํด using์ ์ฌ์ฉํด์ผ ํฉ๋๋ค(์ด์์ ์ผ๋ก๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฒด์ ๋จ์ผ ์ ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ์ ๋ ํ๊ธฐํ์ง ์์), ํ์ง๋ง ์ฌ๊ธฐ์ ์ค์งํ๊ฒ ์ต๋๋ค. :)
@Bronson15 CollectionView์ ์คํฌ๋กค ์์น๋ฅผ ์ฌ์ค์ ํ๊ณ UI๊ฐ ์ ์ง๋๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. #7285๋ก ์์ ๋ ๊ฒ ๊ฐ์๋ฐ iOS ์ ์ฉ์ ๋๋ค. ์ต์ ์ผ๊ฐ Nuget์ ํ ์คํธํ๊ณ ์ฌ์ ํ ๋ฌธ์ ๊ฐ ์๋์ง ํ์ธํ ์ ์์ต๋๊น? ์ผ๊ฐ ํผ๋ URL์ ์์์ฉ GitHub ํํ์ด์ง์ ์์ต๋๋ค. ๋ฌธ์ ๊ฐ ์ง์๋๋ฉด ์ฌ์์ฐ ์ฝ๋ ๋ฌธ์ ๋ฅผ ์ด์ด ๊ฒํ ํ ์ ์์ต๋๋ค.
@adrianknight89 ์ผ๊ฐ ๋น๋๋ก ์คํฌ๋กคํฉ๋๋ค. ๋ฌธ์ ๊ฐ ๋๋ถ๋ถ ํด๊ฒฐ๋ ๊ฒ ๊ฐ์ต๋๋ค(ํ ๋ฒ ๋ฐ์ํ๋ ๊ฒ์ ๋ณด์์ต๋๋ค). ๋ชฉ๋ก์ด ๋์ด ์๋๋ผ ๋์๋ ๋ฃจํ์ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. AFAIK ์ฌ์์ ๊ทธ๋ฐ ์ผ์ด ์ผ์ด๋์ง ์๋๋ก ํ๋ ์์ฑ์ด ์์ต๋๊น?
@Bronson15 ๋ฌดํ ๋ฃจํ๊ฐ ๋ฐ์ํด์๋ ์๋ฉ๋๋ค. iOS ๋๋ Android์์ ๋ณด๊ณ ์์ต๋๊น? ์๊ฒฉ ํผ๋์ ๋์ ๋๋ฌํ๋ฉด ๋ฃจํ๋ฅผ ์ข
๋ฃํด์ผ ํฉ๋๋ค(์ฆ, ๋ค๋ฅธ DB ํธ์ถ์ ๋ฐํํ์ง ์๊ณ ์ฆ์ RemainingItemsThresholdReachedCommand
์์ ๋ฆฌํด).
๋ณด๊ธฐ ์คํฌ๋กค์ด ์ค์ง๋๋ฉด ๋ช
๋ น์ด ๋ ์ด์ ํธ๋ฆฌ๊ฑฐ๋์ง ์์์ผ ํฉ๋๋ค. ์ฐ์ ํ ํฐ์ ๋ฐํํ๋ Azure Cosmos๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ ํฐ์ด null์ด๋ฉด ๋ ์ด์ ๋ก๋ํ ์ฝํ
์ธ ๊ฐ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ผ๋ฏ๋ก ๋ด RemainingItemsThresholdReachedCommand
๋ ํด๋น ํ ํฐ์ ๊ธฐ๋ฐ์ผ๋ก ์๋ํฉ๋๋ค. ๋น์ทํ ๊ฒ์ ๊ตฌํํด์ผ ํฉ๋๋ค.
@adrianknight89 ์ . ํฅ๋ฏธ๋ก์ด. ๊ฒฐ๊ณผ ์นด์ดํธ์ ๋ํ ๊ฒ์ฌ๋ฅผ ์ถ๊ฐํ๊ณ 0์ด๋ฉด ๋ฐํํฉ๋๋ค. ๋ฌดํ ์คํฌ๋กค์ ์์ ํ์ต๋๋ค. ๋์์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
@adrianknight89 ๋ iOS ์ถฉ๋ ๋ฌธ์ ์ ๋ํด
Android์ 1000๊ฐ ํญ๋ชฉ์ ๊ฑฐ์ ์ค์๊ฐ์ด๋ฉฐ iOS์์๋ ๋ทฐ๊ฐ ๋ ๋๋ง๋๊ธฐ๊น์ง 5-7์ด๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค. ๋๋ฒ๊ทธ, iPhone Xs ๋ฐ Redmi Note 7 ๋ชจ๋
@andreabalducci XS ์๋ฎฌ๋ ์ดํฐ๋ฅผ ์ฌ์ฉ
@adrianknight89 @andreabalducci ์, Xs Max์์ ๋ ๋ง์ ํญ๋ชฉ์ ๋ก๋ํ๋ ๋ฐ ์ฝ 1-5์ด๊ฐ ๊ฑธ๋ฆฝ๋๋ค. ๋ณด๊ธฐ๋ ์ด๋ฏธ ๋ ๋๋ง๋ ๋ชฉ๋ก์ ํญ๋ชฉ์ ์ถ๊ฐํ๋ ๋์ ๋ชจ๋ ํญ๋ชฉ์ ๋น์ฐ๊ณ ๋ค์ ๋ก๋ํฉ๋๋ค.
@adrianknight89 ๋ ๋ฌผ๋ฆฌ์ ์ฅ์น ๋ชจ๋ iOS ์๋ฎฌ๋ ์ดํฐ์ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
iOS๊ฐ 20์ด๋ฅผ ๋๊ธฐ ์ ์ ๋ฐ์ดํฐ ํ ํ๋ฆฟ์์ ๋ชจ๋ ์คํ ๋ ์ด์์์ ์ ๊ฑฐํ๊ณ ์ปดํ์ผ๋ ๋ฐ์ธ๋ฉ์ ํ์ฑํํ FormattedString์ผ๋ก ์ฝ๊ฐ์ ์๋ ์ ํ์ ์ป์์ต๋๋ค.
iOS์์๋ ObservableRangeCollection(mvvm ๋์ฐ๋ฏธ์์)์ ์ถ๊ฐํ ๋ ๋ณด๊ธฐ๊ฐ ๊ฒ๊ฒ ํ์๋๊ณ ๋ชจ๋ ๋ค์ ๊ทธ๋ฆฌ๋ฉฐ Android์์๋ ์ ๋๋ก ์๋ํฉ๋๋ค.
์ด๊ฒ์ ๋์๊ฒ ๋ณ๊ฐ์ ๋ฌธ์ ์ฒ๋ผ ๋ค๋ฆฐ๋ค. ๋จ์์๋ ์์ดํ ์ด ์๋๊ฐ ์ถ์ต๋๋ค.
GridItemsLayout์ ์ฌ์ฉํ ๋ ํญ๋ชฉ์ด ์ฌ๋ฌ ํ์ด๋ ์ด์ ๊ฑธ์ณ ์๋๋ก ํ์ฉํ ์ ์์ต๋๊น? ๊ทธ๊ฒ์ ํ์คํ ๊ฐ์น๊ฐ ์๋ ๊ธฐ๋ฅ์ผ ๊ฒ์ ๋๋ค.
์ด์ ๋ํ ์ ๋ณด๊ฐ ์์ต๋๊น?
@LynoDesu ์ด์ ๋ํ ๋ฌธ์ ๊ฐ ์ถ์ ๋๊ณ ์์ต๋๋ค. https://github.com/xamarin/Xamarin.Forms/issues/6357
@LynoDesu ์ด์ ๋ํ ๋ฌธ์ ๊ฐ ์ถ์ ๋๊ณ ์์ต๋๋ค: #6357
์, ์ข์! ๊ฐ์ฌ ํด์. ์ฌ๊ธฐ์ ๊ธฐ์ฌํ๋ ค๋ฉด ์ด๋์ ์์ํด์ผ ํฉ๋๊น?
ํํ์ด์ง ์ํค์ Contributing.md๋ฅผ ์ฝ์ด๋ณด์ธ์.
@adrianknight89 ๋ ๊ณต๋ฐฑ + ๋ค์ ์์ ๋ฌธ์ ๋ฅผ ์ฐพ์์ต๋๋ค. https://github.com/andreabalducci/XamarinCollectionView/blob/b186e563ff8391dfb473e62e5a4c4587e8d4e9da/cvrepro/cvrepro/ListViewModel.cs
๋น ์ปฌ๋ ์ ์ผ๋ก ์์ํ๋ฉด ๋ชจ๋ ๋ฐ์ธ๋ฉ์ด ์์๋๋ก ์๋ํ๊ธฐ ์ ์ ์ปฌ๋ ์ ์ ํญ๋ชฉ์ด ์๋ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค.
iPhone ์๋ฎฌ๋ ์ดํฐ์์ ํ ์คํธํ์ต๋๋ค.
๋ฌธ์ ๊ฐ ๋ณด์ ๋๋ค. ์ด๊ฒ์ ์๋ง๋ #7548๊ณผ ๋์ผํ ๊ฒ์ ๋๋ค. ๊ฑฐ๊ธฐ์ ๋ ํ๋ก๋ฅผ ๊ฒ์ํ๊ณ ์ถ์ ์๋ ์์ต๋๋ค.
CollectionView๋ IsGrouped๋ฅผ ์ฌ์ฉํ ๋ Android์์ ๋ฒ๊ทธ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
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์์๋ง ์ง์๋ฉ๋๋ค.
์, ๊ทธ ๋ถ๋ถ์ ๋์ณค์ต๋๋ค. ๊ฐ์ฌ ํด์.
iOS์ Android ๋ชจ๋์์ ๊ทธ๋ฃนํ๋ ๋ชฉ๋ก์ ํ์ํ๊ณ ์ถ์ง๋ง ListView๋ฅผ ํผํ๊ณ ์ถ์ ์ฌ๋๋ค์ ์ํด ํ์ฌ CollectionView๋งํผ ์ ์ฐํ๊ฒ ์ฌ์ฉํ ์ ์๋ ๋ค๋ฅธ ๊ฒ์ด ์์ต๋๊น? ์๋๋ฉด ListView์ ๊ฐํ ์์ต๋๊น?
์ด๊ณณ์ด ๋ฐ๋ก ๋ฌผ์ด๋ณด๋ ๊ณณ์ด๊ธธ ๋ฐ๋๋๋ค. ์๋ ๊ฒ์๋ ์ฌ์์๋ IsHeaderSticky
๋ฐ IsFooterSticky
๋ํ ์์ฑ์ด ์์ง๋ง ํ ๋ก ์ด๋ ๊ตฌํ๋ ์์ค ์ฝ๋ ์ด๋์๋ ์ด์ ๋ํ ์ถ๊ฐ ์ธ๊ธ์ด ์์ต๋๋ค. ์์ง ์ด ๋ณด๊ธฐ์ ๋ํ ๋ก๋๋งต์ ์์ต๋๊น?
collectionview์์๋ ItemAppeared, ITemDisappeared๊ฐ ํ์ํฉ๋๋ค.
๋ฌ์ฑํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
@IosDeveloperHarsh Scrolled
์ด๋ฒคํธ๋ ์ด๋ฒคํธ ์ธ์์ ๋ง์ ์ ์ฉํ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ฑฐ๊ธฐ์์ ์ฒ์๊ณผ ๋ง์ง๋ง์ผ๋ก ๋ณด์ด๋ ํญ๋ชฉ ์์ธ์ ๋ณด์ญ์์ค.
@rafiwardak2003 CollectionView ๊ทธ๋ฃน์ด ์๋ ๊ฐค๋ฌ๋ฆฌ ์ํ์ ์ค๋ ํ์ฌ Android์์ ์๋ํ์ง๋ง ๊ทํ๊ฐ ์ ๊ณตํ ์ํ์ ์คํํ์ง๋ ์์์ต๋๋ค. ์ด๋ค Nuget์ ์ฌ์ฉํ๊ณ ์์์ต๋๊น? ์ต์ ์ํํ ๋๋ ์ผ๊ฐ์ผ๋ก ์๋ํ์ญ์์ค.
@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์ด ์๋ ๋ค๋ฅธ ๊ฒ์ Command์ ๋ํ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น?
SelectionChangedCommandParameter๋ฅผ ์ ๊ฑฐํ๊ณ ๋์ ์ ํํ ํญ๋ชฉ์ ์๋์ผ๋ก ๋งค๊ฐ๋ณ์๋ก ์ค์ ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ๋ฅํ๋ค๋ฉด ์ด๋ฐ ์์ฑ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ ๊ฒ์ ๋๋ค.
public ICommand => new Command<MySelectedItemModel>((item) => {}
ํ์ง๋ง ์ด๊ฒ๋ ๊ด์ฐฎ์ ๊ฒ์ ๋๋ค:
public ICommand => new Command<object>((item) =>{ var selectedItem = item as MySelectedItemModel;}
์ฌ์ฉ์๊ฐ SelectedItem์ด ์๋ ๋ค๋ฅธ ๊ฒ์ Command์ ๋ํ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น?
๋น์ ์ ์์ ์ด ์์ง๋ง CollectionView ์์ค์์ ๋งค๊ฐ ๋ณ์๋ฅผ ์ค์ ํ๊ธฐ ๋๋ฌธ์ ์ ์ค ์ผ์ด์ค๋ฅผ๋ณด๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. ์ฒ์ ์ฌ์ฉํ ๋ ์ ํ ํญ๋ชฉ์ด ๋ ๊ฒ์ผ๋ก ์์ํ์ต๋๋ค. ํ์ง๋ง ์ ํํ ํญ๋ชฉ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ ์ ์์ต๋๊น? ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ๊ฒ ๋๋ฏ๋ก ๋ง์ ๊ฐ๋ฐ์๋ค์ด ๋ช ๋ น์ ๋ํด์๋ ๊ธฐ๋ํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด CollectionView๊ฐ ์ ์ฒด ํ๋ฉด์ผ๋ก ๋์ด๋์ง ์๊ณ ํญ๋ชฉ ์์ ๋ฐ๋ผ ๋์ด๋ง ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ๋ ์์ฒญํ๊ณ ์ถ์ต๋๋ค.
์ฌ๋ฌ ๋ชฉ๋ก์ ํ์ํ๋ ค๊ณ ํฉ๋๋ค.
์ฆ
๊ตฌ๋งค
๊ณต์
์ด
์ด
๋ํ๋ค
๊ทธ๋ฌ๋ ํญ๋ชฉ 1๊ณผ 2(CollectionView)๋ 3~4๊ฐ์ ํญ๋ชฉ๋ง ์๊ณ ์๋์ BIIIIIIIIIIIIIIIG ๊ฐ๊ฒฉ์ด ์๋ ๊ฒฝ์ฐ์๋ ๊ณต์ ์น์ ์ ๋ณด๊ธฐ ์ ์ ๋์ด๊ฐ ๋๋ฌด ๋์์ก์ต๋๋ค.
๋๋ ๊ฒฐ๊ตญ StackLayout์ ๊ธฐ๋ฐ์ผ๋ก ๋ด ์์ ์ ItemsCollection ์ปจํธ๋กค์ ๋ง๋ค์์ต๋๋ค.
์ด CollectionView๊ฐ ์ ์ฒด ํ๋ฉด์ผ๋ก ๋์ด๋์ง ์๊ณ ํญ๋ชฉ ์์ ๋ฐ๋ผ ๋์ด๋ง ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ๋ ์์ฒญํ๊ณ ์ถ์ต๋๋ค.
๋๋ ๊ฒฐ๊ตญ StackLayout์ ๊ธฐ๋ฐ์ผ๋ก ๋ด ์์ ์ ItemsCollection ์ปจํธ๋กค์ ๋ง๋ค์์ต๋๋ค.
๋๋ ๋น์ ์ด ์ฐพ๊ณ ์๋ ๊ฒ์ด Bindable Layouts ์ผ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด CollectionView๊ฐ ์ ์ฒด ํ๋ฉด์ผ๋ก ๋์ด๋์ง ์๊ณ ํญ๋ชฉ ์์ ๋ฐ๋ผ ๋์ด๋ง ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ๋ ์์ฒญํ๊ณ ์ถ์ต๋๋ค.
๋๋ ๊ฒฐ๊ตญ StackLayout์ ๊ธฐ๋ฐ์ผ๋ก ๋ด ์์ ์ ItemsCollection ์ปจํธ๋กค์ ๋ง๋ค์์ต๋๋ค.๋๋ ๋น์ ์ด ์ฐพ๊ณ ์๋ ๊ฒ์ด Bindable Layouts ์ผ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ผ! ์ ํํ ๋ด๊ฐ ํ์ํ ๊ฒ. BindableLayout์ด ์ธ์ ๋ถํฐ ์กด์ฌํ์ต๋๊น?
์ด ๋ฌธ์ ์ ๋ํด ํ ๋ก ํด ์ฃผ์ ๋ชจ๋ ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค! ์ถ๊ฐ ๊ธฐ๋ฅ ์์ฒญ์ด๋ ๋ฒ๊ทธ ๋ณด๊ณ ์๊ฐ ์๋ ๊ฒฝ์ฐ ๊ฐ๊ฐ์ ๋ํด ์๋ก์ด ๋ฌธ์ ๋ฅผ ์ด์ด์ฃผ์ธ์. ์ด์ ์ด ๋ฌธ์ ๋ฅผ ์ข ๋ฃํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์์ฐจ ํค๋๋ฅผ ์ง์ํ๋ Scrolling ์ด๋ฒคํธ๋ ์ด๋ป์ต๋๊น?