Урок 48. Используем SimpleAdapter.

Обсуждение уроков
Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 48. Используем SimpleAdapter.

Сообщение rezak90 » 13 июн 2013, 11:05

что вытягивать то нужно? у вас же есть данные:

Код: Выделить всё

ArrayList<Map<String, Object>> data
от сюдава и вытягивайте
R.id.team
Политика на форуме запрещена

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 48. Используем SimpleAdapter.

Сообщение Foenix » 13 июн 2013, 15:00

Ivan_P писал(а):Прошу прощения, что неправильно выразился про ListView.
строю список так:
void populate() {
ArrayList<Map<String, Object>> data = getData();
String[] from = { KEY_VALUE, KEY_VALUE2, KEY_VALUE3 };
int[] to = { R.id.value,R.id.value1, R.id.value2 };

SimpleAdapter sa = new SimpleAdapter(this, data, R.layout.item_view,from, to);

setListAdapter(sa);

Но как всё таки вытянуть?
При нажатии на пункт списка тебе нужно сделать одну только вещь (ищи в уроке!) - определить id записи в ArrayList-е, по которой нажал пользователь.
А затем уже бросить думать про ListView и из ArrayList-а доставать KEY_VALUE, KEY_VALUE2, KEY_VALUE3 в которых, судя по всему и находятся твои ФИО.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Ivan_P
Сообщения: 7
Зарегистрирован: 06 май 2013, 22:13

Re: Урок 48. Используем SimpleAdapter.

Сообщение Ivan_P » 13 июн 2013, 23:26

Foenix писал(а):
Ivan_P писал(а):Прошу прощения, что неправильно выразился про ListView.
строю список так:
void populate() {
ArrayList<Map<String, Object>> data = getData();
String[] from = { KEY_VALUE, KEY_VALUE2, KEY_VALUE3 };
int[] to = { R.id.value,R.id.value1, R.id.value2 };

SimpleAdapter sa = new SimpleAdapter(this, data, R.layout.item_view,from, to);

setListAdapter(sa);

Но как всё таки вытянуть?
При нажатии на пункт списка тебе нужно сделать одну только вещь (ищи в уроке!) - определить id записи в ArrayList-е, по которой нажал пользователь.
А затем уже бросить думать про ListView и из ArrayList-а доставать KEY_VALUE, KEY_VALUE2, KEY_VALUE3 в которых, судя по всему и находятся твои ФИО.



ID записи у меня определен. Как дальше вытянуть? Извините за настойчивость...Столько уже всего перепробовал

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 48. Используем SimpleAdapter.

Сообщение Foenix » 14 июн 2013, 07:37

Ivan_P писал(а):.Столько уже всего перепробовал
не очень видимо много. Внимательно читай уроки дальше, там есть поиск по map
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Midas74
Сообщения: 1
Зарегистрирован: 13 авг 2013, 16:39

Re: Урок 48. Используем SimpleAdapter.

Сообщение Midas74 » 13 авг 2013, 16:47

Сначала приведу код:

Код: Выделить всё

Map<String, Object> m = new HashMap<String, Object>();
m.put("text", TaskElement.getTextContent());
switch(typetask) {							
  case 1: m.put("background", R.color.PracticeTileBackgroundBrush); break;
  case 2: m.put("background", R.color.TheoryTileBackgroundBrush); break;
  case 3: m.put("background", R.color.ComboTileBackgroundBrush); break;
  default: break;							
}	
data.add(m);
Тут собственно задаются значения атрибутов.
Далее создаём адаптер:

Код: Выделить всё

String[] from = { "text", "background"};
int[] to = { R.id.LessTitle, R.id.TileLayout};
SimpleAdapter sAdapter = new SimpleAdapter(this, data, R.layout.smalllesstile, from, to);  
TasksGrid.setAdapter(sAdapter);
Ну и xml-ка адаптерная:

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
  <GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
	    android:id="@+id/TileLayout"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:columnCount="1"
        android:rowCount="2"
        android:layout_margin="5dp"
	    android:background="@color/ComboTileBackgroundBrush">
	    <TextView
			android:id="@+id/LessTitle"	
		    android:layout_column="0"
	        android:layout_row="0"				
			android:layout_width="150dp"
			android:layout_height="100dp"
			android:gravity="left"
			android:textColor="@color/FontColor"
			android:textSize="18sp"
			/>
	    <TextView
			android:id="@+id/LessNumber"	
		    android:layout_column="0"
	        android:layout_row="1"				
			android:layout_width="150dp"
			android:layout_height="50dp"
			android:gravity="right"
			android:textColor="@color/FontColor"
			android:textSize="20sp"	 />
    </GridLayout>
Теперь о проблеме. Пока пытаюсь устанавливать только текстовые значения (LessTitle) - всё окей работает. Но как только добавляю фичу со сменой фона - сразу крашится. Switch работает исправно, даже адаптер после цикла создаёт исправно. Но вот применять его к GridView (TaskGrid который) прога усиленно отказывается. Как быть?

P.S. значения background берётся из файла color.xml (и должно оттуда браться, т.е. напрямую в коде цвет ставить нельзя)

Realist
Сообщения: 134
Зарегистрирован: 08 фев 2014, 18:15

Re: Урок 48. Используем SimpleAdapter.

Сообщение Realist » 24 фев 2014, 20:47

А можно одному ListView присвоить 2 адаптера? У меня что то не получается..
И если нет, то посоветуйте выход. Я вывожу в ListView данные из БД через SimpleCursorAdapter( Имя и дата). И мне нужно пронумеровать элементы ListView. Сделал в layout еще один TextView и попытался засунуть туда номера(1,2,3,4....) из списка ArrayList через SimpleAdapter - не получилось. А других идей что то нет=))

