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