Страницы

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

вторник, 2 апреля 2019 г.

Как в 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}
@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu);
//searchView.setOnQueryTextListener(textChangeListener); return super.onCreateOptionsMenu(menu); }
// кнопка избранное @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId();
//noinspection SimplifiableIfStatement if (id == R.id.action_favorite) { if(mSettings.contains(APP_PREFERENCES_NAME)) { // выводим данные в TextView tvInfo.setText(mSettings.getString(APP_PREFERENCES_NAME, "")); } return true; }
return super.onOptionsItemSelected(item); }
}
Второе активити с полным текстом и с кнопкой добавить в избранное
public class LastActivity extends AppCompatActivity {
TextView textView; TextView textView2; TextView textView3; TextView textView4;
String name1; String name2; String name3; String name4;
// переменная, представляющая экземпляр класса SharedPreferences SharedPreferences mSettings; // это будет именем файла настроек public static final String APP_PREFERENCES = "mysettings"; // имя кота public static final String APP_PREFERENCES_NAME = "Nickname";
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_last); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar);
// инициализирем эту переменную // в скобках - название вашего файла и стандартное разрешение mSettings = getSharedPreferences(APP_PREFERENCES, Context.MODE_PRIVATE);
// находим в коде textView = (TextView) findViewById(R.id.textView); textView2 = (TextView) findViewById(R.id.textView2); textView3 = (TextView) findViewById(R.id.textView3); textView4 = (TextView) findViewById(R.id.punkt);
// получаем Intent извликаем из него объект Intent intent = getIntent();
// извлекаем из него объект name1 = intent.getStringExtra("name1"); name2 = intent.getStringExtra("name2"); name3 = intent.getStringExtra("name3"); name4 = intent.getStringExtra("punkt");
// выводим полученные данные textView.setText(name1); textView2.setText(name2); textView3.setText(name3);
// кнопка добавить в избранное FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(LastActivity.this, getString(R.string.action_favorite), Toast.LENGTH_LONG).show(); // SharedPreferences.Editor - редактировать SharedPreferences.Editor editor = mSettings.edit(); // сохраняем его через метод putString() (есть также putLong(), putBoolean() и т.п.) editor.putString(APP_PREFERENCES_NAME, name4); // commit() или apply() чтобы изменение вступила в силу editor.apply(); } }); }
}


Ответ

Для такой функциональности оптимальным решением будет использование базы данных, которая позволяет делать выборки по условию и предоставляет готовые данные, соответствующие условию, наиболее быстро и оптимально.
Создаете таблицу следующей структуры:
| _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 так же собрана уже достаточно большая база знаний
Всего этого вполне достаточно для работы, ключевым моментом здесь, видимо, является понимание работы с базами данных вообще и вот этому нужно научится перед тем, как их использовать, так как это достаточно сложная дисциплина

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

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