T_E_M_A
Сообщения: 1
Зарегистрирован: 13 сен 2013, 19:12

Re: Урок 48. Используем SimpleAdapter.

Сообщение T_E_M_A » 11 июл 2014, 11:37

Отличный урок! Очень мне помог. Только возникла одна проблема, которую никак не удаётся решить. Мне нужно сделать, чтобы при прикосновении к пункту listView он подсвечивался, то есть менялся фон, картинка и цвет текста. Фон и цвет текста я меняю селекторами. А вот с картинками проблема, потому что в каждом пункте разная картинка. Пробовал добавить метод OnTuch, но что-то не вышло. Как правильно сделать?
Вот активити:

public class MainActivity extends Activity {

Context context;
int layoutResourceId;
CharSequence data1[] = null;
Typeface tf;

Intent intent;
ListView lvSimple;
SimpleAdapter sAdapter;
ArrayList<Map<String, Object>> data;
Map<String, Object> m;
protected static final String LOG_TAG = null;
// имена атрибутов для Map
final String ATTRIBUTE_NAME_TEXT = "text";
final String ATTRIBUTE_NAME_IMAGE = "image";
final String ATTRIBUTE_itemDescription_TEXT = "text_itemDescription";

// массив для загрузки данных с файла string.xml
String[] exerciseNames, descriptionExersises;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// получаем ресурсы с файла string.xml
Resources res = getResources();
exerciseNames = res.getStringArray(R.array.exerciseNames);
descriptionExersises = res.getStringArray(R.array.descriptionExersises);

// упаковываем данные в понятную для адаптера структуру
data = new ArrayList<Map<String, Object>>();
information();

// массив имен атрибутов, из которых будут читаться данные

String[] from = { ATTRIBUTE_NAME_TEXT, ATTRIBUTE_NAME_IMAGE,ATTRIBUTE_itemDescription_TEXT};
// массив ID View-компонентов, в которые будут вставлять данные
int[] to = { R.id.name, R.id.photo,R.id.itemDescription};

// создаем адаптер
sAdapter = new SimpleAdapter(this, data, R.layout.item_list_view_xml, from, to);

// определяем список и присваиваем ему адаптер
lvSimple = (ListView) findViewById(R.id.listV_main);
lvSimple.setAdapter(sAdapter);
lvSimple.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
ImageView imageView = (ImageView) findViewById(R.id.photo);
switch(position){
case 0: intent = new Intent().setClass(this, SecondActivity.class);
startActivity(intent); break;
case 1: break;
case 2: break;
case 3: break;
case 4: break;
case 5: break;
case 6: break;
case 7: break;
case 8: break;

}

data.clear();
information();
sAdapter.notifyDataSetChanged();
Log.d(LOG_TAG, "itemClick: position = " + position + ", id = "+ id);
}
});
}

