Получение данных из адаптера

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
mrstuff88
Сообщения: 9
Зарегистрирован: 13 янв 2016, 23:58

Получение данных из адаптера

Сообщение mrstuff88 » 14 янв 2016, 00:09

Добрый день уважаемые коллеги :) Дали задание, нужно его решить. Ткните носом, если мыслю неправильно.
Есть адаптер, унаследованный от ArrayAdapter

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

public class MyAdapter extends ArrayAdapter {

ArrayList nameInfo = new ArrayList();

public MyAdapter(Context context, ArrayList nameInfo) {
super(context, 0, nameInfo);

}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

Info data = getItem(position);
if (convertView == null) {
convertView = 
LayoutInflater.from(getContext()).inflate(R.layout.row, parent, false);
}

TextView column1 = (TextView) convertView.findViewById(R.id.col1);
TextView column2 = (TextView) convertView.findViewById(R.id.col2);

column1.setText(data.par1);
column2.setText(data.par2);

return convertView;
}
}
Пользователь приложения по нажатию на кнопку добавляет списки ListView
При выходе из приложения и повторном заходе все списки пропадают. Нужно решить проблему.
Я думаю, нужно получать данные о списке из адаптера, сохранять его в БД и при следующем запуске приложения проверять, вводились списки ранее или нет. Если вводились, то подгружать их из БД и выставлять.
Вопрос №1: В нужном ли направлении я мыслю или есть более "правильные" решения задачи
Вопрос №2: Если да, то как получить данные из адаптера о списке? Дефолтных методов нет, которые могли бы это сделать. Самому определять? Подкиньте рабочий код, где из адаптера берется инфа о списках. Всё обрыл, ничего не нашёл..
P.S. на startandroid занимаюсь давно, но создаю тему в первый раз. Исправьте, если что не так.
Всем бобра ;)

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Получение данных из адаптера

Сообщение math64 » 14 янв 2016, 10:11

Для получения даных есть методы getCount() и getIem(position).
База данных - слишком тяжелая вещь. Если размер данных, которые нужно сохранять, небольшой, лучше сохранить в обычный текстовый файл.

mrstuff88
Сообщения: 9
Зарегистрирован: 13 янв 2016, 23:58

Re: Получение данных из адаптера

Сообщение mrstuff88 » 15 янв 2016, 16:56

math64 писал(а):Для получения даных есть методы getCount() и getIem(position).
База данных - слишком тяжелая вещь. Если размер данных, которые нужно сохранять, небольшой, лучше сохранить в обычный текстовый файл.
При использовании этих методов мы определим кол-во элементов в адаптере добавленных пользователем и их позицию. А как определить, допустим, String каждого элемента? Пользователь при добавлении новых элементов ListView вводит разные String..

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

Re: Получение данных из адаптера

Сообщение doter.ua » 15 янв 2016, 17:51

Внутренний лист - для сохранения ссылки на коллекцию, который придет из конструктора.

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

ArrayList nameInfo;
 
public MyAdapter(Context context, ArrayList nameInfo) { 
   super(context, 0, nameInfo); 
   this.nameInfo = nameInfo; 
} 
Теперь можно его использовать:
getCount() = nameInfo.size;
getItem(position) = nameInfo.get(position);
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

mrstuff88
Сообщения: 9
Зарегистрирован: 13 янв 2016, 23:58

Re: Получение данных из адаптера

Сообщение mrstuff88 » 15 янв 2016, 20:06

doter.ua писал(а):Внутренний лист - для сохранения ссылки на коллекцию, который придет из конструктора.

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

ArrayList nameInfo;
 
public MyAdapter(Context context, ArrayList nameInfo) { 
   super(context, 0, nameInfo); 
   this.nameInfo = nameInfo; 
} 
Теперь можно его использовать:
getCount() = nameInfo.size;
getItem(position) = nameInfo.get(position);
Немного не понял, могли бы Вы рассказать поподробнее?

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

Re: Получение данных из адаптера

Сообщение doter.ua » 16 янв 2016, 12:41

mrstuff88 писал(а):
doter.ua писал(а):Внутренний лист - для сохранения ссылки на коллекцию, который придет из конструктора.

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

ArrayList nameInfo;
 
public MyAdapter(Context context, ArrayList nameInfo) { 
   super(context, 0, nameInfo); 
   this.nameInfo = nameInfo; 
} 
Теперь можно его использовать:
getCount() = nameInfo.size;
getItem(position) = nameInfo.get(position);
Немного не понял, могли бы Вы рассказать поподробнее?
В последних строчках пропущенно много кода, там только название метода и тело. Оформи их
по правилам джавы (фигурные скобки и т.д.).
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

mrstuff88
Сообщения: 9
Зарегистрирован: 13 янв 2016, 23:58

Re: Получение данных из адаптера

Сообщение mrstuff88 » 16 янв 2016, 14:26

doter.ua писал(а):
mrstuff88 писал(а):
doter.ua писал(а):
В последних строчках пропущенно много кода, там только название метода и тело. Оформи их
по правилам джавы (фигурные скобки и т.д.).
Это относится к Вашему коду или к моему? Уточняйте, пожалуйста, ответы

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Получение данных из адаптера

Сообщение math64 » 18 янв 2016, 11:00

doter.ua писал(а):Внутренний лист - для сохранения ссылки на коллекцию, который придет из конструктора.

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

ArrayList nameInfo;
 
