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

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

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

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

Android Studio

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

Q&A

解決済

1回答

2771閲覧

複数の項目がセットされているListViewから特定の項目を抜き出したい

tery0203

総合スコア12

Java

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

Android Studio

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

0グッド

0クリップ

投稿2019/02/17 15:10

お世話になります。
初投稿かつ勉強中の初心者のため質問をうまくまとめられていないかもしれませんがお許しください。

Android Studioを使ってアプリ開発を行なっています。
今回は本体のストレージから画像を参照し、サムネイルとタイトルをListViewで表示するアプリを作成しました。
次はそのListViewをタップすると別画面(今回だとSubActivity)へ遷移し全画面表示出来るようにしたいのですが、複数の項目がセットされているListViewからうまく画像の情報が抜き出せず、実行はできるのですがアプリが落ちてしまいます。

複数の項目が入っているListViewのアダプタから画像の情報を抜き出し、別のインテントへ渡す処理をご教授ください。

該当のソースコード

MainActivity

1---OnCreateでのアクセス許可等は省略---- 2 3 public void startImageViewer() { 4 5 // レイアウトからリストビューを取得 6 final ListView listView = (ListView)findViewById(R.id.list_view); 7 // リストビューに表示する要素を設定 8 mListItems = new ArrayList<>(); 9 10 // 画像情報の取得 11 ContentResolver resolver = getContentResolver(); 12 final Cursor cursor = resolver.query( 13 MediaStore.Images.Media.EXTERNAL_CONTENT_URI, // データの種類 14 null, // 項目(null 全項目) 15 null, // フィルタ条件(null フィルタなし) 16 null, // フィルタ用パラメータ 17 null // ソート 18 ); 19 Log.v("MEDIA", Arrays.toString(cursor.getColumnNames())); // 項目名一覧 20 Log.v("MEDIA", "Image files = " + cursor.getCount()); // 取得件数 21 if (cursor.moveToFirst()) { 22 String info; 23 try { 24 do { 25 info = "TITLE : " + cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.TITLE)); 26 info += "\nPATH : " + cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)); 27 28 int fieldIndex = cursor.getColumnIndex(MediaStore.Images.Media._ID); 29 Long id = cursor.getLong(fieldIndex); 30 31 Uri uri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI , id); 32 mBmp = MediaStore.Images.Media.getBitmap(getContentResolver(), uri); 33 SetListview item = new SetListview(mBmp, info); 34 35 mListItems.add(item); 36 } while (cursor.moveToNext()); 37 }catch (IOException e) { 38 System.err.println(e.getMessage()); 39 } 40 } 41 cursor.close(); 42 // 出力結果をリストビューに表示 43 // ListView内にサムネイルとタイトルを表示するためにListAdapter.javaに渡す 44 ListAdapter adapter = new ListAdapter(this, R.layout.listview_layout, mListItems); 45 listView.setAdapter(adapter); 46 47 //クリックした画像の表示 48 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 49 @Override 50 public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 51 //インテントの作成 52 Intent intent = new Intent(MainActivity.this, SuBActivity.class); 53 //データをセットする。デバッグだとここの行のせいでアプリが落ちている 54 String currentId = cursor.getString(cursor.getColumnIndex("mBmp")); 55 56 intent.putExtra("sendText",currentId); 57 //遷移先の画面を起動 58 startActivity(intent); 59 } 60 }); 61 };

SubActivity

1 2public class SubActivity extends AppCompatActivity { 3 4 @Override 5 protected void onCreate(Bundle savedInstanceState){ 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.imageview_activity); 8 9 Intent intent = this.getIntent(); 10 String image = intent.getStringExtra("sendText"); 11 Uri uri = Uri.parse(image); 12 ImageView imageview = (ImageView)this.findViewById(R.id.imageView); 13 imageview.setImageURI(uri); 14 15 16 } 17}

ListAdapter

1public class ListAdapter extends ArrayAdapter<SetListview> { 2 private int mResource; 3 private List<SetListview> mItems; 4 private LayoutInflater mInflater; 5 6 /** 7 * コンストラクタ 8 * @param context コンテキスト 9 * @param resource リソースID 10 * @param items リストビューの要素 11 */ 12 public ListAdapter(Context context, int resource, List<SetListview> items) { 13 super(context, resource, items); 14 15 mResource = resource; 16 mItems = items; 17 mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 18 } 19 20 @Override 21 public View getView(int position, View convertView, ViewGroup parent) { 22 View view; 23 24 if (convertView != null) { 25 view = convertView; 26 } 27 else { 28 view = mInflater.inflate(mResource, null); 29 } 30 31 // リストビューに表示する要素を取得 32 SetListview item = mItems.get(position); 33 34 // サムネイル画像を設定 35 ImageView thumbnail = (ImageView)view.findViewById(R.id.thumbnail); 36 thumbnail.setImageBitmap(item.getThumbnail()); 37 38 // タイトルを設定 39 TextView title = (TextView)view.findViewById(R.id.title); 40 title.setText(item.getTitle()); 41 42 return view; 43 } 44}

試したこと

String currentId = cursor.getString(cursor.getColumnIndex("mBmp"));
を追加した

『ローカル変数cursorは内部クラスからアクセスされます。finalで宣言される必要があります』というエラーが出たのでListView作成時の情報の取得に使用している
Cursor cursor = resolver.query(
の部分を
final Cursor cursor = resolver.query(
に書き換えた

コンパイルは通るようになったがリストをクリックすると落ちる

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

AndroidStudio3.2.1
Android8.0での動作を想定しています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

onItemClick 内の

java

1String currentId = cursor.getString(cursor.getColumnIndex("mBmp"));

の cursor は, クリックされて onItemClick が呼ばれた時点で既に cursor.close(); されています.

onItemClick 内でクリックされたデータを得る場合は, パラメータ int position を用いまして adapter.getItem(position) を呼ぶ等するのが良いかと思います.

その為に ListAdapter におきまして

java

1@Override 2SetListview getItem(int position) { 3 return mItems.get(position); 4}

等と追加が必要と思います.

投稿2019/02/18 09:14

jimbe

総合スコア12545

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

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

tery0203

2019/03/04 11:34

返信遅れまして申し訳ありません。回答ありがとうございました。 上記回答を元にListAdapterを編集し、パスを渡すことで解決いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問