void information() {

// TODO Auto-generated method stub
m = new HashMap<String, Object>();
m.put(ATTRIBUTE_NAME_TEXT, exerciseNames[0]);
m.put(ATTRIBUTE_NAME_IMAGE, R.drawable.icon21);
m.put(ATTRIBUTE_itemDescription_TEXT, descriptionExersises[0] );
m.put(ATTRIBUTE_itemDescription_TEXT, descriptionExersises[0] );
data.add(m);

m = new HashMap<String, Object>();
m.put(ATTRIBUTE_NAME_TEXT, exerciseNames[1]);
m.put(ATTRIBUTE_NAME_IMAGE, R.drawable.icon22);
m.put(ATTRIBUTE_itemDescription_TEXT, descriptionExersises[1] );
data.add(m);

m = new HashMap<String, Object>();
m.put(ATTRIBUTE_NAME_TEXT, exerciseNames[2]);
m.put(ATTRIBUTE_NAME_IMAGE, R.drawable.icon23);
m.put(ATTRIBUTE_itemDescription_TEXT, descriptionExersises[2]);
data.add(m);

m = new HashMap<String, Object>();
m.put(ATTRIBUTE_NAME_TEXT, exerciseNames[3]);
m.put(ATTRIBUTE_NAME_IMAGE, R.drawable.icon24);
m.put(ATTRIBUTE_itemDescription_TEXT, descriptionExersises[3]);
data.add(m);

m = new HashMap<String, Object>();
m.put(ATTRIBUTE_NAME_TEXT, exerciseNames[4]);
m.put(ATTRIBUTE_NAME_IMAGE, R.drawable.icon25);
m.put(ATTRIBUTE_itemDescription_TEXT, descriptionExersises[4]);
data.add(m);

m = new HashMap<String, Object>();
m.put(ATTRIBUTE_NAME_TEXT, exerciseNames[5]);
m.put(ATTRIBUTE_NAME_IMAGE, R.drawable.icon26);
m.put(ATTRIBUTE_itemDescription_TEXT, descriptionExersises[5]);
data.add(m);

m = new HashMap<String, Object>();
m.put(ATTRIBUTE_NAME_TEXT, exerciseNames[6]);
m.put(ATTRIBUTE_NAME_IMAGE, R.drawable.icon27);
m.put(ATTRIBUTE_itemDescription_TEXT, descriptionExersises[6]);

data.add(m);

m = new HashMap<String, Object>();
m.put(ATTRIBUTE_NAME_TEXT, exerciseNames[7]);
m.put(ATTRIBUTE_NAME_IMAGE, R.drawable.icon28);
m.put(ATTRIBUTE_itemDescription_TEXT, descriptionExersises[7]);
data.add(m);

m = new HashMap<String, Object>();
m.put(ATTRIBUTE_NAME_TEXT, exerciseNames[8]);
m.put(ATTRIBUTE_NAME_IMAGE, R.drawable.icon29);
m.put(ATTRIBUTE_itemDescription_TEXT, descriptionExersises[8]);
data.add(m);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

}