public MyAdapter(Context context, ArrayList nameInfo) { 
   super(context, 0, nameInfo); 
   this.nameInfo = nameInfo; 
} 
Теперь можно его использовать:
getCount() = nameInfo.size;
getItem(position) = nameInfo.get(position);
Так сохраняется оригинальный ArrayList. Если используются методы add()/addAll()/remove()/clear() эти изменения не будут учтены.
Огигинальные методы getCount() и getItem() класса ArrayAdapter будут учитывать эти изменения, но при использовании фильтра, будет выдавать только отфильтрованные данные.
notifyDataSetChanged () будет сообщать об изменениях в данных.
Кстати, нужно писать public class MyAdapter extends ArrayAdapter<Info> и ArrayList<Info> - тогда getItem() будет возвращать не Object, а Info и после
Info data = getItem(position); можно получать данные итема: data.par1 и data.par2

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

Re: Получение данных из адаптера

Сообщение doter.ua » 19 янв 2016, 00:03

math64 писал(а): сохраняется оригинальный ArrayList. Если используются методы add()/addAll()/remove()/clear() эти изменения не будут учтены.
Вышеупомянутые методы модифицируют оригинальную коллекцию, в адаптере сохраняется ссылка, а не копия, гетАйтем и гетКаунт будут работать корректно. Советую почитать про "Ссылочные типы" и их отличие от примитивных.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Получение данных из адаптера

Сообщение math64 » 19 янв 2016, 08:01

doter.ua писал(а):
math64 писал(а): сохраняется оригинальный ArrayList. Если используются методы add()/addAll()/remove()/clear() эти изменения не будут учтены.
Вышеупомянутые методы модифицируют оригинальную коллекцию, в адаптере сохраняется ссылка, а не копия, гетАйтем и гетКаунт будут работать корректно. Советую почитать про "Ссылочные типы" и их отличие от примитивных.
Для того чтобы убедиться, нужно посмотреть на исходники ArrayAdapter.
Да, он модифицирует оригинальную коллекцию и далее работает с ней (но если в конструктор передаётся массив, создается новый ArrayList<T> ).
Если используются фильтры, то создается копия с отфильтрованными данными.
Если нужен доступ к оригинальной коллекции - нужно сделать с неё копию и передать её в суперконструктор, оригинальный указатель запомнить, но тогда методы доступа к оригинальной коллекции нужно называть по-другому, например void getOriginalCount() и Info getOriginalItem(position) - иначе адаптер будет работать неправильно.
Что конкретно нужно делать - зависит от целей ТС. Но как я понял, он вносит изменения в коллекцию, хотя возможно, не вызывает методы add()/addAll()/remove()/clear() напрямую.

mrstuff88
Сообщения: 9
Зарегистрирован: 13 янв 2016, 23:58

Re: Получение данных из адаптера

Сообщение mrstuff88 » 29 янв 2016, 15:12

math64 писал(а):
doter.ua писал(а):
math64 писал(а): сохраняется оригинальный ArrayList. Если используются методы add()/addAll()/remove()/clear() эти изменения не будут учтены.
Вышеупомянутые методы модифицируют оригинальную коллекцию, в адаптере сохраняется ссылка, а не копия, гетАйтем и гетКаунт будут работать корректно. Советую почитать про "Ссылочные типы" и их отличие от примитивных.
Для того чтобы убедиться, нужно посмотреть на исходники ArrayAdapter.
Да, он модифицирует оригинальную коллекцию и далее работает с ней (но если в конструктор передаётся массив, создается новый ArrayList<T> ).
Если используются фильтры, то создается копия с отфильтрованными данными.
Если нужен доступ к оригинальной коллекции - нужно сделать с неё копию и передать её в суперконструктор, оригинальный указатель запомнить, но тогда методы доступа к оригинальной коллекции нужно называть по-другому, например void getOriginalCount() и Info getOriginalItem(position) - иначе адаптер будет работать неправильно.
Что конкретно нужно делать - зависит от целей ТС. Но как я понял, он вносит изменения в коллекцию, хотя возможно, не вызывает методы add()/addAll()/remove()/clear() напрямую.
Пользователь нажимает на кнопку, появляется поле, в котором он вводит строку. Эта строка добавляется в список. Пользователь может ввести много строк. Но после выхода из приложения и повторном заходе, все эти строки пропадают. Вопрос, как записать в переменную эти стркои для дальнейшего сохранения в onSaveInstanceState???

mrstuff88
Сообщения: 9
Зарегистрирован: 13 янв 2016, 23:58

Re: Получение данных из адаптера

Сообщение mrstuff88 » 29 янв 2016, 15:34

И скажите пожалуйста, где такие данные лучше хранить? Создавать и хранить в БД или использовать SaveInstance??/

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Получение данных из адаптера

Сообщение math64 » 01 фев 2016, 11:06

Если это не что-то сложное и объемное - сохранять в обычном текстовом файле. Для этого нужно разрешение на запись на карту памяти.
Если разрешение на запись на карту памяти запрашивать нежелательно а число строк в списке небольшое, можно использовать SharedPreferences.

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

SharedPreferences preferences = getPreferences(MODE_PRIVATE);
int count = preferences.getInt("count", 0);
Info[] data = new Info[count];
for(int i = 0; i < count; i++) {
  data[i] = new Info();
  data[i].col1 =  preferences.getString("info_1_"+ i, "");
  data[i].col2 =  preferences.getString("info_2_"+ i, "");
}
ArrayAdapter<Info> adapter = new ArrayAdapter<Info>(this, 0, data) {
  @Override 
  public View getView(int position, View convertView, ViewGroup parent) { ... }
};
+ соотвествующий код для сохранения.

Ответить