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

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

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

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

Visual Studio

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Xamarin

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

Q&A

解決済

1回答

2085閲覧

Xamarin - ExpandableListViewのリスト追加

sezaki_H

総合スコア41

C#

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

Visual Studio

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Xamarin

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

0グッド

0クリップ

投稿2018/10/22 03:11

編集2018/10/29 03:06

XamarinのExpandableListViewの親リストを後から追加し更新させたいのですが、どのように書けばいいのでしょうか?
追加する親リストの名前はダイアログで入力させています。

c#

1 notebutton.Click += (_, __) => 2 { 3 var layout = new LinearLayout(this) { Orientation = Orientation.Vertical }; 4 layout.SetGravity(GravityFlags.Left); 5 var notename = new EditText(this); 6 layout.AddView(new TextView(this) { Text = "ノート名" }); 7 layout.AddView(notename); 8 9 var dlg = new AlertDialog.Builder(this); 10 dlg.SetTitle("ノートの名前を入力してください。"); 11 dlg.SetView(layout); //<=作成したビューを指定 12 13 dlg.SetPositiveButton("OK", (s, a) => Toast.MakeText(this, notename.Text, ToastLength.Short).Show()); 14 dlg.Create().Show(); 15 16 //リスト追加、更新 17 groupElement.Add(notename.Text); 18 groupList.Add(groupElement); 19 adapter.NotifyDataSetChanged(); 20 21 };

全体コード

c#

1using Android.App; 2using Android.Widget; 3using Android.OS; 4using System.Collections.Generic; 5using Android.Content; 6using PCLStorage; 7using Android.Runtime; 8using Temo1.Resources.layout; 9using Android.Views; 10using static Android.Resource; 11 12namespace Temo1 13{ 14 [Activity(Label = "Temo1", MainLauncher = true)] 15 public class MainActivity : Activity 16 { 17 protected override void OnCreate(Bundle savedInstanceState) 18 { 19 base.OnCreate(savedInstanceState); 20 21 // Set our view from the "main" layout resource 22 SetContentView(Resource.Layout.Main); 23 24 25 26 Button memobutton = FindViewById<Button>(Resource.Id.button1); 27 Button notebutton = FindViewById<Button>(Resource.Id.notebutton); 28 ExpandableListView memolist = FindViewById<ExpandableListView>(Resource.Id.expandableListView1); 29 30 string[] filename = new string[100]; 31 int n; 32 var localFolder = FileSystem.Current.LocalStorage; 33 var files = localFolder.GetFilesAsync().Result; 34 35 36 //親リストgroupList子リストchildList 37 List<IDictionary<string, object>> groupList = new List<IDictionary<string, object>>(); 38 List<IList<IDictionary<string, object>>> childList = new List<IList<IDictionary<string, object>>>(); 39 40 //デフォルトのグループ"全て" 41 JavaDictionary<string, object> groupElement = new JavaDictionary<string, object>(); 42 groupElement.Add("GROUP_TITLE", "ALL"); 43 groupList.Add(groupElement); 44 45 46 47 48 49 //子リスト用の文字列(ファイル名)を配列に用意 50 n = 0; 51 foreach (var file in files) 52 { 53 var fn = file.Name; 54 fn = fn.Remove(fn.Length - 4);//拡張子を表示しないように末尾を削除 55 filename[n] = fn;//配列にファイル名を格納 56 n++; 57 } 58 59 60 JavaList<IDictionary<string, object>> childElements = new JavaList<IDictionary<string, object>>(); 61 for (int j = 0; j <= n - 1; j++) 62 { 63 JavaDictionary<string, object> child = new JavaDictionary<string, object>(); 64 child.Add("CHILD_TITLE", filename[j]); 65 childElements.Add(child); 66 } 67 childList.Add(childElements); 68 69 SimpleExpandableListAdapter adapter = new SimpleExpandableListAdapter( 70 this, 71 groupList, 72 Android.Resource.Layout.SimpleExpandableListItem1, 73 new string[] { "GROUPE_TITLE" }, 74 new int[] { Android.Resource.Id.Text1 }, 75 childList, 76 Android.Resource.Layout.SimpleExpandableListItem2, 77 new string[] { "CHILD_TITLE" }, 78 new int[] { Android.Resource.Id.Text2 } 79 ); 80 memolist.SetAdapter(adapter); 81 82 83 //親リスト追加 84 85 //リスト名入力ダイアログ 86 notebutton.Click += (_, __) => 87 { 88 var layout = new LinearLayout(this) { Orientation = Orientation.Vertical }; 89 layout.SetGravity(GravityFlags.Left); 90 var notename = new EditText(this); 91 notename.SetMaxLines(1); 92 layout.AddView(new TextView(this) { Text = "ノート名" }); 93 layout.AddView(notename); 94 95 var dlg = new AlertDialog.Builder(this); 96 dlg.SetTitle("ノートの名前を入力してください。"); 97 dlg.SetView(layout); //<=作成したビューを指定 98 99 dlg.SetPositiveButton("OK", (s, a) => 100 { 101 Toast.MakeText(this, notename.Text, ToastLength.Short).Show(); 102 103 if (!string.IsNullOrEmpty(notename.Text)) 104 { 105 var newGroupElement = new JavaDictionary<string, object>(); 106 newGroupElement.Add("GROUPE_LIST", notename.Text); 107 groupList.Add(newGroupElement); 108 adapter.NotifyDataSetChanged(); 109 } 110 else 111 { 112 // 未入力エラー 113 } 114 }); 115 dlg.Create().Show(); 116 117 118 }; 119 120 121 //メモ作成画面へ遷移 122 memobutton.Click += (_, __) => 123 124 { 125 126 var intent = new Intent(this, typeof(memocreate)); 127 128 StartActivity(intent); 129 130 131 }; 132 133 134 //リストアイテムがクリックされたらテキスト編集に遷移 135 memolist.ChildClick+= async (sender, e) => 136 { 137 var parent = (ExpandableListView)e.Parent; 138 var packedPosition = parent.GetExpandableListPosition(e.ChildPosition); 139 140 var groupPosition = ExpandableListView.GetPackedPositionGroup(packedPosition); 141 var childPosition = ExpandableListView.GetPackedPositionChild(packedPosition); 142 var type = ExpandableListView.GetPackedPositionType(packedPosition); 143 if (type == PackedPositionType.Child) 144 { 145 var item = (IDictionary<string, object>)parent.ExpandableListAdapter.GetChild(groupPosition, childPosition+1); 146 var clickfile = item["CHILD_TITLE"].ToString(); 147 148 //そのファイルのテキストを取得 149 IFolder rootFolder = FileSystem.Current.LocalStorage; 150 IFile file = await rootFolder.GetFileAsync(clickfile + ".txt"); 151 string saveddata = await file.ReadAllTextAsync(); 152 153 var intent = new Intent(this, typeof(memoedit)); 154 intent.PutExtra("clickfile", clickfile); 155 intent.PutExtra("Data", saveddata); 156 157 158 StartActivity(intent); 159 160 } 161 }; 162 163 164 165 //長押しされたアイテムを削除 166 memolist.ItemLongClick += async (sender, e) => 167 { 168 var parent = (ExpandableListView)e.Parent; 169 var packedPosition = parent.GetExpandableListPosition(e.Position); 170 171 var groupPosition = ExpandableListView.GetPackedPositionGroup(packedPosition); 172 var childPosition = ExpandableListView.GetPackedPositionChild(packedPosition); 173 var type = ExpandableListView.GetPackedPositionType(packedPosition); 174 if (type == PackedPositionType.Child) 175 { 176 var item = (IDictionary<string, object>)parent.ExpandableListAdapter.GetChild(groupPosition, childPosition); 177 var deletefile = item["CHILD_TITLE"].ToString(); 178 179 180 //adapterから削除し更新 181 childList[groupPosition].Remove(item); 182 adapter.NotifyDataSetChanged(); 183 184 //元ファイル削除 185 IFolder rootFolder = FileSystem.Current.LocalStorage; 186 IFile file = await rootFolder.GetFileAsync(deletefile + ".txt"); 187 188 await file.DeleteAsync(); 189 } 190 191 192 }; 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 } 214 } 215}

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/10/22 03:33

xamarinは日本語のリソースに乏しいので、英語で調べるとよいかもです。
guest

回答1

0

ベストアンサー

groupListに追加しても表示が変わらないのであれば、groupListの型がJavaListになっていないのではないでしょうか?
また、groupListに追加するgroupElementは新しくオブジェクトを作成しなければいけません。

C#

1dlg.SetPositiveButton("OK", (s, a) => 2{ 3 Toast.MakeText(this, notename.Text, ToastLength.Short).Show(); 4 5 if (!string.IsNullOrEmpty(notename.Text)) 6 { 7 var newGroupElement = new JavaDictionary<string, object>(); 8 newGroupElement.Add("GROUPE_TITLE", notename.Text); 9 groupList.Add(newGroupElement); 10 adapter.NotifyDataSetChanged(); 11 } 12 else 13 { 14 // 未入力エラー 15 } 16});

あと、ダイアログで入力した値を使うのであれば、この処理は、SetPositiveButtonhandler内でやるべきです。


リストデータの保存は、OnSaveInstanceStatePutSerializableで行い、OnCreateで、GetSerializableで取得します。

C#

1 public class MainActivity : Activity 2 { 3 private JavaList<IDictionary<string, object>> groupList; 4 private JavaList<IList<IDictionary<string, object>>> childList; 5 6 protected override void OnCreate(Bundle savedInstanceState) 7 { 8 base.OnCreate(savedInstanceState); 9 10 // Set our view from the "main" layout resource 11 SetContentView(Resource.Layout.Main); 12 13 ... 14 15 if (savedInstanceState != null) 16 { 17 groupList = savedInstanceState.GetSerializable(nameof(groupList)).JavaCast<JavaList<IDictionary<string, object>>>(); 18 childList = savedInstanceState.GetSerializable(nameof(childList)).JavaCast<JavaList<IList<IDictionary<string, object>>>>(); 19 } 20 else 21 { 22 groupList = new JavaList<IDictionary<string, object>>(); 23 childList = new JavaList<IList<IDictionary<string, object>>>(); 24 25 ... 26 } 27 28 SimpleExpandableListAdapter adapter = new SimpleExpandableListAdapter( 29 this, 30 groupList, 31 Android.Resource.Layout.SimpleExpandableListItem1, 32 new string[] { "GROUPE_TITLE" }, 33 new int[] { Android.Resource.Id.Text1 }, 34 childList, 35 Android.Resource.Layout.SimpleExpandableListItem2, 36 new string[] { "CHILD_TITLE" }, 37 new int[] { Android.Resource.Id.Text2 } 38 ); 39 memolist.SetAdapter(adapter); 40 41 ... 42 } 43 44 protected override void OnSaveInstanceState(Bundle outState) 45 { 46 base.OnSaveInstanceState(outState); 47 48 outState.PutSerializable(nameof(groupList), groupList.JavaCast<ISerializable>()); 49 outState.PutSerializable(nameof(childList), childList.JavaCast<ISerializable>()); 50 } 51 }

投稿2018/10/22 05:19

編集2018/10/31 07:45
f-miyu

総合スコア1625

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

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

sezaki_H

2018/10/29 02:42 編集

groupListの型はJavaListになっていましたが、うまくいきませんでした。。。
f-miyu

2018/10/29 02:40

回答のコードを修正しました
sezaki_H

2018/10/29 02:45

ありがとうございます!返信をお持ちしている間に自己解決できました。 このコードでもトーストが出るだけでグループが追加されないのですが、どこのコードに問題があるか分かりますか?
f-miyu

2018/10/29 02:57

ExpandableListViewを使っているActivityのコード全体を記載してもらえますか?
sezaki_H

2018/10/29 03:06

質問文に追記しました。よろしくお願いします<m(__)m>
f-miyu

2018/10/29 03:18

記載されたソースだとgroupListがJavaListになっていないようですが。
sezaki_H

2018/10/31 02:30 編集

すいませんElementの方を見ていました(汗)。groupListをJavaListにしたところグループの追加はできました。ありがとうございます。追加されたグループを展開しようとすると、index:1 size:1というエラーが出るのですがこれの原因は分かりますでしょうか?
f-miyu

2018/10/29 07:37 編集

空のリストでいいので、childListにも追加する必要があります。 また、childListもJavaListにしてください。 childList.Add(new JavaList<IDictionary<string, object>>());
sezaki_H

2018/10/31 02:30

できました!ありがとうございます。あと、親リストの名前が表示されてないのですがこれはなぜでしょう?
f-miyu

2018/10/31 02:54

newGroupElementのキーを適当に、GROUPE_LISTにしましたが、実際に使っているGROUPE_TITLEに変えてください
sezaki_H

2018/10/31 03:10

ありがとうございます。次から次へと申し訳ないのですが、アダプターの更新は行っているのですがリスト追加後に画面遷移すると新しく作ったリストが消えてしまいます。どうしたらよいでしょうか?
f-miyu

2018/10/31 04:08

MainActivityが破棄されて、再作成されている状態でしょうか? そうであるなら、OnSaveInstanceStateでリストデータを保存しておけばいいです。
sezaki_H

2018/10/31 05:13

すいません、調べたのですがOnSaveInstanceStateの使いかたがうまくわかりませんでした...
f-miyu

2018/10/31 07:11

やり方を追記しました
sezaki_H

2018/11/05 01:33

ありがとうございます。ですが解決できませんでした。。。 それと、また別の問題なのですが、データベースを使用していない状態ではアプリ再起動時のリスト保持は難しいでしょうか?
f-miyu

2018/11/05 03:08 編集

解決できないとなると、遷移して戻ってきたときに、OnCreateが呼ばれている訳ではないのでしょうか? リストの保存に関しては、リストデータをシリアライズしてSharedPreferencesに保存でもなんとかなります。
sezaki_H

2018/11/07 02:20

調べてみました。なるほど、初期値で再生成されてるということですかね? OnResumeを使用すればよいのでしょうか?
f-miyu

2018/11/07 04:26 編集

再生成されているのであれば、上記のやり方で大丈夫なはずです。それでダメというならば、再生成されている訳ではないということになるのですが、それであっていますか? MainActivityが消えない限り、何もしないでリストが初期化されるとは考えづらいです。 もしかして、戻るのではなくMainActivityに再度遷移していたりしていませんか?それだと初期化されて当然です。
sezaki_H

2018/11/07 04:38

おっしゃる通り再遷移していました(汗)。 すいません、ありがとうございます。お騒がせしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問