#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 ArrayAdapteradapter = 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 Как то так.
Комментариев нет:
Отправить комментарий