35464


サーバー(PC)にある画像を取得して、ListViewのimageに表示させたいのですが、  
ほんのたまにしか表示出来ません。  
権限は宣言済み  
サーバー側では200の成功と出ているので接続が失敗したとも考えられません。  
どなたかimageを表示させる方法が  
お分かりの方がいらっしゃいましたら  
教えていただきたいです。宜しくお願いします

[code]

    case R.id.navigation_notifications:
                String strJson = "[{\"id\": takesi, \"n_id\": \"123\", \"time\": 20},{\"id\": hana, \"n_id\": \"234\", \"time\": 21},{\"id\": risa, \"n_id\": \"345\", \"time\": 22}]";
    
                Gson gson = new Gson();
                Notification[] notification_array_type = gson.fromJson(strJson,Notification[].class);
    
                final ArrayList<listitem> notification_array = new ArrayList<>();
    
                for(Notification user : notification_array_type) {
                    listitem noti_item = new listitem("http://192.168.11.11/user_images/" + user.id + ".png",user.id);
                    Log.i("test","192.168.11.11/user_images/" + user.id + ".png : " + user.id);
                    notification_array.add(noti_item);
                }
    
                // 出力結果をリストビューに表示
                ListAdapter noti_adapter = new ListAdapter(MainActivity.this, R.layout.main_item, notification_array);
                mListView.setAdapter(noti_adapter);
                noti_adapter.notifyDataSetChanged();
                return true;
    
[/code]

listitem.java

[code]

    public class listitem {
        private Bitmap mThumbnail = null;
        private String mTitle = null;
    
        /**
         * 空のコンストラクタ
         */
        public listitem() {};
    
        /**
         * コンストラクタ
         * @param image_url サムネイル画像
         * @param title タイトル
         */
        public listitem(final String image_url, final String title) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        // URL設定
                        URL url = new URL(image_url);
                        // HTTP接続開始
                        HttpURLConnection c = (HttpURLConnection) url.openConnection();
                        c.setRequestMethod("GET");
                        c.connect();
                        // ダウンロード開始
                        InputStream is = c.getInputStream();
                        mThumbnail = BitmapFactory.decodeStream(is);
                        c.disconnect();
                    } catch (IOException e) {
                        Bitmap bmp = null;
                    }
                }
            }).start();
    
            mTitle = title;
        }
    
        /**
         * サムネイル画像を設定
         * @param thumbnail サムネイル画像
         */
        public void setThumbnail(Bitmap thumbnail) {
            mThumbnail = thumbnail;
        }
    
        /**
         * タイトルを設定
         * @param title タイトル
         */
        public void setmTitle(String title) {
            mTitle = title;
        }
    
        /**
         * サムネイル画像を取得
         * @return サムネイル画像
         */
        public Bitmap getThumbnail() {
            return mThumbnail;
        }
    
        /**
         * タイトルを取得
         * @return タイトル
         */
        public String getTitle() {
            return mTitle;
        }
    }
    
[/code]

ListAdapter.java

[code]

    public class ListAdapter extends ArrayAdapter<listitem> {
    
        private int mResource;
        private List<listitem> mItems;
        private LayoutInflater mInflater;
    
        /**
         * コンストラクタ
         * @param context コンテキスト
         * @param resource リソースID
         * @param items リストビューの要素
         */
        public ListAdapter(Context context, int resource, List<listitem> items) {
            super(context, resource, items);
    
            mResource = resource;
            mItems = items;
            mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view;
    
            if (convertView != null) {
                view = convertView;
            }
            else {
                view = mInflater.inflate(mResource, null);
            }
    
            // リストビューに表示する要素を取得
            listitem item = mItems.get(position);
    
            // サムネイル画像を設定
            ImageView thumbnail = (ImageView)view.findViewById(R.id.thumbnail);
            thumbnail.setImageBitmap(item.getThumbnail());
    
            // タイトルを設定
            TextView title = (TextView)view.findViewById(R.id.title);
            title.setText(item.getTitle());
    
            return view;
        }
    }
    
[/code]


CC BY-SA 3.0
2017-06-10T12:34:18.920
35460
2017-08-25T02:39:13.857
2017-08-25T02:39:13.857
21092
23205
question
android java
Jsonからの独自アダプターによるListの作成の際にimageがたまにしか表示されない


StrictModeを使用すると表示できました  
あまりいい方法とは言えないのかもしれませんが...  
listitem.java

[code]

        public listitem(final String image_url, final String title) {
                StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                    .permitAll().build();
                StrictMode.setThreadPolicy(policy);
                try {
                    // URL設定
                    URL url = new URL(image_url);
                    // HTTP接続開始
                    HttpURLConnection c = (HttpURLConnection) url.openConnection();
                    c.setRequestMethod("GET");
                    c.connect();
                    // ダウンロード開始
                    InputStream is = c.getInputStream();
                    mThumbnail = BitmapFactory.decodeStream(is);
                    c.disconnect();
                } catch (IOException e) {
                    Bitmap bmp = null;
                }
    
        mTitle = title;
            }
    
[/code]


CC BY-SA 3.0
2017-06-10T13:10:20.827
35461
2017-06-10T13:10:20.827
23205
35460
answer


コンストラクタ内で画像を非同期で読み込んでいるため、リストのアイテム表示時に画像の読み込みが完了していないケースがあるから画像が表示されないのではないでしょうか。  
画像の読み込みが完了したタイミングを通知するか、Adapterの中で画像の読み込みを行うかすると良いでしょう。

そもそもHttpURLConnectionを使って画像の読み込みを行うのは今回のケースだとあまり良い方法とは思えないので、PicassoやGlideなど各種画像ライブラリを使うことを検討してみては？


CC BY-SA 3.0
2017-06-10T15:23:25.477
35464
2017-06-10T15:23:25.477
7655
35460
answer