Не в состоянии вернуть arraylist за пределы области видимости, он становится нулевым - PullRequest
0 голосов
/ 18 января 2019

Когда я копирую полученные данные (содержащиеся в arraylist) в новый arraylist и возвращаю его, новый arraylist не возвращает никакого значения. onDataReceived (ArrayList arrayList) - это метод обратного вызова слушателя после асинхронной выборки данных через залп в массиве данных.

package com.example.bike.ViewModels;

import android.app.Application;
import android.arch.lifecycle.AndroidViewModel;
import android.arch.lifecycle.LiveData;
import android.support.annotation.NonNull;
import com.example.bike.Models.BikesInfo;
import com.example.bike.Repository.BikesRepository;
import com.example.bike.Repository.Listener;
import com.example.bike.Views.ApplicationContext;
import java.util.ArrayList;
import java.util.Collections;

public class BikesViewModel extends AndroidViewModel {
 private BikesRepository bikesRepository;
 public static ArrayList<BikesInfo> vmarrayList = new ArrayList<>();
 public BikesViewModel(@NonNull Application application) {
    super(application);
     bikesRepository = new BikesRepository(application, new Listener() {
            @Override
            public void onDataReceived(ArrayList<BikesInfo> arrayList) {

                vmarrayList.addAll(arrayList);
            }

            @Override
            public void onError(int error) {

            }
        });
        bikesRepository.getArrayList();

    }

public ArrayList<BikesInfo> getbikesinfolistobservable(){
       return vmarrayList;
  }

}

Edit: MainActivity.java

package com.example.bike.Views.ui;

import android.arch.lifecycle.AndroidViewModel;
import android.arch.lifecycle.Observer;
import android.arch.lifecycle.ViewModelProviders;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import com.example.bike.Models.BikesInfo;
import com.example.bike.R;
import com.example.bike.ViewModels.BikesViewModel;
import com.example.bike.Views.Adapters.BikesListAdapter;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    BikesViewModel bikesViewModel;

    RecyclerView recyclerView;
    LinearLayoutManager linearLayoutManager;
    BikesListAdapter bikesListAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = findViewById(R.id.bikes_recycler);
        linearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);
        recyclerView.setHasFixedSize(true);

        bikesViewModel = ViewModelProviders.of(MainActivity.this).get(BikesViewModel.class);

        bikesListAdapter = new BikesListAdapter(bikesViewModel.getbikesinfolistobservable());
        recyclerView.setAdapter(bikesListAdapter);

    }

}

1 Ответ

0 голосов
/ 18 января 2019

Если вы используете volley для выполнения запроса, вы не можете гарантировать, что вызов getbikesinfolistobservable () будет выполнен после того, как запрос завершен, так как это асинхронный запрос.

Попробуйте сделать консольный журнал на vmarrayList после vmarrayList.addAll (arrayList). Если он все еще пуст, то ArrayList arrayList тоже пуст, так что это будет проблемой с ответом на запрос.

Также vmarrayList является статической переменной, а класс BikesViewModel является общедоступным, поэтому вам не понадобится геттер.

...