Я пытаюсь сделать модуль, в котором, как только я получил JSON из API и загружаю его в оперативную память, я сразу же загружаю его в общие настройки, а также после любого изменения данных (в методе onClick адаптера) я повторно сохраните новый измененный массив в общих настройках. По-видимому, это не работает, и я не могу понять, почему.
Вот моя активность, содержащая весь соответствующий код:
package com.example.superheros.Controllers;
import android.content.SharedPreferences;
import android.support.design.widget.CollapsingToolbarLayout;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.widget.ImageView;
import com.example.superheros.Adapter.HeroesAdapter;
import com.example.superheros.Model.Hero;
import com.example.superheros.Networking.HttpRequest;
import com.example.superheros.R;
import com.google.gson.Gson;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
import java.util.Arrays;
public class MainActivity extends AppCompatActivity {
//API constant -
private static final String BASE_URL = "https://heroapps.co.il/employee-tests/android/androidexam.json";
public static final String SAVED_HERO_LIST = "heroesList";
// Recyclerview variables -
private RecyclerView heroesRecylerView;
private ArrayList<Hero> heroesArrayList;
private RecyclerView.LayoutManager layoutManager;
private HeroesAdapter heroesAdapter;
//Toolbar variables -
private CollapsingToolbarLayout collapsingToolbarLayout;
private ImageView toolbarImageView;
//Persistence variables -
private Hero selectedFavoriteHero;
private SharedPreferences sharedPreferences;
private Gson gson;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
heroesArrayList = loadFromLocal();
}catch (Exception ex) {
ex.printStackTrace();
}
if (heroesArrayList != null && heroesArrayList.size() > 0){
initViews();
} else {
initNetworking();
}
}
private void initNetworking() {
HttpRequest httpRequest = new HttpRequest(this, BASE_URL, new HttpRequest.OnHttpCompleteListener() {
@Override
public void onComplete(String response) {
dataToModel(response, false);
initViews();
}
@Override
public void onError(String error) {
Log.d("error", error);
}
});
httpRequest.request();
}
private void initViews() {
heroesRecylerView = findViewById(R.id.herosRecyclerView);
collapsingToolbarLayout = findViewById(R.id.collapsingHeroToolbarLayout);
toolbarImageView = findViewById(R.id.toolbarImageview);
heroesRecylerView.setHasFixedSize(true);
layoutManager = new LinearLayoutManager(this);
heroesRecylerView.setLayoutManager(layoutManager);
heroesAdapter = new HeroesAdapter(heroesArrayList, new HeroesAdapter.OnHeroListClickListener() {
@Override
public void onListItemClicked(int position) {
changeFavoriteHero(position);
}
});
heroesRecylerView.setAdapter(heroesAdapter);
}
private void changeFavoriteHero(int position) {
Hero pressedHeroRow = heroesArrayList.get(position);
selectedFavoriteHero = pressedHeroRow;
Picasso.get().load(pressedHeroRow.image)
.fit()
.centerCrop()
.placeholder(R.drawable.ic_launcher_background)
.error(R.drawable.ic_launcher_foreground)
.into(toolbarImageView);
collapsingToolbarLayout.setTitle(pressedHeroRow.title);
pressedHeroRow.setFavorite(!pressedHeroRow.isFavorite());
for (int i = 0; i < heroesArrayList.size(); i++) {
if (i == position) continue;
heroesArrayList.get(i).setFavorite(false);
}
saveToLocal(heroesArrayList);
heroesAdapter.notifyDataSetChanged();
}
private ArrayList<Hero> dataToModel(String json, boolean isLocalInfo) {
Gson gson = new Gson();
Hero[] heroesList = gson.fromJson(json, Hero[].class);
heroesArrayList = new ArrayList<>(Arrays.asList(heroesList));
if (!isLocalInfo) {
saveToLocal(heroesArrayList);
}
return heroesArrayList;
}
//Shared preferences load & save methods -
private void saveToLocal(ArrayList<Hero> heroesArrayList) {
sharedPreferences = getPreferences(MODE_PRIVATE);
SharedPreferences.Editor prefsEditor = sharedPreferences.edit();
Gson gson = new Gson();
String heroesList = gson.toJson(heroesArrayList);
Log.d("heroArrayList", heroesList);
prefsEditor.putString(SAVED_HERO_LIST, heroesList);
prefsEditor.apply();
}
private ArrayList<Hero> loadFromLocal(){
sharedPreferences = getPreferences(MODE_PRIVATE);
try {
String fetchedHeroesJson = gson.fromJson(SAVED_HERO_LIST, String.class);
ArrayList<Hero> heroArrayList = dataToModel(fetchedHeroesJson, true);
return heroArrayList;
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
}
Я надеюсь, что мне могут указать на то, что я пропустил
Я не совсем понимаю тебя.
пытался удалить и переустановить приложение и ничего нового не сделал
Будьте конкретны, пожалуйста. Я хотел бы помочь вам. Но не могу понять, что вам нужно.
Строка журнала heroList = gson.toJson(heroesArrayList); эта строка и что она напечатает? контрольная строка не нулевая
проблема в загрузке из локального ArrayList<Hero> loadFromLocal()
vasudev vyas — сделал это, он записывает весь JSON из API. так вроде все работает и проблема не в нем
проверь ответ и дай мне знать
ты правильно понял дружище. Спасибо
изменять
prefsEditor.apply();
к
prefsEditor.commit();
apply() немедленно фиксирует свои изменения в SharedPreferences в памяти, но запускает асинхронную фиксацию на диск, и вы не будете уведомлены о каких-либо сбоях. Поскольку вы обращаетесь к одному и тому же объекту настроек (является одноэлементным), вы всегда должны видеть согласованное представление, но не в вашем случае, когда вы получаете доступ из отдельного потока.
похоже, не влияет на элемент строки, который я нажал. У меня есть изображение, которое должно меняться в зависимости от того, был ли нажат элемент строки, и кажется, что он его не сохранил.
хотя есть некоторое интересное поведение - оно загружается намного быстрее, чем при удалении приложения и повторной установке, означает ли это, что данные были получены, но не полностью? или это из-за какой-то другой причины?
попробуй это.
private ArrayList<Hero> loadFromLocal(){
sharedPreferences = getPreferences(MODE_PRIVATE);
try {
String fetchedHeroesJson = sharedPreferences.getString(SAVED_HERO_LIST, "null");
ArrayList<Hero> heroArrayList = dataToModel(fetchedHeroesJson, true);
return heroArrayList;
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
большое спасибо. решено! проблема заключалась в том, что я пытался получить данные из общих настроек с помощью GSON, ха-ха.
добро пожаловать, такое бывает... продолжай кодить... получишь прекрасный результат :)
SharedPreference не является БД памяти. Я не совсем понимаю, что вы хотите сделать. Но полностью удалите приложение (удалите данные), а затем повторите попытку, если хотите удалить данные в SharedPreference.