Это код, который я использую.
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();. Это сработало.
Да, это сработало. Спасибо.
Добро пожаловать
@SonhnLab Напишите ответ, чтобы оператор принял ответ и задокументировал его.




Из-за асинхронного характера Asynctask следующая строка: «initRecycler ();» не обязательно вызывается после завершения сетевого запроса, следовательно, нет содержимого. Помните, что любая задача, которая зависит от асинхронного ответа, должна быть реализована внутри метода ответа, в данном случае внутри onPostExecute ().
С помощью Sonhnlab я успешно получил желаемый результат.
Я сделал этот вызов initRecycler(); в вызове onPostExecute(). поэтому, когда информация готова из вызова API, он запускает Recycler.
У меня вопрос об обновлении кода.
Вы должны вызвать initRecyler () onPostExecute, когда задача async завершена
Вы должны создать обратный вызов и вызвать его в функции onPostExecute после получения всех данных. Затем вызовите initRecycler () в обратном вызове.