isachenko
Сообщения: 47
Зарегистрирован: 30 июл 2014, 21:43

Re: Урок 48. Используем SimpleAdapter.

Сообщение isachenko » 21 окт 2014, 22:12

Господа! Такой вопрос.
Использовала SimpleAdapter. Тестировала работу списка на двух разных телефонах. Один телефон при скролинге делает список чисто белым и только при окончании скролинга возвращает списку нормальный внешний вид. К тому же он подсвечивает белым переходом верх и низ списка. Со вторым телефоном таких проблем нет, список выглядит как и должен, и его границы не подсвечивает. Первый HTC (android 2.3.5), второй Alcatel (android 4.1.1).
В чём тут дело?
Спасибо.
Спасибо за уроки!

evgen_dndz
Сообщения: 11
Зарегистрирован: 28 окт 2014, 14:43

Re: Урок 48. Используем SimpleAdapter.

Сообщение evgen_dndz » 10 ноя 2014, 22:40

Всем привет! Подскажите пожалуйста в чем моя ошибка.
Взяв за основу данный урок получил вот такой код:

Код: Выделить всё

public class RestListAdapter extends ActionBarActivity {

    String[] name = new String[]{"Первый", "Второй", "Третий"};
    String[] address = new String[]{"ул. Имени Улицы 1", "ул. Имени Улицы 2", "ул. Имени Имени"};
    String[] phone = new String[]{"0569", "05692", "056"};
  
    ListView lvSimple;
    SimpleAdapter sAdapter;

    final String LOG_TAG = "myLogs";

    // имена атрибутов для Map
    final String ATTRIBUTE_NAME_NAME = "text";
    final String ATTRIBUTE_NAME_ADDRESS = "text";
    final String ATTRIBUTE_NAME_PHONE = "text";
    final String ATTRIBUTE_NAME_IMAGE = "image";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.rest_list);
   
        ArrayList<Map<String, Object>> data = new ArrayList<Map<String, Object>>(
                name_Rest.length);
        Map<String, Object> m;

        for (int i = 0; i < name_Rest.length; i++) {
            m = new HashMap<String, Object>();
            m.put(ATTRIBUTE_NAME_NAME, name[i]);
            m.put(ATTRIBUTE_NAME_ADDRESS, address[i]);
            m.put(ATTRIBUTE_NAME_PHONE, phone[i]);
            m.put(ATTRIBUTE_NAME_IMAGE, R.drawable.ic_launcher);
//            m.put(ATTRIBUTE_NAME_IMAGE, logo_url_Rest[i]);
            data.add(m);
        }
 
        String[] from = { ATTRIBUTE_NAME_NAME, ATTRIBUTE_NAME_ADDRESS, ATTRIBUTE_NAME_PHONE,
                ATTRIBUTE_NAME_IMAGE };
 
        int[] to = { R.id.tvName, R.id.tvAddress, R.id.tvPhone, R.id.ivImg };

        sAdapter = new SimpleAdapter(this, data, R.layout.item_rest,
                from, to);

        lvSimple = (ListView) findViewById(R.id.lvSimple);
        lvSimple.setAdapter(sAdapter);

 
        lvSimple.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
                Log.d(LOG_TAG, "itemClick: position = " + position + ", id = "
                        + id);

            }
        });
    }
}
Проблема состоит в том, что при запуске получаю такую картину:
Вложения
screen
screen
pic.jpg (15.37 КБ) 13221 просмотр

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 48. Используем SimpleAdapter.

Сообщение klblk » 11 ноя 2014, 07:37

[syntax=java]final String ATTRIBUTE_NAME_NAME = "text";
final String ATTRIBUTE_NAME_ADDRESS = "text";
final String ATTRIBUTE_NAME_PHONE = "text"; [/syntax]
что-то не так...

finberg
Сообщения: 51
Зарегистрирован: 11 мар 2013, 14:20

