У меня есть приложение, которое показывает некоторые изображения, полученные с сайта pixabay. Я учусь, как реализовать архитектуру MVVM. Мне удается это реализовать, и это работает. но при первом запуске приложения. ничего не показано Я должен закрыть приложение и перезапустить его, чтобы увидеть изображения. У меня было несколько проблем, которые, как и изображения, были показаны дублированными. Мне удается решить эту проблему, создав новый класс, который называется базой данных, и сделал хранилище stati c и синхронизировано. но единственная проблема, которую я имею сейчас, - это запуск приложения дважды, чтобы увидеть изображения. Я хочу задать несколько вопросов:
1: моя реализация MVVM верна! или хотя бы в правильном направлении!
2: почему, когда я изменил класс репозитория на stati c и синхронизировал, проблема с дублированием была решена!
3: в классе репозитория это показывает предупреждение (не помещайте android контекстные классы в поле stati c), что это значит!
любой совет, связанный с MVVM или кодом, в целом, высоко ценится.
Классы по порядку:
Класс базы данных:
class Database {
private MutableLiveData<List<Flowers>> mutableLiveData = new MutableLiveData<>();
private Context context;
Database(Context context) {
this.context = context;
}
MutableLiveData<List<Flowers>> getMutableLiveData() {
loadData();
Toast.makeText(context, "Loaded", Toast.LENGTH_SHORT).show();
mutableLiveData.setValue(loadData());
return mutableLiveData;
}
private List<Flowers> loadData() {
String url = "https://pixabay.com/api/?format=json&key=15507399-305bf88eb0892f7cdf58fb66b&image_type=photo&pretty=true&q=yellow+flowers";
final List<Flowers> images = new ArrayList<>();
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray hits = response.getJSONArray("hits");
for (int i = 0; i < hits.length(); i++) {
JSONObject pics = hits.getJSONObject(i);
String id = pics.getString("id");
String imageURL = pics.getString("largeImageURL");
images.add(new Flowers(id, imageURL));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
VolleySingleton.getInstance(context).addToRequestQueue(request);
return images;
}
Класс репозитория:
class FlowerRepository {
private Context context;
@SuppressLint("StaticFieldLeak")
private static FlowerRepository instance;
private FlowerRepository(Context context) {
this.context = context;
}
static synchronized FlowerRepository getInstance(Context context) {
if (instance == null){
instance = new FlowerRepository(context);
}
return instance;
}
LiveData<List<Flowers>> getMutableLiveData() {
Database database = new Database(context);
return database.getMutableLiveData();
}
Класс ViewModel:
public class FlowersViewModel extends AndroidViewModel {
private FlowerRepository flowerRepository;
public FlowersViewModel(Application context) {
super(context);
flowerRepository = FlowerRepository.getInstance(context);
}
LiveData<List<Flowers>> getAllFlowers() {
return flowerRepository.getMutableLiveData();
}
Класс адаптера :
public class FlowersAdapter extends RecyclerView.Adapter<FlowersAdapter.FlowersViewHolder> {
static class FlowersViewHolder extends RecyclerView.ViewHolder {
ImageView imageView;
FlowersViewHolder(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.flowers_pic);
}
}
private List<Flowers> images;
FlowersAdapter(List<Flowers> images) {
this.images = images;
}
@NonNull
@Override
public FlowersViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.malls_item, parent, false);
return new FlowersViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull FlowersViewHolder holder, int position) {
if (images != null) {
Flowers current = images.get(position);
Picasso.get().load(current.getImageURL()).fit().centerInside().into(holder.imageView);
}
}
@Override
public int getItemCount() {
if (images != null) {
return images.size();
} else {
return 0;
}
}
MainActivity класс:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView recyclerView = findViewById(R.id.recycler_view);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(RecyclerView.VERTICAL);
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setHasFixedSize(true);
FlowersViewModel flowersViewModel = new ViewModelProvider(this).get(FlowersViewModel.class);
List<Flowers> flowers = flowersViewModel.getAllFlowers().getValue();
final FlowersAdapter adapter = new FlowersAdapter(flowers);
recyclerView.setAdapter(adapter);
flowersViewModel.getAllFlowers().observe(this, new Observer<List<Flowers>>() {
@Override
public void onChanged(List<Flowers> flowers) {
adapter.notifyDataSetChanged();
}
});
}
VolleySinglton класс:
class VolleySingleton {
private static VolleySingleton mInstance;
private RequestQueue mRequestQueue;
private VolleySingleton(Context context) {
mRequestQueue = Volley.newRequestQueue(context.getApplicationContext());
}
static synchronized VolleySingleton getInstance(Context context) {
if (mInstance == null) {
mInstance = new VolleySingleton(context);
}
return mInstance;
}
<T> void addToRequestQueue(Request<T> request){
getRequestQueue().add(request);
}
private RequestQueue getRequestQueue() {
return mRequestQueue;
}