質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

1回答

3196閲覧

Xamarin.Formsでグルーピングを使用してListView内でのループを実現したい

takuo-nkmr

総合スコア8

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

0クリップ

投稿2018/04/24 07:28

編集2018/04/25 02:22

前提・実現したいこと

Xmarin.Formsを使用してアプリを開発しています。
List内にListを格納したクラスをListViewで表示したいと思っているのですが、
Jason Smith's Xamarin Forms Performance Tips の記載にあるように、

DO NOT nest ListViews. Instead, use groups within a single ListView. Nesting is explicitly unsupported and will break your application.

ListViewをネストさせるのではなく、グルーピングを使用する、となっています。
そこで、公式ドキュメント のサンプルをベースに作成を試みたのですが、うまくいきません。

どのように実装すべきか、ご教授いただきたいです。

作成したい画面のイメージ

イメージ説明

試したこと

ListViewにバインドするデータが2階層となっているもののサンプルを作成致しました。
https://github.com/takuo-nkmr/NestedListViewSample

該当のソースは下記となります。

NestedListViewSamplePage.xaml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 3 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 4 xmlns:local="clr-namespace:NestedListViewSample" 5 x:Class="NestedListViewSample.NestedListViewSamplePage" 6 Title="Nested ListView Sample"> 7 <ListView x:Name="ItemDataList" 8 HasUnevenRows="True" 9 SeparatorColor="Transparent" 10 IsGroupingEnabled="True"> 11 <ListView.GroupHeaderTemplate> 12 <DataTemplate> 13 <ViewCell> 14 <StackLayout> 15 <Label FontSize="20" FontAttributes="Bold" 16 Text="{Binding Key.FirstItemName}"/> 17 <Image Source="drawable/test_img.png" 18 HorizontalOptions="Start" 19 HeightRequest="50"/> 20 </StackLayout> 21 </ViewCell> 22 </DataTemplate> 23 </ListView.GroupHeaderTemplate> 24 <ListView.ItemTemplate> 25 <DataTemplate> 26 <ViewCell> 27 <StackLayout> 28 <Label Text="{Binding SecondItemName}"/> 29 </StackLayout> 30 </ViewCell> 31 </DataTemplate> 32 </ListView.ItemTemplate> 33 </ListView> 34</ContentPage>

コードビハインド

c#

1using System; 2using System.Collections.Generic; 3using System.Collections.ObjectModel; 4using NestedListViewSample.Model; 5using Xamarin.Forms; 6 7namespace NestedListViewSample 8{ 9 public partial class NestedListViewSamplePage : ContentPage 10 { 11 ObservableCollection<Grouping<ItemModel, SecondItem>> Itemist { get; set; } = 12 new ObservableCollection<Grouping<ItemModel, SecondItem>>(); 13 14 public NestedListViewSamplePage() 15 { 16 InitializeComponent(); 17 18 for (var i = 0; i < 30; i++) 19 { 20 // 1階層目セット 21 var itemData = new ItemModel() 22 { 23 FirstItemName = "アイテム名 1 - " + i.ToString() 24 }; 25 26 // 2階層目セット 27 var secondItemList = new List<SecondItem>(); 28 for (var j = 0; j < 3; j++) 29 { 30 secondItemList.Add(new SecondItem 31 { 32 SecondItemName = "アイテム名 2 - " + j.ToString() 33 }); 34 } 35 itemData.SecondItems = secondItemList; 36 37 var group = new Grouping<ItemModel, SecondItem>(itemData, itemData.SecondItems); 38 39 Itemist.Add(group); 40 } 41 ItemDataList.ItemsSource = Itemist; 42 } 43 } 44 45 public class Grouping<K, T> : ObservableCollection<T> 46 { 47 public K Key { get; private set; } 48 49 public Grouping(K key, IEnumerable<T> items) 50 { 51 Key = key; 52 foreach (var item in items) 53 this.Items.Add(item); 54 } 55 } 56} 57

モデルクラス

c#

1using System; 2using System.Collections.Generic; 3 4namespace NestedListViewSample.Model 5{ 6 public class ItemModel 7 { 8 public string FirstItemName { get; set; } 9 public List<SecondItem> SecondItems { get; set; } 10 } 11 12 public class SecondItem 13 { 14 public string SecondItemName { get; set; } 15 } 16} 17

 

上記のようなグループ構成としてはみたものの、GroupHeaderで1行、Itemで1行(ソースでは固定で3行)と
なってしまいます。
Header + Item全部を1行として、ListViewで選択可能としたいです。
(このために、別で全てをItemに格納して表示させてみたのですが、今度はItemModel.SecondItemの内容が
表示できず・・・)

実現したいこと

  1. ItemModelクラスの1つをListViewの1行として表示したいです。
  2. SecondItemクラスの内容全てを1行の中の要素として表示したいです。

補足情報(FW/ツールのバージョンなど)

  • Visual Studio for Mac 7.4.3
  • Xamarin.Forms 2.5.0.121934
  • 検証端末: Nexus7(Android6.0.1)

iPad Air2(iOS11.3)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

P3PPP

2018/04/24 08:26

何をもってうまくいかないと評しているか具体的に書きましょう。
takuo-nkmr

2018/04/25 02:23

ご指摘ありがとうございます。質問の内容を追記致しました。
guest

回答1

0

こんにちは。

その図の場合はListViewのGroup機能を使っても実現はできないかと思います。
おそらくヘッダーに部類されるImageが明細に入ってしまっていますので。

例えばレイアウトを以下のように妥協すれば可能だと思います。

Image1 GroupTitle1

  • item-1-1
  • item-1-2

Image2 GroupTitle2

  • item-2-1
  • item-2-2

または子のリストが数個しかない場合はViewCellに全部記述するという手もあります。

投稿2018/04/24 09:32

kamu

総合スコア208

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takuo-nkmr

2018/04/25 02:27

ご回答ありがとうございます。 また、質問の内容が不足しておりましたので、追記致しました。 言葉足らずで申し訳ございません。 今回実現したいと思っていることは、上記ご回答の「Image1 GroupTitle1」をListViewの1行として扱い、 「item-1-1」「item-1-2」は1行の中身として全て表示したい、というものとなります。 お手数をおかけ致しますが、引き続きよろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問