Re: Урок 48. Используем SimpleAdapter.

Сообщение finberg » 11 ноя 2014, 08:02

Да и тут нелогично:
m = new HashMap<String, Object>();
m.put(ATTRIBUTE_NAME_NAME, name);
m.put(ATTRIBUTE_NAME_ADDRESS, address);
m.put(ATTRIBUTE_NAME_PHONE, phone);
m.put(ATTRIBUTE_NAME_IMAGE, R.drawable.ic_launcher);
// m.put(ATTRIBUTE_NAME_IMAGE, logo_url_Rest);
data.add(m);

Может нужно создать свой класс с полями name, address, phone, etc. и потом экземпляры класса помещать в коллекцию?

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 48. Используем SimpleAdapter.

Сообщение klblk » 11 ноя 2014, 08:13

нет, остальное вроде все по уроку.

evgen_dndz
Сообщения: 11
Зарегистрирован: 28 окт 2014, 14:43

Re: Урок 48. Используем SimpleAdapter.

Сообщение evgen_dndz » 11 ноя 2014, 11:43

finberg писал(а):Да и тут нелогично:
m = new HashMap<String, Object>();
m.put(ATTRIBUTE_NAME_NAME, name);
m.put(ATTRIBUTE_NAME_ADDRESS, address);
m.put(ATTRIBUTE_NAME_PHONE, phone);
m.put(ATTRIBUTE_NAME_IMAGE, R.drawable.ic_launcher);
// m.put(ATTRIBUTE_NAME_IMAGE, logo_url_Rest);
data.add(m);

Может нужно создать свой класс с полями name, address, phone, etc. и потом экземпляры класса помещать в коллекцию?



Вы имеете в виду создать кастомный адаптер как в уроке 54?
Или это применимо и для SimpleAdapter?
А, что не логично?
Я думал, что адаптер берет поэлементно значения с from и to и сопостовляет их...
поэтому для каждого вью указал строковое значение.

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Урок 48. Используем SimpleAdapter.

Сообщение doter.ua » 11 ноя 2014, 13:50

Немного про ассоциативные массивы: Данные хранятся как ключ - значение

Код: Выделить всё

m.put(ATTRIBUTE_NAME_NAME, name[i]); 
m.put(ATTRIBUTE_NAME_ADDRESS, address[i]); 
m.put(ATTRIBUTE_NAME_PHONE, phone[i]); 
m.put(ключ, значение)

Код: Выделить всё

    final String ATTRIBUTE_NAME_NAME = "text"; 
    final String ATTRIBUTE_NAME_ADDRESS = "text"; 
    final String ATTRIBUTE_NAME_PHONE = "text"; 
Три одинаковых ключа. Вопрос: что доставать из массива по ключу "text" ?

Адаптер сам разберется, что и куда присваивать в зависимости от типа входных данных. Если передать ему String который будет доставаться по ключу "video", он достанет Стрингу и поймет, что это текст, а не видео. Тебе нужно следить, чтобы данные по ключу, и view элемент могли подойти друг другу, т.е. если по ключу доставать boolean, а вью будет текст, то ничего хорошего не выйдет.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

evgen_dndz
Сообщения: 11
Зарегистрирован: 28 окт 2014, 14:43

Re: Урок 48. Используем SimpleAdapter.

Сообщение evgen_dndz » 11 ноя 2014, 14:01

doter.ua писал(а):Немного про ассоциативные массивы: Данные хранятся как ключ - значение

Код: Выделить всё

m.put(ATTRIBUTE_NAME_NAME, name[i]); 
m.put(ATTRIBUTE_NAME_ADDRESS, address[i]); 
m.put(ATTRIBUTE_NAME_PHONE, phone[i]); 
m.put(ключ, значение)

Код: Выделить всё

    final String ATTRIBUTE_NAME_NAME = "text"; 
    final String ATTRIBUTE_NAME_ADDRESS = "text"; 
    final String ATTRIBUTE_NAME_PHONE = "text"; 
