【问题标题】:No adapter attached in Recycler ViewRecycler View 中没有附加适配器
【发布时间】:2019-07-17 19:21:08
【问题描述】:

我是 Android 编程新手,我正在尝试使用 API 使用回收器视图创建卡片视图,但我收到错误消息“E/RecyclerView:未连接适配器;跳过布局”。我尝试在网上查找解决方案,但似乎无法弄清楚。

我尝试了这个链接给出的解决方案:

http://www.chansek.com/RecyclerView-no-adapter-attached-skipping-layout/

公共类 MainActivity 扩展 AppCompatActivity {

private RecyclerView mRecyclerView;
private ExampleAdapter mExampleAdapter;
private ArrayList<ExampleItem> mExampleList;
private RequestQueue mRequestQueue;

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

    mRecyclerView = findViewById(R.id.recycler_view);
    mRecyclerView.setHasFixedSize(true);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    mRecyclerView.setHasFixedSize(true);

    mExampleList = new ArrayList<>();
    mRequestQueue = Volley.newRequestQueue(this);
    parseJSON();
}

private void parseJSON()
{
    String url = "http://apidev.travelhouse.world/api/v1/packages";
    JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new com.android.volley.Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            try {
                JSONArray jsonArray = response.getJSONArray("");

                for (int i = 0; i < jsonArray.length(); i++)
                {
                    JSONObject hit = jsonArray.getJSONObject(i);

                    String holiday_name = hit.getString("holiday_name");
                    String holiday_price = hit.getString("package_price");
                    String primary_image = hit.getString("primary_image");

                    mExampleList.add(new ExampleItem(primary_image,holiday_name,holiday_price));

                }

                mExampleAdapter = new ExampleAdapter(MainActivity.this, mExampleList);
                mRecyclerView.setAdapter(mExampleAdapter);

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


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

        }
    })

    {
        /** Passing some request headers* */
        @Override
        public Map getHeaders() throws AuthFailureError {
            HashMap headers = new HashMap();
            headers.put("Content-Type", "application/json");
            headers.put("X-API-KEY", "CODEX@123");
            return headers;
        }
    };

    mRequestQueue.add(request);
}

}

【问题讨论】:

标签: java android android-recyclerview


【解决方案1】:

我认为这是 Vlad Kramarenko 推荐的解决方案。我刚刚在你的代码中实现了它,我同意它。 所以问题是一开始需要为RecyclerView设置Adapter。设置完成后,您通过 ExampleAdapter 将您的 ExampleItems 列表链接到您的 RecyclerView。现在,每次更改列表并想要更新 RecyclerView 时,都需要在链接到 RecyclerView 的 Adapter 上调用 notifyDataSetChanged() 方法。

private RecyclerView mRecyclerView;
private ExampleAdapter mExampleAdapter;
private ArrayList<ExampleItem> mExampleList;
private RequestQueue mRequestQueue;

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

    mRecyclerView = findViewById(R.id.recycler_view);
    mRecyclerView.setHasFixedSize(true);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    mRecyclerView.setHasFixedSize(true);

    mExampleList = new ArrayList<>();
    mExampleAdapter = new ExampleAdapter(MainActivity.this, mExampleList);
    mRecyclerView.setAdapter(mExampleAdapter);

    mRequestQueue = Volley.newRequestQueue(this);
    parseJSON();
}

private void parseJSON()
{
    String url = "http://apidev.travelhouse.world/api/v1/packages";
    JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new com.android.volley.Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            try {
                JSONArray jsonArray = response.getJSONArray("");

                for (int i = 0; i < jsonArray.length(); i++)
                {
                    JSONObject hit = jsonArray.getJSONObject(i);

                    String holiday_name = hit.getString("holiday_name");
                    String holiday_price = hit.getString("package_price");
                    String primary_image = hit.getString("primary_image");

                    mExampleList.add(new ExampleItem(primary_image,holiday_name,holiday_price));

                }

                mRecyclerView.getAdapter().notifyDataSetChanged();

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


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

        }
    })

    {
        /** Passing some request headers* */
        @Override
        public Map getHeaders() throws AuthFailureError {
            HashMap headers = new HashMap();
            headers.put("Content-Type", "application/json");
            headers.put("X-API-KEY", "CODEX@123");
            return headers;
        }
    };

    mRequestQueue.add(request);
}

【讨论】:

    【解决方案2】:

    也许这对你来说听起来很奇怪,但它说你创建了你的 recyclerview 但忘记将适配器添加到 recyclerView...但是不要忘记,你做到了。所以为什么?

    答案:当系统尝试绘制recyclerView时,它没有适配器。从服务器获得响应后,您在 parseJSON 函数中附加适配器。来自服务器的请求和响应需要一些时间,但与此同时系统完成绘制视图并说:嘿,您的 recyclerView 没有适配器,请修复它。你可以忽略这个警告,但如果你想让一切都完美:你可以在 onCreate 中附加空适配器,并在得到响应后执行

    mRecyclerView.getAdapter().notifyDataSetChanged();

    编辑: 这将如何看待你的 onCreate:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        mRecyclerView = findViewById(R.id.recycler_view);
        mRecyclerView.setHasFixedSize(true);
    
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        mRecyclerView.setHasFixedSize(true);
    
        mExampleList = new ArrayList<>();
        mRecyclerView.setAdapter(new ExampleAdapter(mExampleList, some arguments)
    
        mRequestQueue = Volley.newRequestQueue(this);
        parseJSON();
    }
    

    【讨论】:

    • 感谢您调查它,但它似乎仍然给出同样的错误。我在 onCreate 方法中创建了一个空适配器。你能告诉我你提到的代码在哪里适合我的代码吗?我想我放错了。
    • 他让你在recyclerView上设置适配器。在 onCreate 中而不是在 parseJson 函数中执行此操作。 mExampleAdapter = new ExampleAdapter(MainActivity.this, mExampleList); mRecyclerView.setAdapter(mExampleAdapter);然后在 parseJson 函数中将项目添加到列表中并使用 notifyDatasetChanged.
    • 弗拉德你能告诉我在哪里放置“mRecyclerView.getAdapter().notifyDataSetChanged();”正是在 parseJSON 方法中?就像你提到的那样,我制作了 onCreate 方法。
    • 把它放在你以后创建适配器的地方。也不要忘记更改列表
    【解决方案3】:

    在onCreate方法中,创建数组列表后添加

    mExampleAdapter = new ExampleAdapter(MainActivity.this, mExampleList);
    mRecyclerView.setAdapter(mExampleAdapter);
    

    从 try 子句中删除它们

    【讨论】:

    • 我就是这样做的,但它仍然给出了同样的错误。还有其他建议吗?
    猜你喜欢
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多