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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

1825閲覧

android studioでリストビュー画面でアラート画面を表示し、ボタンを押すと別のイベントが発生してしまいます

matsutake

総合スコア34

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2017/10/09 10:11

現在、android studioでアプリを作成しております。
画面上にスピナーとリストビューを配置し、スピナーの切り替えにより、リストビューの表示を切り替えるということをしております。
その中でリストビューの項目をタップすると選択した項目のを編集する画面に遷移し、項目を長押しするとアラート画面を表示し、削除できるようにしたいと思っているのですが、アラート画面でボタンをタップするとリストビューの項目をタップした時の処理が走ってしまい、項目の編集画面に遷移してしまいます。
だだづくりではありますがコードを記載させて頂きます。
アドバイスをお願いいたします。

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.add_products); dbAdapter = new DBAdapter_Genre(this); dbAdapter.openDB(); // DBの読み込み(読み書きの方) spinner = (Spinner)findViewById(R.id.products_Spinner01); // ArrayListを生成 items = new ArrayList<>(); // DBのデータを取得 String[] columns = {DBAdapter_Genre.COL_GENRE}; // DBのカラム:品名 Cursor c = dbAdapter.getDB(columns); if (c.moveToFirst()) { do { items.add(c.getString(0)); Log.d("取得したCursor:", c.getString(0)); } while (c.moveToNext()); } c.close(); dbAdapter.closeDB(); // DBを閉じる ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, items); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // spinner に adapter をセット spinner.setAdapter(adapter); // リスナーを登録 spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { // アイテムが選択された時 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { Spinner spinner = (Spinner) parent; item = (String) spinner.getSelectedItem(); dbAdapter_products = new DBAdapter_Products(getApplicationContext()); dbAdapter_products.openDB(); // DBの読み込み(読み書きの方) mListViewProducts = (ListView) findViewById(R.id.listview_pro); // 各部品の結び付け // ArrayListを生成 items_products = new ArrayList<>(); String column = "genre"; //検索対象のカラム名 String[] name = {item}; //検索対象の文字 // DBのデータを取得 String[] columns_products = {DBAdapter_Products.COL_PRODUCTS}; // DBのカラム:品名 Cursor c_pro = dbAdapter_products.getDB(columns_products, column, name); if (c_pro.moveToFirst()) { do { items_products.add(c_pro.getString(0)); Log.d("取得したCursor:", c_pro.getString(0)); } while (c_pro.moveToNext()); } c_pro.close(); dbAdapter_products.closeDB(); // DBを閉じる // ArrayAdapterのコンストラクタ // 第1引数:Context // 第2引数:リソースとして登録されたTextViewに対するリソースID 今回は元々用意されている定義済みのレイアウトファイルのID // 第3引数:一覧させたいデータの配列 adapter_products = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, items_products); mListViewProducts.setAdapter(adapter_products); //ListViewにアダプターをセット(=表示) // ArrayAdapterに対してListViewのリスト(items)の更新 adapter_products.notifyDataSetChanged(); mListViewProducts.setOnItemClickListener(new AdapterView.OnItemClickListener(){ public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // // 選択された項目 String selectedItemStr = (String)mListViewProducts.getItemAtPosition(position); Intent intent = new Intent(getApplicationContext(), AddProductsItem.class); // インテントにセット intent.putExtra("mode","1"); intent.putExtra("genre", item); intent.putExtra("products", selectedItemStr); // Activity をスイッチする startActivity(intent); } }); //リスト項目が長押しされた時のイベントを追加 mListViewProducts.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) { // アラートダイアログ表示 AlertDialog.Builder builder = new AlertDialog.Builder(AddProducts.this); builder.setTitle("削除"); builder.setMessage("削除しますか?"); // OKの時の処理 builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // // IDを取得する // myListItem = items.get(position); // int listId = myListItem.getId(); // 選択された項目 String selectedItemStr = (String)mListViewProducts.getItemAtPosition(position); dbAdapter_products.openDB(); // DBの読み込み(読み書きの方) dbAdapter_products.selectDelete(item, selectedItemStr); // DBから取得したIDが入っているデータを削除する Log.d("Long click : ", selectedItemStr); dbAdapter_products.closeDB(); // DBを閉じる // loadMyList(); } }); builder.setNegativeButton("キャンセル", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); // ダイアログの表示 AlertDialog dialog = builder.create(); dialog.show(); return false; } }); } // アイテムが選択されなかった public void onNothingSelected(AdapterView<?> parent) { // } }); }

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

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

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

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

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

