【问题标题】:While setting adapter with recyclerview "No Adapter Attached" is coming使用 recyclerview 设置适配器时“未连接适配器”即将到来
【发布时间】:2020-04-14 12:57:48
【问题描述】:

我正在从 json url 获取数据并将其显示到 recyclerview 中,但我收到此错误。 适配器已连接,但始终显示未连接适配器。

错误:

04-14 18:23:32.758 24038-24038/com.example.englishgaane E/RecyclerView: No adapter attached; skipping layout

04-14 18:23:32.758 24038-24038/com.example.englishgaane I/Choreographer:跳过了 41 帧!应用程序可能在其主线程上做了太多工作。 04-14 18:23:33.158 24038-24038/com.example.englishgaane E/RecyclerView:未连接适配器;跳过布局

MainActivity 代码:

@Override
protected void onCreate(Bundle savedInstanceState) {

    SliderView sliderView;

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    recyclerView = findViewById(R.id.recyclerview);
    recyclerView.setAdapter(adapter);
    sliderView = findViewById(R.id.imageSlider);
    newModels = new ArrayList<>();
    extractdata();


    TypedArray sliderimages = getResources().obtainTypedArray(R.array.artist_images);
    sliderModels = new ArrayList<>();
    for(int i =0; i<sliderimages.length(); i++){
        SliderModel sliderModel = new SliderModel(sliderimages.getResourceId(i, 0));
        sliderModels.add(sliderModel);
    }
    SlideAdapter adapter1 = new SlideAdapter(sliderModels, this);
    sliderView.setSliderAdapter(adapter1);
    sliderView.setIndicatorAnimation(IndicatorAnimations.WORM);
    sliderView.setSliderTransformAnimation(SliderAnimations.SIMPLETRANSFORMATION);
    sliderView.setAutoCycleDirection(SliderView.AUTO_CYCLE_DIRECTION_BACK_AND_FORTH);
    sliderView.setIndicatorSelectedColor(Color.RED);
    sliderView.setIndicatorUnselectedColor(Color.BLACK);
    sliderView.setScrollTimeInSec(2);
    sliderView.startAutoCycle();

}
public void extractdata() {
    RequestQueue queue = Volley.newRequestQueue(this);
    StringRequest request = new StringRequest(Request.Method.GET, JSON_URL, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            try {
                JSONObject object = new JSONObject(response);
                JSONArray array = object.getJSONArray("artist_data");
                JSONArray array1 = object.getJSONArray("all_data");
                Singleton.getConstant().addarray(array1);
                TypedArray images = getResources().obtainTypedArray(R.array.artist_images);
                for (int i = 0; i < array.length(); i++) {
                    JSONObject object1 = array.getJSONObject(i);
                    String name = object1.getString("artist");
                    NewModel newModel = new NewModel(images.getResourceId(i, 0), name);
                    newModels.add(newModel);
                }
                LinearLayoutManager linearLayoutManager2 = new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.HORIZONTAL, false);
                recyclerView.setLayoutManager(linearLayoutManager2);
                recyclerView.setItemAnimator(new DefaultItemAnimator());
                adapter = new RecyclerAdapter(newModels, getApplicationContext(), clickinterface);
                adapter.notifyDataSetChanged();
            } catch (JSONException e) {
                e.printStackTrace();
            }

        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.d("tag", "OnErrorResponse"+error.getMessage());

        }
    });
    queue.add(request);
}

}

【问题讨论】:

标签: java android json android-fragments android-recyclerview


【解决方案1】:

您应该在OnCreate 中设置适配器和布局管理器,因为在延迟方法中执行这些操作时会引发此类错误。如果你在 postDelayed 处理程序中尝试这个,你会得到同样的错误。

需要注意的是,您应该将设置适配器和设置布局管理器移到延迟的onResponse 回调之外。如果你只做前者,你会得到错误,

No layout manager attached; skipping layout. 

您也在设置适配器后重新初始化它。而不是这样做只是将数据设置到适配器中。但是您必须首先将代码移到延迟方法之外。

所以,像这样将延迟的onResponse 回调之外的适配器和布局管理器设置代码移动到活动onCreate()

    recyclerView = findViewById(R.id. recyclerview);
    adapter = new RecyclerAdapter(new ArrayList<NewModel>());
    recyclerView.setAdapter(adapter);
    LinearLayoutManager linearLayoutManager2 = new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.HORIZONTAL, false);
    recyclerView.setLayoutManager(linearLayoutManager2);
    recyclerView.setItemAnimator(new DefaultItemAnimator());

然后像这样在你的适配器中创建一个方法setData()

public void setData(ArrayList<NewModel> list) {
    this.list = list;
}

然后在 onResponse() 中执行此操作以更新数据。

 adapter.setData(newModels);
 adapter.notifyDataSetChanged();

【讨论】:

    【解决方案2】:

    将 LayoutManager 设置为您的回收站视图

    【讨论】:

    • 第一次在oncreate中设置适配器,然后layoutmanager不见了,也试试
    猜你喜欢
    • 1970-01-01
    • 2018-02-04
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多