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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Q&A

解決済

2回答

1163閲覧

リストビュー項目削除出来ない。

EveryoneCanEat

総合スコア35

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

0グッド

0クリップ

投稿2019/10/09 23:46

編集2019/10/10 07:08

お世話になっております。Android開発初心者です。

リストビュー項目が削除出来ません。

ビルド後、リストビュー項目を長押しした際、一瞬のみ、項目がリストから消えますが、その後すぐにまた復活して、項目を短く押した際にインテントで遷移する次の項目の詳細画面に処理が進み、長押しした項目自体も削除されておりません。

以下が私のコードです。

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import android.widget.ArrayAdapter;
import android.widget.AdapterView;
import android.widget.ListView;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class complist extends Activity {

private /*丙プロジェクトとアプリ名*/SimpleDatabaseHelper_bo1 helper = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.complist_layout); Integer pcontentid = 0; String ptime = null; String pname = null; String stringid = null; if (helper == null) { helper = new SimpleDatabaseHelper_bo1(complist.this); } final ArrayList<HashMap<String, String>> datalist1 = new ArrayList();

// ArrayList datalist1 = new ArrayList();

SQLiteDatabase db1 = helper.getReadableDatabase(); try { Cursor c3 = db1.rawQuery("SELECT * FROM "/*丙データベーステーブル名*/", null); boolean next = c3.moveToFirst(); while (next) { HashMap<String, String> data = new HashMap<>(); pcontentid = c3.getInt(0); ptime = c3.getString(1); pname = c3.getString(2); stringid = String.valueOf(pcontentid); data.put("ID", stringid); data.put("Time", ptime); data.put("Subject",pname); datalist1.add(data); next = c3.moveToNext(); } c3.close(); }catch (Exception e){ TextView error = (TextView)findViewById(R.id.textview_error); error.setText(getString(R.string.not_yet)); } finally { db1.close(); } final ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, datalist1); final ListView listView1 = (ListView) findViewById(R.id.listview1); listView1.setAdapter(adapter); listView1.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){ @Override public boolean onItemLongClick(AdapterView<? >parent, View view, int position, long id){ /* HashMap<String, String> map1 = (HashMap<String, String>)listView1.parentAdapter.getItemAtPosition(position); String value1 = map1.get("ID"); String value2 = map1.get("Time"); String value3 = map1.get("Subject"); try { String item = (String)map1.get(position); }catch (Exception e){ } */ String item1 = (String)parent.getItemAtPosition(position) ; datalist1.remove(item1); adapter.notifyDataSetChanged(); return false; } }); listView1.setOnItemClickListener(new AdapterView.OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> av, View view, int position, long id){ String get_id2 = String.valueOf(id + 1); Intent intent4 = new Intent(complist.this, user.win.hope.a_box_to_complain.compdisp.class); intent4.putExtra("did2",get_id2); startActivity(intent4); } }); }

}

項目を削除する前にダイアログも表示させたいのですが、項目自体が削除されないので、次に進めずにとても困っております。

もし、解決方法がお解りでいらっしゃいましたら、ご教授の程、宜しくお願い申し上げます。

追伸

今回のArraylistの項目にデータベースのデータを使用しており、短いクリックで項目の詳細画面にIntentしているのですが、その詳細画面で再び、データベースを開いて各々のデータを表示しております。

ただのlistなら、adapter.removeで削除出来ても、データベースのデータを使う場合は、データベース自体のカラムも削除しなければならないのでしょうか…?


2019/10/10 PM12:40頃

長押しで押されたitemを取得するときに、エラーで型が違うと表示されます。

HashMapを使っているので、keyとvalueの2つが必要なのに、無理やりStringでキャストしておりましたので、そこが問題でしょうか…?

現在、HashMapを使用せずにデータベースから項目のみ取得してリストビューに渡せるかどうか、試しております。

String item = (String)adapter.getItem(position)

のitemは「never used」と警告が出ております。


2019/10/10 PM13:25頃

HashMapを使わないで試してみましたが、うまくいきませんでした。

itemにデータが入ってきてないのは、間違ったキャストをしているからですよね…?

キャストのExceptionがlogcatで出ておりますので、データのキャストをどうすれば良いのか、もし、お解りでいらっしゃいましたら、ご教授の程、お願い申し上げたい次第です。

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

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

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

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

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

jimbe

2019/10/10 06:56

コードは一部ではなく、出来るだけ全体をご提示ください. 行っている処理がどのメソッド内にあるかや, 実行される個所によって原因が異なる場合があります. また, コードはコード用の表記があります. "`"(バッククオート, SHIFT+@)を3つ並べた ``` という行をコードの上下に置くと, 専用の枠内にインデントも反映されて表示されますので, ご利用ください. (プレビューで確認できます.)
EveryoneCanEat

2019/10/10 06:58

本当にありがとうございます。 直ぐにコード全体を掲載致します。
EveryoneCanEat

2019/10/10 07:16

申し訳ありません。インデント出来ませんでした。 読んで下さるお気持ちだけで、本当に有難いです、本当ありがとうございます。
EveryoneCanEat

2019/10/10 07:17

コードを入れ替え致しました。
EveryoneCanEat

2019/10/10 07:26

海外のサイトも沢山調べましたが、どう、あがいても、長押ししたリスト項目が復活してしまいます。 ご多忙でお疲れの中、誠にありがとうございます。
guest

回答2

0

ベストアンサー

Adapter のデータの削除は Adapter.remove であっています.
また, Adapter に特に設定していなければ, Adapter.remove 内で notifyDataSetChanged も呼ばれますので別途の呼び出しは不要です.

一瞬削除されてから再度表示されるのでしたら, 削除処理後に再度データベースを読む処理がどこかで行われている可能性があります.
さらには, 削除処理がDBから「行」(カラムでは無いですよね?)を削除することを意味するのであれば, 当然 adapter からの削除だけでなくDBデータの削除を実装・実行しなければなりません.
ご提示のコードにはDBの行の削除は見当たりませんので, adb で確認せずとも, 行は削除されていないと思います.

長押しで押されたitemを取得するときに、エラーで型が違うと表示されます。
String item = (String)adapter.getItem(position)

この場合 getItem の戻りの型は HashMap<String,String> ではないでしょうか.

HashMap<String,String> item = (HashMap<String,String>)adapter.getItem(position)

とされては如何でしょう.

のitemは「never used」と警告が出ております。

使われていませんので当然です.
すぐに使う予定が無いのでしたら, コメント化しておけば良いかと思います.


String item1 = (String)parent.getItemAtPosition(position) ; datalist1.remove(item1); adapter.notifyDataSetChanged();

は単に

adapter.remove(parent.getItemAtPosition(position));

では如何でしょうか.

投稿2019/10/10 16:09

編集2019/10/10 16:15
jimbe

総合スコア12646

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

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

EveryoneCanEat

2019/10/10 22:54

的を得たご教授、誠にありがとうございます。 ご教授の通り、リストからのデータ削除は、一行のみで済みました。 ただ、データベースの行の削除が出来ません。 db.deleteで、レコードの削除を試みておりますが、全く削除されません。 未だ、解決に至らず、誠に申し訳ありません。
EveryoneCanEat

2019/10/10 23:05

listView1.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){ @Override public boolean onItemLongClick(AdapterView<? >parent, View view, int position, long id){ int dbid = (int)id + 1; adapter.remove(parent.getItemAtPosition(position)); SQLiteDatabase db1 = helper.getWritableDatabase(); try { db1.delete("/*丙テーブル名前*/", "id = " + dbid, null); }catch (Exception e){ } finally { db1.close(); } return true; } }); こちらが該当コードです。
EveryoneCanEat

2019/10/11 00:02 編集

本当に、ありがとうございます!! 削除出来ました!! リストからの削除とデータベースのレコードの削除両方、出来ました!! deleteのwhereの部分のidを、"id"から"_id"に変更したら、レコードが削除出来ました!! 長押しでちゃんとデータが消えるようになりました。 問題がまだ1つ残っておりますが(削除したidの次のデータベースの中身が消えている)これは何とか自分で解決していくしかありません。 貴重なお時間を頂き、温かいお心遣いを頂きまして、本当にありがとうございました。 -------------------------------------- 削除したidの次のidのレコードの中身が消えている問題につきまして。 おそらく、sqliteのオートインクリメントで、削除したidの部分に次のidが詰めて表示されて、中身が消えているように見えたのではないか、と、推測致します。 あとは、自分で調べて、やっていきます。
guest

0

「datalist1.remove(position);」も「adapter.notifyDataSetChanged();」の前に必要な気がします。

投稿2019/10/10 03:04

jun74

総合スコア338

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

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

EveryoneCanEat

2019/10/10 03:37

ご教授、誠にありがとうございます。 おっしゃる通りに、datalist1の削除も追加してビルド致しましたが、未だダメです、一瞬、リストビューから消えるのみで、すぐに復活してしまいます、、。
jun74

2019/10/10 03:46 編集

上記の処理はonCreateの中ですよね? Activityを再表示したときの処理にListViewのセット処理があるとだめですが。。
EveryoneCanEat

2019/10/10 03:46

はい、勿論です。
EveryoneCanEat

2019/10/10 03:48

今、追伸の後に、現状について追加書き込みを致しましたが、どうやら、HashMapを使っておりますので、keyとvalueの2つが必要なのに、Stringでキャストしておりますので、そこが問題なのではないでしょうか…?
EveryoneCanEat

2019/10/10 03:50

申し訳ありません。 >Activityを再表示したときの処理にListViewのセット処理があるとだめですが。。 こちらにつきまして、詳しくご教授頂けませんでしょうか…?
jun74

2019/10/10 03:54

onResumeなどでも「listView1.setAdapter(adapter);」を行うことは可能なので。 onCreateで行っているなら関係ないです。
EveryoneCanEat

2019/10/10 04:02

別にスレッドを走らせてadapterをセット出来る、ということでしょうか…? 勉強不足でおりまして、ライフサイクルにつきましても勉強は致しましたが、別スレッドを走らせる方法とか、その必要な場合ですとか、未だ自分でちゃんと理解出来てないと存じ上げます。
jun74

2019/10/10 09:13

datalist1.remove(item1);をdatalist1.remove(position);としても駄目でしたか?
EveryoneCanEat

2019/10/10 09:18

はい、ダメでした。何度も試しました。 本当にありがとうございます。
EveryoneCanEat

2019/10/10 09:21

データベースのデータ自体を削除しないとダメなのではないか、と、思いまして、 今、android studioのターミナルから、データベーステーブルの該当カラムが削除されているのかどうか、確認する為に、sqliteのzipを解凍しようと存じ上げます。
jun74

2019/10/10 09:36

AndroidManifest.xmlの全文見せて貰えませんか?
EveryoneCanEat

2019/10/10 09:45

はい、直ぐに掲載致します。 今、sqliteのパスを通す為に、システム環境変数の設定を変更致しまして、今、再起動中ですので、立ち上がったら直ぐに、マニフェストも掲載致します。
EveryoneCanEat

2019/10/10 09:54

すみません、windowsの更新プログラムで、時間がかかっております。本当に申し訳ありません。 もっと早くから、adbコマンドを使えるようにしておかなければならなかったです。 selectを使えば済むことですが、開発作業の効率を考えれば、直ぐにsqliteをターミナルで見られるようにしておくべきでした。
EveryoneCanEat

2019/10/10 10:07

本当に申し訳ありません!! 未だ、更新プログラムが、21%です。 台風が来ますので、本当にお気をつけ下さいませ!! 水と電源の確保、食糧等、たかをくくるのが一番、危ないです。 ご心配、有難いですが、台風には本当に、お気をつけて下さいませ、m(__)m!!
jun74

2019/10/10 10:09

結果以外のコメントは控えてください。いちいち通知が来ますので。。
EveryoneCanEat

2019/10/10 12:00 編集

windowsが立ち上がりました。 ここで、Manifiest なんて、全く関係ありませんよね…?初心者の私でも解かります。 お約束ですから、Manifest を掲載致しますが、 私は、真剣に仕事に取り組んでおります。 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="/*丙パッケージとアプリ名*/"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER"/> <intent-filter> </activity> <activity android:name=".クラス1"> <intent-filter> <action android:name="android.intent.action.クラス1"/> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter </activity <activity> クラス2 </activety> <activety> クラス3 </activity> クラス4 . . . </application> </manifest>
jun74

2019/10/10 11:53 編集

intent4のActivityにandroid:launchMode="singleTask"などでシングルタスクと宣言されてたらMainActivityは閉じられて、またonCreateから動いてしまうので確認したかったのですが、intent4のActivityの定義がないような。。 こちらも真剣に考えているのですが。。
EveryoneCanEat

2019/10/10 12:08

申し訳ありませんでした。ただ、今回の問題につきまして、どうやら、データベースのカラムの削除が必要なのではないか、と、思いまして、必死で調べてお勉強させて頂いております。 私事ですが、周り道は出来ない状況でして、早急にこちらのエラーを解決すべく、もし、解決に繋がるご教授がございましたら、お教えの程、宜しくお願い申し上げます。 お付き合い頂き、誠にありがとうございます。
jun74

2019/10/10 12:18

データベースの削除は削除確認ダイアログ表示してから普通消すので、先に消さなくても実現出来るはずです。 startActivity(intent4);をコメント化しても結果変わりませんか?
EveryoneCanEat

2019/10/10 12:36

試してみます。 早朝から、晩まで、お付き合い頂きまして、ただでさえ、有難いのに やってみます。本当にありがとうございます。
EveryoneCanEat

2019/10/10 12:49

試してみましたが、ダメでした。 一瞬、リストから消えたように見えますが、やはりデータ自体は削除されておりません。 そのクリックしたidのデータベースのカラムを全て、削除しないと解決しないように思えます。 windowsは起動したのですが、adbも使えるようになっておりません。 それにつきましても、原因を探ってみます。 本当に、貴重なお時間頂きまして、誠にありがとうございます。
jun74

2019/10/10 12:59

お役に立てず申し訳ないです。 ちなみに adapter.notifyDataSetChanged(); return false; は return true; にすると短く押した処理が続けて動くことはなくなるはずです。
EveryoneCanEat

2019/10/10 13:11

それは重要な情報です!! 何故、long click と、短いclickが、同時に実行されてしまうのが、疑問でした。 本当、貴重なお時間を頂きまして、助けて頂きまして、誠にありがとうございました。 どうか、ご無理はなさらず、多方面におきまして、お気をつけ下さいませ。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問