guest

回答1

0

ベストアンサー

※直接の回答ではありません。

AlertDialogのOKボタンをタップすると、背後にもともと表示されていたListViewの項目がタップされたイベントで通知される、とのことでしたので、本当にそうであればこれまで私が作成したアプリにも影響があるかもしれないと思い、別途作ってみたサンプルで検証してみました。ですが、同じ問題は再現せず、AlertDialogのOKボタンを押してもListViewにはイベントは通知されませんでした。(期待している動作です)

matsutake様の作られたアプリとは違うので確証は得られないのですが、問題を少し正確に書くと、
AlertDialogonClickで、mListViewProducts.setOnItemClickListenerでセットしたOnItemClickListeneronItemClickが呼ばれてしまう、と言うことで正しいでしょうか。

アプリで使用しているAPIレベルや、実行しているAndroid実機のバージョン等を示していただけますと、他の回答者様からも良い回答が得られるかもしれません。import しているものや、AndroidManifest.xmlの内容も場合によっては解決のヒントになります。

ActivityとAlertDialogの違いがあるかと思い、以下を変えてみましたが結果は同じ(期待しているように動く)でした。具体的には以下を

Java

1import android.app.Activity; 2import android.app.AlertDialog;

以下のようにしても同じでした。

Java

1import android.support.v7.app.AppCompatActivity;2import android.support.v7.app.AlertDialog;

ひとつ気になったところとしては、matsutake様のコードの以下の部分で、ArrayAdapterのコンストラクターにgetApplicationContext を指定しているところでした。

Java

1adapter_products = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, items_products);

これは私の方のListViewでは期待するように表示できなかったので、MainActivityのContextにしています。

Java

1// 例 2mListViewAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, list);

確証はありませんが、ここが原因かもしれません。matsutake様のコードでは以下のようになると思います。動作が変わってしまうかもしれませんが。

Java

1// AddProducts.this がActivity、と仮定して 2adapter_products = new ArrayAdapter<String>(AddProducts.this, android.R.layout.simple_list_item_1, items_products);

どうしても原因が分からず直らないような場合は、消極的な案ですが、ダイアログが消えた直後のListViewのイベントはスキップする、とのような処理で回避することも考えられます。

投稿2017/10/10 09:38

dodox86

総合スコア9183

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

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

matsutake

2017/10/12 10:24

dodox86様。 丁寧なご回答、ありがとうございます。 また、返信が遅くなり大変申し訳ございませんでした。 内容をご確認させて頂きまして、改めてコメントをさせて頂きます。
matsutake

2017/10/12 11:03 編集

dodox86様。 その後、改めて動作を確認してみたのですが、「AlertDialog」の「OnClick」の後に「mListViewProducts.setOnItemClickListener」でセットした「OnItemClickListener」の「onItemClick」が呼ばれてしまうとお伝えいたしましたが、実際は「AlertDialog」の「OnClick」の前に「mListViewProducts.setOnItemClickListener」でセットした「OnItemClickListener」の「onItemClick」が呼ばれてしまうようです。 ListViewのセルを長押しした時点で移動してしまいます。
dodox86

2017/10/13 09:25 編集

同じ状況が再現できないので想像ですが、回答にも書かせてもらった、adapter_products = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, items_products);のgetApplicationContext()をActivityのContextのAddProducts.this に変更してもダメですか?もうひとつのArrayAdapterと違うのは、何か理由があるのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問