Контент не отображается, когда приложение работает на recyclerViewPager

Это код, который я использую.

public class MainActivity extends AppCompatActivity {

    public ArrayList<String> ImageUrls = new ArrayList<>();
    public ArrayList<String> ImageNames = new ArrayList<>();
    public ArrayList<String> ImageDesc = new ArrayList<>();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initImages();

    }

   private void initImages(){

       final OkHttpClient client = new OkHttpClient();

       final Request request = new Request.Builder()
               .url("http://url.in/wp-json/wp/v2/posts?_embed")
               .build();

       @SuppressLint("StaticFieldLeak") AsyncTask<Void, Void, String> asyncTask = new AsyncTask<Void, Void, String>() {
           private static final String TAG = "SlideFragment";
           @Override
           protected String doInBackground(Void... params) {
               try {
                   Response response = client.newCall(request).execute();

                   if (!response.isSuccessful()) {
                       Log.d(TAG, "doInBackground: REsponse Un Successfull - 56");
                       return null;

                   }
                   String Data =  response.body().string();
                   response.body().close();
                   return Data;
               } catch (Exception e) {
                   e.printStackTrace();
                   Log.d(TAG, "doInBackground: Exceptione on line63");
                   return null;
               }

           }

           @Override
           protected void onPostExecute(String Data) {

               super.onPostExecute(Data);
               if (Data != null) {
                   Log.d(TAG, "onPostExecute: line72");
                   try {
                       JSONArray json = new JSONArray(Data);
                       for (int i = 0; i < json.length(); i++) {
                           JSONObject post = json.getJSONObject(i);
                           String title = post.getJSONObject("title").getString("rendered");
                           String description = post.getJSONObject("content").getString("rendered");
                           String imgURL = post.getJSONObject("_embedded").getJSONArray("wp:featuredmedia").getJSONObject(0).getJSONObject("media_details").getString("file");
                           String imagUrl = "http://url.in/wp-content/uploads/" + imgURL;
                           ImageNames.add(title);
                           ImageDesc.add(description);
                           ImageUrls.add(imagUrl);
                           Log.d(TAG, "onPostExecute: " + ImageNames);
                           }

                   }catch(JSONException j){
                       j.printStackTrace();
                       Log.d(TAG, "onPostExecute: on line 121");
                   }
               }
           }
       };
       asyncTask.execute();
    initRecycler();

   }
   private void initRecycler(){

       RecyclerViewPager mRecyclerView = (RecyclerViewPager) findViewById(R.id.list);

// setLayoutManager like normal RecyclerView, you do not need to change any thing.
       LinearLayoutManager layout = new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false);
       mRecyclerView.setLayoutManager(layout);

//set adapter
//You just need to implement ViewPageAdapter by yourself like a normal RecyclerView.Adpater.
       RecyclerViewAdapter adapter = new RecyclerViewAdapter(ImageUrls, ImageNames, ImageDesc, this);
       mRecyclerView.setAdapter(adapter);

   }
}

Я запустил тот же код с локальными данными, то есть ArrayList с жестко закодированными данными. Оно работает. Но если я попробую с данными API, он ничего не покажет. Я проверил ArrayList с ведением журнала. Это нормально.

Я не знаю, где я ошибаюсь.

UPDATE

Спасибо @sonhnLab. В коде я удалил initRecycler(); из initImages(); и добавил в onPostExecute();. Это сработало.

Вы должны создать обратный вызов и вызвать его в функции onPostExecute после получения всех данных. Затем вызовите initRecycler () в обратном вызове.

SonhnLab 25.09.2018 05:31

Да, это сработало. Спасибо.

Anonymous 25.09.2018 05:34

Добро пожаловать

SonhnLab 25.09.2018 05:37

@SonhnLab Напишите ответ, чтобы оператор принял ответ и задокументировал его.

debo.stackoverflow 25.09.2018 06:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
64
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Из-за асинхронного характера Asynctask следующая строка: «initRecycler ();» не обязательно вызывается после завершения сетевого запроса, следовательно, нет содержимого. Помните, что любая задача, которая зависит от асинхронного ответа, должна быть реализована внутри метода ответа, в данном случае внутри onPostExecute ().

С помощью Sonhnlab я успешно получил желаемый результат.

Я сделал этот вызов initRecycler(); в вызове onPostExecute(). поэтому, когда информация готова из вызова API, он запускает Recycler.

У меня вопрос об обновлении кода.

Вы должны вызвать initRecyler () onPostExecute, когда задача async завершена

Другие вопросы по теме