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

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

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

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

Xamarin

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

Q&A

解決済

2回答

6743閲覧

listViewで選択を解除すると落ちてしまう

otaota

総合スコア30

C#

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

Xamarin

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

0グッド

0クリップ

投稿2016/12/30 04:16

###前提・実現したいこと
listViewを作って表示させただけだと、前回選択したものが選択されたままになってしまい、続けて同じものを選択できないので調べたところ、SelectedItemにnullを入れれば良いことがわかりました。

初めのうちはそれで問題なかったのですが、nullを代入する前に選択した項目によって処理を振り分ける命令を追加したところ、選択するたびに強制終了するようになってしまいました。

###発生している問題・エラーメッセージ

話を単純化するために、問題が起こるミニマムなクラスを添付しました。
// 3の行を入れることにより、選択したものがすぐに解除されるようになったのですが、//1の行を入れると強制終了してしまいます。ただし、//1と同じ処理をすると思われる//2の書き方だと問題なく動きました。
また、3の行をコメントアウトすると、//1の行も//2の行も同じ結果を返しました。(もちろん選択されたままになります)

今回の例だと//2の行の書き方で対処できるのですが、実際にはカスタムセルを使った処理をしたいと思っていて、以下のように書いているのですが、
問題が解決できません。どのような書き方をするのが正解でしょうか?

listView.ItemSelected += (sender, e) => { var select = (ListData)e.SelectedItem; if (select.Menu == MENU.E_CLOSE) { //なんらかの処理; } listView.SelectedItem = null; }

よろしくお願いします。

###該当のソースコード

using System; using System.Diagnostics; using System.Collections.Generic; using Xamarin.Forms; namespace MyCookie { public class TestPage : ContentPage { public TestPage() { Padding = new Thickness(20); var listView = new ListView { RowHeight = 40 }; listView.ItemsSource = new string[] { "Item1", "Item2", "Item3", "Item4", "Item5", }; listView.ItemSelected += (sender, e) => { Debug.WriteLine(e.SelectedItem.ToString()); // 1 //Debug.WriteLine( "" + e.SelectedItem); // 2 listView.SelectedItem = null; // 3 }; Content = listView; } } }

###試したこと
https://developer.xamarin.com/guides/xamarin-forms/user-interface/listview/interactivity/
には

((ListView)sender).SelectedItem = null;

という書き方をしていたのでこちらも試しましたが、結果は変わりませんでした。

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
Xamarin 6.1.3(build 19)
Mac Note Pro
OS X Yosemite(10.10.5)

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

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

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

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

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

guest

回答2

0

ベストアンサー

ListViewアイテムを選択した時のほかに、 listView.SelectedItem = null した時にも ListView.ItemSelected のイベントハンドラが呼ばれるので、 e.SelectedItem.ToString() がnullに対するToStoring()になってると思います。

イベントハンドラの冒頭で if(e.SelectedItem == null) return; するなりしてあげてください。

投稿2016/12/30 04:45

P3PPP

総合スコア359

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

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

otaota

2016/12/30 04:56

なるほど、nullを入れたときにも呼ばれてしまうのですね。 同時に//1の行がNGで//2の行がOKの理由も納得行きました。 ありがとうございます。
P3PPP

2016/12/30 06:57

また同じようなことがあったら、怪しい場所にブレークポイントを置いて変数の中身などを調査してみると捗ると思います。
guest

0

SelectedItemにnullを入れると、それでまたItemSelectedイベントが起きるので以下のようにnullの時は何もしないという処理をItemSelectedに入れる必要があります。これかな?

cs

1listView.ItemSelected += (s, e) => 2{ 3 if (e.SelectedItem == null) { return; } 4 // この続きに処理をかく 5};

投稿2016/12/30 04:27

okazuki0130

総合スコア185

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問