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

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

ただいまの
回答率

88.80%

外部ストレージの画像をList表示する方法

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 661

anz0527

score 13

Java初心者のため、至らないところもあるかと思いますがお願いいたします。
現在、DBのデータを一覧表示するアプリを作成中です。
一覧画面は、以下の通りです。
イメージ説明
パエリアの画像のところは、現在DBを参照せずに同じ画像を表示しているのですが
これを、DBに持っているストレージの画像URLを参照するように変えたいと思っています。
URLの形式は、/storage/emulated/0/DCIM/Camera/07225037.jpgというような持ち方をしています。

imageView.setImageURIを利用するというところまでは、わかったのですがそれに設定するURI形式のデータを
画像URLからどのように作成すれば良いのかかわりません。

また、ソースのように設定した場合毎回画像が再設定されて全て同じ画像になったりしないのでしょうか?
二つ目の疑問は、自分で確認できていないので質問するのはおこがましいんですが、もしよければ教えていただきたいです。

以上、よろしくお願いいたします。

package com.example.may.favorite;


import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.database.Cursor;
import android.location.LocationListener;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.content.FileProvider;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.content.Intent;
import android.Manifest;
import android.content.pm.PackageManager;
import android.provider.Settings;
import android.support.v4.app.ActivityCompat;
import android.location.*;
import java.math.BigDecimal;
import android.widget.ImageView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;


/**
 * ListView表示画面に関連するクラス
 * SelectSheetListView
 */
public class SelectSheetListView extends AppCompatActivity implements
        LocationListener {

    private DBAdapter dbAdapter;
    private MyBaseAdapter myBaseAdapter;
    private List<MyListItem> items;
    private Button mbutton_new;
    private ListView mListView03;
    private double dLong;                       // 経度
    private double dLat;                        // 緯度
    private ImageView imageView;
    private Uri ImageUri;
    protected MyListItem myListItem;

    private final static int REQUEST_PERMISSION = 1002;

    // 参照するDBのカラム:ID,店名,経度,経度,単価の全部なのでnullを指定
    private String[] columns = null;

    @SuppressLint("MissingPermission")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.select_sheet_listview);

        // Fine か Coarseのいずれかのパーミッションが得られているかチェックする
        // 本来なら、Android6.0以上かそうでないかで実装を分ける必要がある
        //位置情報のパーミッション
        (省略)

        //画像のパーミッション
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.READ_EXTERNAL_STORAGE)) {
            ActivityCompat.requestPermissions(SelectSheetListView.this,
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                    REQUEST_PERMISSION);

        } else {
            Toast toast = Toast.makeText(this,
                    "許可されないとアプリが実行できません",
                    Toast.LENGTH_SHORT);
            toast.show();

            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,},
                    REQUEST_PERMISSION);
                    return;
        }

       (省略)

        // 新規作成ボタンの結びつけ
        mbutton_new = (Button) findViewById(R.id.button_new);

        // ListViewの結び付け
        mListView03 = (ListView) findViewById(R.id.listView03);

        loadMyList();   // DBを読み込む&更新する処理

        // 新規作成ボタン押下時処理
        mbutton_new.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplication(), Create.class);
                startActivity(intent);

            }
        });

        // 行を長押しした時の処理
        (省略)

    /**
     * DBを読み込む&更新する処理
     * loadMyList()
     */
    private void loadMyList() {

        //ArrayAdapterに対してListViewのリスト(items)の更新
        items.clear();

        dbAdapter.openDB();     // DBの読み込み(読み書きの方)

        // DBのデータを取得
        Cursor c = dbAdapter.getDB(columns);

        if (c.moveToFirst()) {
            do {
                // MyListItemのコンストラクタ呼び出し(myListItemのオブジェクト生成)
                myListItem = new MyListItem(
                        c.getInt(0),
                        c.getString(1),
                        c.getString(2),
                        c.getString(3),
                        c.getString(4),
                        c.getString(5));

                Log.d("取得したCursor(ID):", String.valueOf(c.getInt(0)));
                Log.d("取得したCursor(店名):", c.getString(1));
                Log.d("取得したCursor(経度):", c.getString(2));
                Log.d("取得したCursor(経度):", c.getString(3));
                Log.d("取得したCursor(コメント):", c.getString(4));
                Log.d("取得したCursor(画像PATH):", c.getString(5));

                items.add(myListItem);          // 取得した要素をitemsに追加

            } while (c.moveToNext());
        }
        c.close();
        dbAdapter.closeDB();                    // DBを閉じる
        mListView03.setAdapter(myBaseAdapter);  // ListViewにmyBaseAdapterをセット
        myBaseAdapter.notifyDataSetChanged();   // Viewの更新

    }

    /**
     * BaseAdapterを継承したクラス
     * MyBaseAdapter
     */
    public class MyBaseAdapter extends BaseAdapter {

        private Context context;
        private List<MyListItem> items;

        // 毎回findViewByIdをする事なく、高速化が出来るようするholderクラス
        private class ViewHolder {
            TextView text05ShopNm;
            TextView text05Distance;
            TextView text05Comment;
        }

        // コンストラクタの生成
        public MyBaseAdapter(Context context, List<MyListItem> items) {
            this.context = context;
            this.items = items;
        }

        // Listの要素数を返す
        @Override
        public int getCount() {
            return items.size();
        }

        // indexやオブジェクトを返す
        @Override
        public Object getItem(int position) {
            return items.get(position);
        }

        // IDを他のindexに返す
        @Override
        public long getItemId(int position) {
            return position;
        }

        // 新しいデータが表示されるタイミングで呼び出される
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            View view = convertView;
            ViewHolder holder;

            // データを取得
            myListItem = items.get(position);


            if (view == null) {
                LayoutInflater inflater =
                        (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                view = inflater.inflate(R.layout.row_sheet_listview, parent, false);

                TextView text05ShopNm = (TextView) view.findViewById(R.id.text05ShopNm);      // 店名のTextView
                TextView text05Distance = (TextView) view.findViewById(R.id.text05Distnce);    // 距離のTextView
                TextView text05Comment = (TextView) view.findViewById(R.id.text05Comment);    // コメントのTextView
                imageView = findViewById(R.id.image_view);                                    //画像

                // holderにviewを持たせておく
                holder = new ViewHolder();
                holder.text05ShopNm = text05ShopNm;
                holder.text05Distance = text05Distance;
                holder.text05Comment = text05Comment;
                view.setTag(holder);

            } else {
                // 初めて表示されるときにつけておいたtagを元にviewを取得する
                holder = (ViewHolder) view.getTag();
            }

            //距離取得
            float[] results = new float[3];
            Location.distanceBetween(Double.parseDouble(myListItem.getLat()), Double.parseDouble(myListItem.getLat()), dLong, dLat, results);
            BigDecimal dist = new BigDecimal(results[1]);
            dist = dist.setScale(1, BigDecimal.ROUND_HALF_UP);

            // 取得した各データを各TextViewにセット
            holder.text05ShopNm.setText(myListItem.getShopNm());
            holder.text05Distance.setText(dist + "km");
            holder.text05Comment.setText(myListItem.getComment());
            ImageUri = FileProvider.getUriForFile(
                    SelectSheetListView.this,
                    getApplicationContext().getPackageName() + ".fileprovider",
                    myListItem.getImage());
            imageView.setImageURI(ImageUri);





            return view;

        }
    }

    //位置情報が通知されるたびにコールバックされるメソッド
    (省略)
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

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

  • ただいまの回答率 88.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る