Страница 4 из 5
Re: Урок 48. Используем SimpleAdapter.
Добавлено: 13 июн 2013, 11:05
rezak90
что вытягивать то нужно? у вас же есть данные:
от сюдава и вытягивайте
Re: Урок 48. Используем SimpleAdapter.
Добавлено: 13 июн 2013, 15:00
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 в которых, судя по всему и находятся твои ФИО.
Re: Урок 48. Используем SimpleAdapter.
Добавлено: 13 июн 2013, 23:26
Ivan_P
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 записи у меня определен. Как дальше вытянуть? Извините за настойчивость...Столько уже всего перепробовал
Re: Урок 48. Используем SimpleAdapter.
Добавлено: 14 июн 2013, 07:37
Foenix
Ivan_P писал(а):.Столько уже всего перепробовал
не очень видимо много.
Внимательно читай уроки дальше, там есть поиск по map
Re: Урок 48. Используем SimpleAdapter.
Добавлено: 13 авг 2013, 16:47
Midas74
Сначала приведу код:
Код: Выделить всё
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 (и должно оттуда браться, т.е. напрямую в коде цвет ставить нельзя)
Re: Урок 48. Используем SimpleAdapter.
Добавлено: 24 фев 2014, 20:47
Realist
А можно одному ListView присвоить 2 адаптера? У меня что то не получается..
И если нет, то посоветуйте выход. Я вывожу в ListView данные из БД через SimpleCursorAdapter( Имя и дата). И мне нужно пронумеровать элементы ListView. Сделал в layout еще один TextView и попытался засунуть туда номера(1,2,3,4....) из списка ArrayList через SimpleAdapter - не получилось. А других идей что то нет=))
Re: Урок 48. Используем SimpleAdapter.
Добавлено: 11 июл 2014, 11:37
T_E_M_A
Отличный урок! Очень мне помог. Только возникла одна проблема, которую никак не удаётся решить. Мне нужно сделать, чтобы при прикосновении к пункту 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;
}
}
Re: Урок 48. Используем SimpleAdapter.
Добавлено: 21 окт 2014, 22:12
isachenko
Господа! Такой вопрос.
Использовала SimpleAdapter. Тестировала работу списка на двух разных телефонах. Один телефон при скролинге делает список чисто белым и только при окончании скролинга возвращает списку нормальный внешний вид. К тому же он подсвечивает белым переходом верх и низ списка. Со вторым телефоном таких проблем нет, список выглядит как и должен, и его границы не подсвечивает. Первый HTC (android 2.3.5), второй Alcatel (android 4.1.1).
В чём тут дело?
Спасибо.
Re: Урок 48. Используем SimpleAdapter.
Добавлено: 10 ноя 2014, 22:40
evgen_dndz
Всем привет! Подскажите пожалуйста в чем моя ошибка.
Взяв за основу данный урок получил вот такой код:
Код: Выделить всё
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);
}
});
}
}
Проблема состоит в том, что при запуске получаю такую картину:
Re: Урок 48. Используем SimpleAdapter.
Добавлено: 11 ноя 2014, 07:37
klblk
[syntax=java]final String ATTRIBUTE_NAME_NAME = "text";
final String ATTRIBUTE_NAME_ADDRESS = "text";
final String ATTRIBUTE_NAME_PHONE = "text"; [/syntax]
что-то не так...
Re: Урок 48. Используем SimpleAdapter.
Добавлено: 11 ноя 2014, 08:02
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. и потом экземпляры класса помещать в коллекцию?
Re: Урок 48. Используем SimpleAdapter.
Добавлено: 11 ноя 2014, 08:13
klblk
нет, остальное вроде все по уроку.
Re: Урок 48. Используем SimpleAdapter.
Добавлено: 11 ноя 2014, 11:43
evgen_dndz
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 и сопостовляет их...
поэтому для каждого вью указал строковое значение.
Re: Урок 48. Используем SimpleAdapter.
Добавлено: 11 ноя 2014, 13:50
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, а вью будет текст, то ничего хорошего не выйдет.
Re: Урок 48. Используем SimpleAdapter.
Добавлено: 11 ноя 2014, 14:01
evgen_dndz
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 это будет являться ключом...
Re: Урок 48. Используем SimpleAdapter.
Добавлено: 21 ноя 2014, 21:29
tmp
А не подскажете как передать изображения с SD в listview?
Re: Урок 48. Используем SimpleAdapter.
Добавлено: 21 дек 2015, 17:56
Bulvasaur
Добрый день!
Подскажите как передать изображение адаптеру, которое храниться на 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);
то все работает. А в листвью вот не передается.
Подскажите, в каком направлении думать? Чувствую, что я близок к разгадке, но голова не варит уже.
Спасибо.
Re: Урок 48. Используем SimpleAdapter.
Добавлено: 22 дек 2015, 11:51
Bulvasaur
В общем, сам и отвечу.
Выяснилось, что SimpleAdapter хочет на вход либо int либо string, а никакие не Bitmap'ы.
Заменил строку
m.put("image", BitmapFactory.decodeFile(imgFile.getAbsolutePath());
на
m.put("image", getExternalCacheDir()+ File.separator + "ImgFolder" + File.separator+ "filename.jpeg");
и все заработало.
Всем спасибо)
Re: Урок 48. Используем SimpleAdapter.
Добавлено: 09 мар 2016, 04:21
Idiosyncrasy
У меня в item.xml в строке android:src="@drawable/ic_launcher" не находит его, этот файл должен быть прямо в папке drawable моего проекта?
Все разобрался с папками =)
Re: Урок 48. Используем SimpleAdapter.
Добавлено: 14 мар 2016, 13:50
AABL
Жаловался на "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?