Android - добавление фотографий, сделанных пользователем, в список

В настоящее время у меня есть простой адаптер представления списка, который содержит две строки текста. Далее я пытаюсь добавить возможность отображения фотографии, которую пользователь сделал в виде списка. Я изменил свой адаптер списка следующим образом:

standardAdapter = new SimpleAdapter(this, list, R.layout.post_layout,
                new String[] { "time", "post", "image"}, new int[] {
                        R.id.postTimeTextView, R.id.postTextView, R.id.post_imageView});

Затем я добавляю его в хэш-карту, как обычно, и обновляю адаптер:

// create a new hash map with the text from the post
        feedPostMap = new HashMap<String, Object>();
        feedPostMap.put("time", currentTimePost);
        feedPostMap.put("post", post);
        if(photoWasTaken == 1){
            feedPostMap.put("image", pictureTaken);
        }
        //add map to list
        list.add(feedPostMap);

        // refresh the adapter
        standardAdapter.notifyDataSetChanged();

Наконец, вот код для действия над результатом:

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.d(TAG, "ON activity for result- CAMERA");
        if (resultCode == Activity.RESULT_OK) {
            //get and decode the file
            pictureTaken = BitmapFactory.decodeFile("/sdcard/livefeedrTemp.png");

            //Display picture above the text box
            imageViewShowPictureTaken.setImageBitmap(pictureTaken);
            displayPhotoLayout.setVisibility(LinearLayout.VISIBLE);

            //NEW - make photo variable = 1
            photoWasTaken = 1;
        }
    }

Однако я столкнулся с проблемой. Фотография в растровой форме не добавляется в представление списка. Это просто выглядит как пустое белое пространство. Я делаю что-то не так здесь? Во-вторых, если пользователь решил не делать снимок, то и вид изображения не должен отображаться. Я не уверен, как это реализовать. Должен ли я создать собственный адаптер списка?

Спасибо за вашу помощь


person Splitusa    schedule 29.12.2011    source источник
comment
Возможно проблема с размером картинки, может стоит попробовать преобразовать картинку в миниатюру.   -  person Jeremy D    schedule 29.12.2011
comment
Я только что попытался создать миниатюру из своего изображения и добавить ее, но она все еще не отображается.   -  person Splitusa    schedule 29.12.2011
comment
Когда вы получаете доступ к своему изображению на SD-карте, вы должны получить к нему доступ с помощью this.getExternalStorageDirectory()+pathToImage, а не напрямую с помощью /sdcard/. Вы также должны проверить, что у вас есть разрешение на доступ для чтения/записи к внешнему хранилищу в файле manifest.xml, и, если вы могли бы указать какой-либо код ошибки или какой-либо logcat, это может иметь значение здесь, потому что процесс, который вы используете, кажется правильно, но я не могу проверить код прямо сейчас.   -  person Jeremy D    schedule 29.12.2011
comment
Это проблема, потому что я не получаю никаких кодов ошибок. Разрешения также хороши, и изображение уже сохранено в моей растровой переменной pictureTaken (я показываю его пользователю до того, как оно будет добавлено в список). Я думаю, проблема в том, что это не ресурс bmp, а тот, который создается и может быть заменен позже. Я пытался получить доступ к изображению напрямую, но вы не можете получить к нему доступ.   -  person Splitusa    schedule 29.12.2011


Ответы (1)


Проблема в том, что SimpleAdapter по умолчанию не поддерживает растровые изображения.

По умолчанию значение будет рассматриваться как ресурс изображения. Если значение нельзя использовать в качестве ресурса изображения, оно используется в качестве Uri изображения.

Однако есть решение. Вы можете установить собственный ViewBinder и выполнить привязку самостоятельно. .

class MyViewBinder implements SimpleAdapter.ViewBinder {
    @Override
    public boolean setViewValue(View view, Object data, String textRepresentation) {
        if (view instanceof ImageView && data instanceof Bitmap) {
            ImageView v = (ImageView)view;
            v.setImageBitmap((Bitmap)data);
            // return true to signal that bind was successful
            return true;
        }
        return false;
    }
}

И установите это в свой SimpleAdapter:

adapter.setViewBinder(new MyViewBinder());

Таким образом, каждый раз, когда SimpleAdapter пытается привязать значение к представлению, он сначала вызывает метод setViewValue вашего связующего представления. Если он возвращает false, он пытается связать его сам.


Вы также можете попробовать поместить в свою карту URL-адрес в виде строки, указывающей на местоположение SD-карты. Однако я не уверен, что SimpleAdapter справится с этим.


Также см. этот пост: Динамически показывать изображения из ресурса/вытягиваемого

person balazsbalazs    schedule 30.12.2011
comment
Спасибо bbalazs за ответ! это действительно интересно. Я постараюсь реализовать это сейчас и отвечу своими наблюдениями. - person Splitusa; 31.12.2011