Динамически отображать изображения из ресурса / рисования - PullRequest
3 голосов
/ 03 февраля 2011

Я пытаюсь динамически помещать различные изображения (.jpg, .png) в ListView из r es/drawable. Имена из изображений, которые я получаю из базы данных. Сами изображения находятся в папке res/drawable.

Это то, что у меня уже есть, с ошибкой: D

String imgName; -> Есть имена img, которые мне нужны из базы данных

Drawable drawable;    
    drawable = Class.appContext.getResources().getDrawable(Class.appContext.getResources().getIdentifier("com.example.test:drawable/"+imgName,null,null));  

Затем я получаю это в ArrayList для каждого изображения в базе данных (+ - 200 изображений):

ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
HashMap<String, Object> map = new HashMap<String, Object>();

map = new HashMap<String, Object>();
map.put("img",drawable);

          map.put("text", "some text");
          list.add(map);

Теперь я возвращаю список;

В классе, где я звоню:

listReceive = Class.getImages(appContext); 

listSetup = new SimpleAdapter(this, listReceive, R.layout.row,
                        new String[] {"img", "text"}, new int[] {R.id.IMG_CELL, R.id.TEXT_CELL});
                lvList.setAdapter(listSetup);

Строка XML представляет собой ImageView и TextView.

System.out: resolUri не удалось на плохой растровое изображение URI: android.drawable.bitmapDrawable@405739 Не удалось выполнить resolUri на неверном растровом URI: android.drawable.bitmapDrawable@405639 Не удалось выполнить resolUri на неверном растровом URI: android.drawable.bitmapDrawable@405959 Не удалось выполнить resolUri на неверном растровом URI: android.drawable.bitmapDrawable@405677 ... ... ...

У меня получилось, когда я сохранил изображения в локальную память или на SD-карту, а затем поместил путь в массив, например:

map.put("img","/data/data/com.example.test/images/" + imgName);

Я не могу использовать это, потому что тогда мне нужно будет скопировать изображения из res/drawable на локальный или SD. Это занимает в 2 раза больше памяти. не может иметь этого.

Должен быть способ динамически получать изображения из отрисовки.

Кто-нибудь знает, что мне здесь не хватает? Спасибо.

Ответы [ 3 ]

5 голосов
/ 03 февраля 2011

SimpleAdapter ожидает целое число или строку, которая задает URI ресурса или изображения:

public void setViewImage (ImageView v, String value)
Since: API Level 1

Вызывается bindView (), чтобы установить изображение для ImageView, но только если нет существующего ViewBinderили если существующий ViewBinder не может обрабатывать привязку к ImageView. По умолчанию значение будет рассматриваться как ресурс изображения.Если значение не может использоваться в качестве ресурса изображения, значение используется в качестве изображения Uri. Этот метод вызывается вместо setViewImage (ImageView, int), если предоставленные данные не являются целыми числами или целыми числами.

Я считаю, что следует использовать setViewBinder для предоставления ViewBinder для SimpleAdapter для обработки привязки данных Drawable к ImageView.По сути, метод setViewValue () должен возвращать значение false, если он не вызывается для представления вашего изображения.Когда он вызывается для представления вашего изображения, метод должен установить данные в представлении и вернуть true.Возвращаемое значение указывает, смог ли ViewBinder установить представление или же адаптер должен попытаться связать сами данные с помощью поведения по умолчанию.

Может быть что-то вроде:

private final SimpleAdapter.ViewBinder mViewBinder =
    new SimpleAdapter.ViewBinder() {
        @Override
        public boolean setViewValue(
                final View view,
                final Object data,
                final String textRepresentation) {

            if (view instanceof ImageView) {
                ((ImageView) view).setImageDrawable((Drawable) data);
                return true;
            }

            return false;
        }
    };

...

listSetup .setViewBinder(mViewBinder);

I 'мы сделали похожую вещь с SimpleCursorAdapter и его ViewBinder.

1 голос
/ 03 февраля 2011

Простой адаптер ожидает строку на карте. Но ваша карта содержит отрисовку для ключа "img".

Вместо этого попробуйте расширить класс BaseAdapter . Переопределите метод getView, а затем вручную установите drawable для изображения и text для textview.

Еще одна мысль, что было бы не очень хорошей идеей хранить в памяти все рисунки. Скорее получите отрисовку динамически при рендеринге этой конкретной строки списка

0 голосов
/ 09 августа 2013

Этот следующий метод или способ также работает - если кто-то все еще заинтересован

List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
Integer flags[] = new Integer[listdetail.size()];
Resources resources = getResources();
for (int i = 0; i < listdetail.size(); i += 2) {
    listName = listdetail.get(i).getName();
    int dynamicId = resources.getIdentifier(listdetail.get(i).getName().replaceAll(" ", "").toLowerCase(), "drawable", getActivity().getPackageName());
    if(dynamicId == 0) {
        dynamicId = R.drawable.test_image;
        flags[i] = dynamicId;
    }else {
        flags[i] = dynamicId;
    }
    HashMap<String, String> hm = new HashMap<String, String>();
    hm.put("value1", listdetail.get(i).getName());
    hm.put("valueImage1", Integer.toString(flags[i]));
    list.add(hm);
}

String[] from = { "value1", "valueImage1"};
int[] to = { R.id.textview, R.id.imageView };
SimpleAdapter adapter = new SimpleAdapter(getActivity().getBaseContext(), list, R.layout.listlayout, from, to);

ListView listView = (ListView) getActivity().findViewById(R.id.listview);
listView.setAdapter(adapter);
...