Страницы

Поиск по вопросам

понедельник, 30 декабря 2019 г.

Как в ListView вывести определенные пункты, а не все данные. Как добавить в избранное?

#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 Как то так.

Комментариев нет:

Отправить комментарий