有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java填充RecyclerView列表

我似乎无法让我的RecyclerView一路填充。它只生成第一个单元格,其他单元格为空。尽管for循环似乎运行了多次

    JsonObjectRequest root = new JsonObjectRequest(Request.Method.GET, URL, null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            try {
                JSONObject feed = response.getJSONObject("feed");
                JSONArray results = feed.getJSONArray("results");
                //Log.d("FEED", String.valueOf(feed));w
                for(int i = 0; i<results.length(); i++){
                    JSONObject resultsObj = results.getJSONObject(i);

                    Log.d(TAG, "inside" + String.valueOf(i));
                    mImageUrls.add(resultsObj.getString("artworkUrl100"));
                    mTitle.add(resultsObj.getString("name"));
                    getRecyclerView();
                }

                adapter.notifyDataSetChanged();

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

        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });
    mRequestQueue.add(root);

}

private void getRecyclerView(){
    Log.d(TAG, "getRecyclerView");
    recyclerView = findViewById(R.id.recyclerView);
    adapter = new RecyclerViewAdapter(mImageUrls, mTitle, this);
    recyclerView.setAdapter(adapter);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setHasFixedSize(true);
}

共 (3) 个答案

  1. # 1 楼答案

    每次用一个值初始化适配器时。这就是为什么列表包含一个值,而其他值为空。您需要将getRecyclerView();移动到循环外部

    像这样:

    try {
                JSONObject feed = response.getJSONObject("feed");
                JSONArray results = feed.getJSONArray("results");
                //Log.d("FEED", String.valueOf(feed));w
                for(int i = 0; i<results.length(); i++){
                    JSONObject resultsObj = results.getJSONObject(i);
    
                    Log.d(TAG, "inside" + String.valueOf(i));
                    mImageUrls.add(resultsObj.getString("artworkUrl100"));
                    mTitle.add(resultsObj.getString("name"));
    
                }
                 getRecyclerView();
               // No need to notify the data set changed 
               // adapter.notifyDataSetChanged();
    
            } catch (JSONException e) {
                e.printStackTrace();
            }
    
  2. # 2 楼答案

    告诉我这是否有效:

    JsonObjectRequest root = new JsonObjectRequest(Request.Method.GET, URL, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                try {
                    JSONObject feed = response.getJSONObject("feed");
                    JSONArray results = feed.getJSONArray("results");
                    //Log.d("FEED", String.valueOf(feed));w
                    for(int i = 0; i<results.length(); i++){
                        JSONObject resultsObj = results.getJSONObject(i);
    
                        Log.d(TAG, "inside" + String.valueOf(i));
                        mImageUrls.add(resultsObj.getString("artworkUrl100"));
                        mTitle.add(resultsObj.getString("name"));
                    }
    
                    getRecyclerView();
                    adapter.notifyDataSetChanged();
    
                } catch (JSONException e) {
                    e.printStackTrace();
                }
    
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
    
            }
        });
        mRequestQueue.add(root);
    
    }
    
    private void getRecyclerView(){
        Log.d(TAG, "getRecyclerView");
        recyclerView = findViewById(R.id.recyclerView);
        adapter = new RecyclerViewAdapter(mImageUrls, mTitle, this);
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setHasFixedSize(true); }
    

    我所做的是将getRecyclerView();移动到循环之外,因为您只需要调用它一次,而不是每次都要设置recyclerview

  3. # 3 楼答案

    用这个也许对你有帮助

    private void getRecyclerView(){
        Log.d(TAG, "getRecyclerView");
        recyclerView = findViewById(R.id.recyclerView);
        adapter = new RecyclerViewAdapter(mImageUrls, mTitle, this);
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(this, 
        LinearLayoutManager.VERTICAL, false));
        recyclerView.setHasFixedSize(true);
    }