0

I am fetching data from json url and displaying it into recyclerview but i am getting this error. Adapter is attached but it always showing that no adapter attached.

Error:

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: Skipped 41 frames! The application may be doing too much work on its main thread. 04-14 18:23:33.158 24038-24038/com.example.englishgaane E/RecyclerView: No adapter attached; skipping layout

MainActivity Code:

@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);
}

}

Geetika Sachdeva
  • 103
  • 2
  • 10

2 Answers2

0

Set LayoutManager to your recyclerview

akashzincle
  • 1,108
  • 6
  • 15
0

You should set both adapter and layout manager in OnCreate as such errors are thrown when doing these operations in a delayed method. If you try this in a postDelayed handler you'd get the same error.

Something to note, you should move both setting adapter and setting layout manager outside the delayed onResponse callback. If you just do the former you'd get the error,

No layout manager attached; skipping layout. 

You are also reinitializing your adapter after setting it. Instead of doing this just set data into the adapter. But you must move your code outside the delayed methods first.

So, move the adapter and layout manager setting code outside the delayed onResponse callback to the activity onCreate() like this

    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());

Then create a method setData() in your adapter like this

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

Then in the onResponse() do this to update the data.

 adapter.setData(newModels);
 adapter.notifyDataSetChanged();
varunkr
  • 5,364
  • 11
  • 50
  • 99