Изображения отображаются после второго запуска приложения с использованием Volley-MVVM - RecyclerView - PullRequest
0 голосов
/ 09 марта 2020

У меня есть приложение, которое показывает некоторые изображения, полученные с сайта 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;
}
...