Три одинаковых ключа. Вопрос: что доставать из массива по ключу "text" ?

Адаптер сам разберется, что и куда присваивать в зависимости от типа входных данных. Если передать ему String который будет доставаться по ключу "video", он достанет Стрингу и поймет, что это текст, а не видео. Тебе нужно следить, чтобы данные по ключу, и view элемент могли подойти друг другу, т.е. если по ключу доставать boolean, а вью будет текст, то ничего хорошего не выйдет.
Спасибо! не учел,что для ArrayList это будет являться ключом...

tmp
Сообщения: 3
Зарегистрирован: 08 ноя 2014, 18:29

Re: Урок 48. Используем SimpleAdapter.

Сообщение tmp » 21 ноя 2014, 21:29

А не подскажете как передать изображения с SD в listview?

Bulvasaur
Сообщения: 6
Зарегистрирован: 02 июл 2015, 14:18

Re: Урок 48. Используем SimpleAdapter.

Сообщение Bulvasaur » 21 дек 2015, 17:56

Добрый день!
Подскажите как передать изображение адаптеру, которое храниться на SD.
Я делаю приложение типа новостной ленты, скачиваю XML-файл, разбираю его парсером, скачиваю по ссылкам изображения, сохраняю их во внешнем хранилище и т.д.

Пытаюсь делать так:

File imgFile = new File(getExternalCacheDir()+ File.separator + "ImgFolder" + File.separator+"filename.jpeg");
...
if(imgFile.exists()){
m.put("image", BitmapFactory.decodeFile(imgFile.getAbsolutePath());
}
...
String[] from = {"image", "title", "date","author"};
int[] to = { R.id.newImg, R.id.newTitle, R.id.newDate, R.id.newAuthor };

но картинка не передается в newImg.

Картинка доступна, т.к. если устанавливать ее во вью типа так:

Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
newImg.setImageBitmap(myBitmap);

то все работает. А в листвью вот не передается.
Подскажите, в каком направлении думать? Чувствую, что я близок к разгадке, но голова не варит уже.
Спасибо.

Bulvasaur
Сообщения: 6
Зарегистрирован: 02 июл 2015, 14:18

Re: Урок 48. Используем SimpleAdapter.

Сообщение Bulvasaur » 22 дек 2015, 11:51

В общем, сам и отвечу.
Выяснилось, что SimpleAdapter хочет на вход либо int либо string, а никакие не Bitmap'ы.
Заменил строку
m.put("image", BitmapFactory.decodeFile(imgFile.getAbsolutePath());
на
m.put("image", getExternalCacheDir()+ File.separator + "ImgFolder" + File.separator+ "filename.jpeg");
и все заработало.
Всем спасибо)

Аватара пользователя
Idiosyncrasy
Сообщения: 2
Зарегистрирован: 05 мар 2016, 16:01
Откуда: Odessa
Контактная информация:

Re: Урок 48. Используем SimpleAdapter.

Сообщение Idiosyncrasy » 09 мар 2016, 04:21

У меня в item.xml в строке android:src="@drawable/ic_launcher" не находит его, этот файл должен быть прямо в папке drawable моего проекта?

Все разобрался с папками =)

AABL
Сообщения: 5
Зарегистрирован: 10 мар 2016, 15:20

Re: Урок 48. Используем SimpleAdapter.

Сообщение AABL » 14 мар 2016, 13:50

Жаловался на "drawable". Ошибка "no resource found that matches the given name (at 'src' with value '@drawable/ic_launcher')" в файле item.xml. И в mainactivity.java схожая ошибка на дроубл.
Погуглил и заменил в двух местах слово "drawable" на "mipmap" и всё заработало.
Насколько я понял, пример или работает только на eclipse, или для более старой версии Android Studio.
А что такое mipmap? Есть ли разница от drawable?

Ответить