@atambalasi

Как передать ArrayList из обычного класса в Activity?

есть класс
public class FilmsModel {

    private int postCount = 5;
    private int offset    = 0;
    private List filmsData;

    private Integer video_id;
    private String video_photo_130;
    private String video_photo_320;
    private String text;
    private String film_name;
    private String film_genre;
    private String film_desc;
    private JSONArray films;
    private List<FilmsModel> filmsModels = new ArrayList<>();

    public FilmsModel(){}

    public FilmsModel(String desc){
        this.film_desc = desc;
    }
    public String getDescrtion(){
        return film_desc;
    }


    public void getFilmsFromAPI(){

        VKRequest request = VKApi.wall().get(VKParameters.from(
                VKApiConst.OWNER_ID, -133127588,
                VKApiConst.COUNT, postCount,
                VKApiConst.OFFSET, offset,
                VKApiConst.EXTENDED, 1));

        request.executeWithListener(new VKRequest.VKRequestListener() {
            @Override
            public void onComplete(VKResponse response) {
                super.onComplete(response);
                 parseResponse(response);
                Log.d("Wall POSTS", response.json.toString());
            }

            @Override
            public void attemptFailed(VKRequest request, int attemptNumber, int totalAttempts) {
                super.attemptFailed(request, attemptNumber, totalAttempts);
            }

            @Override
            public void onError(VKError error) {
                super.onError(error);
            }

            @Override
            public void onProgress(VKRequest.VKProgressType progressType, long bytesLoaded, long bytesTotal) {
                super.onProgress(progressType, bytesLoaded, bytesTotal);
            }
        });

    }

    private void parseResponse(VKResponse response){

        JSONObject json = response.json;
        try{
            JSONObject  responseArr = json.getJSONObject("response");
            JSONArray  items =  responseArr.getJSONArray("items");
            Log.d("Items ==> ", items.toString());
            for (int i=0; i < items.length(); i++){
                try{

                    JSONObject film = items.getJSONObject(i);
                    filmsModels.add(new FilmsModel(film.getString("text")));
                    Log.d("ITEMS BY i", i + " => " + filmsModels.get(i).film_desc);


                }catch(JSONException e){
                    e.printStackTrace();
                }


            }
            getFilms();

        }catch (JSONException e){
            e.printStackTrace();
        }


        Log.d("PARSERRR ", json.toString());

    }

    public  List<FilmsModel> getFilms(){
        for(int i=0; i < filmsModels.size(); i++){
            Log.d("LIST ARRAY ==> TEXT", filmsModels.get(i).film_desc);
        }
        return  filmsModels;
    }

    @Override
    public String toString() {

        return film_desc;
    }
}

В методе getFilmsFromAPI делаю запрос на вк АПИ получаю данные.
В методе parseResponse(VKResponse response) парсинг данных полученных из АПИ и их заношу в ArrayList filmsModels.add(new FilmsModel(film.getString("text")));
в конструкторе иницализация поля
public FilmsModel(String desc){
        this.film_desc = desc;
    }

В методе getFilms() возвращаю данные.
Вопрос. Когда Вызваю метод getFilms() в Активити лист пустой. Подозреваю что экран рисуется прежде чем получаю данные. Если прав то тогда как их мне передать в этом случае.(Прочитал про Otto Event Bus in Android пока не понял хотелось через срадствам android sdk сделать).
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.films_layout);

        recyclerView = (RecyclerView)findViewById(R.id.films_rv);
        verticalLinearLayoutManager = new LinearLayoutManager(getApplicationContext());

        recyclerView.setLayoutManager(verticalLinearLayoutManager);
        adapter = new RecyclerAdapter();
        recyclerView.setAdapter(adapter);


        filmsModel = new FilmsModel();
        filmsModel.getFilmsFromAPI();
        for(FilmsModel txt : filmsModel.getFilms()){
            Log.d("LIST ARRRR ", txt.getDescrtion());
        }
        adapter.addAll(filmsModel.getFilms());


    }
  • Вопрос задан
  • 249 просмотров
Пригласить эксперта
Ответы на вопрос 1
z17
@z17
Java, PHP
Да, запросы у вас идут асинхронно, соответственно нужен какой-то коллбек чтобы в момент, когда вы уже получили фильмы - можно было сказать об этом активити.

Грубо говоря можно сделать так: пусть ваш FilmsModel имеет встроенный интерфейс с одним методом
public interface FilmsReadyCallback {
filmsReady(List<FilmsModel> films);
}


Ваш activity может имплементировать его и в реализации метода filmsReady отрисовывать список фильмов.
Передаёте activity в объект FilmsModel и вызываете его вместо метода getFilms()
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы