#android #listview
Здравствуйте. Я все пытаюсь реализовать добавление в избранное.
Что у меня на данный момент есть. Список ListView который загружает данные из ресурса
string.xml. Обработчик нажатия - при нажатии на пункт списка открывается второе Активити
с полным текстом.
Также во втором Активити есть кнопка, при нажатии на которую сохраняется с помощью
SharedPreferences, номер позиции ListView.
В первом Активити сверху есть кнопка избранное при нажатии на которую будут оставаться
в активити только те пункты которые добавил в избранное.
Так вот я нажал на заголовок списка, открылось второе активити, далее нажимаю на
кнопку, сохраняется номер позиции, возвращаюсь в первое активити, теперь нажимаю на
кнопку избранное получаю из SharedPreferences, номер позиции.
Вопрос как теперь отфильтровать ListView, что бы в списки были только те пункты которые
были сохранены в SharedPreferences?
Ну и второй вопрос как в SharedPreferences, сохранять несколько пунктов, при нажатии
на кнопку.
Не знаю правильной ли я вообще пошел дорогой, может это как-то по другому можно было
реализовать.
Код первого активити со списком
public class MainActivity extends AppCompatActivity {
ListView listView;
// переменная, представляющая экземпляр класса SharedPreferences
SharedPreferences mSettings;
// это будет именем файла настроек
public static final String APP_PREFERENCES = "mysettings";
// имя кота
public static final String APP_PREFERENCES_NAME = "Nickname";
TextView tvInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// получаем экземпляр элемента ListView
listView = (ListView)findViewById(R.id.listView);
// инициализирем эту переменную
// в скобках - название вашего файла и стандартное разрешение
mSettings = getSharedPreferences(APP_PREFERENCES, Context.MODE_PRIVATE);
tvInfo = (TextView)findViewById(R.id.tvInfo);
// определяем массив типа String
// заголовок
final String[] catnames = getResources().getStringArray(R.array.cat_names);
// два списка которые откроются во втором активити
final String[] catnames2 = getResources().getStringArray(R.array.cat_names2);
final String[] catnames3 = getResources().getStringArray(R.array.cat_names3);
// используем адаптер данных
final ArrayAdapter adapter = new ArrayAdapter(this, R.layout.item,
catnames);
listView.setAdapter(adapter);
// массив количество элементов
final int[] mice = new int [catnames.length];
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView parent, View itemClicked, int position,long
id) {
TextView textView = (TextView) itemClicked;
// получаем текст нажатого элемента
String strText = textView.getText().toString();
Intent intent = new Intent(MainActivity.this, LastActivity.class);
// получаем пункт нажатого элемента
int intText = position;
String str = Integer.toString(intText);
intent.putExtra("punkt", str);
for(int x=0;x
Ответы
Ответ 1
Для такой функциональности оптимальным решением будет использование базы данных,
которая позволяет делать выборки по условию и предоставляет готовые данные, соответствующие
условию, наиболее быстро и оптимально.
Создаете таблицу следующей структуры:
| _id | name | advanced | favorite |
в поле name заносите имена своих котов, поле advanced будет содержать дополнительные
сведения (таких полей может быть несколько), поле favorite будет индикатором отметки
избранного, в это поле будет записываться определенный признак (например: true) при
добавлении этого кота в избранное. Теперь всего два запроса решат вашу проблему легко
и правильно.
Выборка всей таблицы по полю name для отображения полного списка имен
Выборка по условию: favorite = true, сформирует список избранного
При клике в списке имен, вы получите ID записи, по которому сможете сделать выборку
дополнительных сведений в другом активити
Теперь остается только отправить полученную из БД выборку в адаптер для отображения
или заполнить виджеты дополнительными сведениями в активити
Стоит заметить, что SharedPreferences вовсе не предназначены для хранения такого
рода данных и использование их в таких целях крайне не оправдано.
Насчет самой БД от себя рекомендовал бы сразу начать изучать ORM Realm, как наиболее
качественный и удобный продукт в данной области, НО! если есть свободное время и нервы,
можно потратить его на стандартные классы Android для работы с SQL (SQLiteOpenHelper,
Cursor, CursorLoader и др.), учитывая, что это заранее более трудозатратный и мозговыносящий
вариант.
Варианты различных манипуляций со списками (коллекциями) будут заведомо костыльными
для такого рода задачи.
UPD
По работе с ORM Realm нет каких-то особых исключений, она создана по "правилам" работы
СУБД вообще и ORM в частности, то есть общих знаний по работе с базами данных вполне
достаточно для ее полномерного использования.
Начальные сведения (которых уже хватит для решения вашей задачи) доступно изложены
в кратком руководстве на ресурсе проекта. Здесь есть все основные моменты: поддерживаемые
типы данных, создание объекта-модели (RealmObject), запись в БД (CommitTransaction),
установление отношений один ко многим и многие ко многим (Relationships), изменение
записей, чтение и составление запросов (Queries), работа с результатами запроса (RealmResults)
и тд. , кроме того есть готовые сэмплы, где можно посмотреть на использование "в живую".
Дополнительно в новостях периодически появляется какая то информация, так же есть
серия видео-роликов с уроками по этой ORM. Есть даже какой-то научный доклад на русском
языке
Полный список доступных классов и методов изложен в API
Для работы со списками (ListView и RecyclerView) в API Realm включены классы-адаптеры
, там же есть инструкция по подключению в проект и сэмплы с примерами использования.
На SoF так же собрана уже достаточно большая база знаний.
Всего этого вполне достаточно для работы, ключевым моментом здесь, видимо, является
понимание работы с базами данных вообще и вот этому нужно научится перед тем, как их
использовать, так как это достаточно сложная дисциплина
Ответ 2
Вообще хранить избранное по номеру позиции довольно сомнительное решение, так как
при изменениях в ресурсах они могут поплыть.
Но если очень хочется то примерно так:
По нажатию на кнопку получается коллекция и список id элементов которые в избранном
По каждому id выдергивается элемент и сохраняется в новый список
Делаете новый адаптер и сеттите его \ или используете notifySetDataChanges
Как то так.
Комментариев нет:
Отправить комментарий