首页 > 解决方案 > 应用在 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。没事。

我不知道我错在哪里。

更新

感谢@sonhnLab。在我删除并添加到的initRecycler();代码initImages();onPostExecute();。那行得通。

标签: javaandroidandroid-recyclerviewokhttp3

解决方案


由于 Asynctask 的异步特性,以下行:“initRecycler();” 网络请求完成后不一定会被调用,因此没有内容。请记住,任何依赖于异步响应的任务都需要在响应方法中实现,在本例中是在 onPostExecute() 中。


推荐阅读