Пока идет настройка адаптера с утилитой просмотра "Адаптер не подключен" - PullRequest
0 голосов
/ 14 апреля 2020

Я получаю данные с json URL-адреса и отображаю их в программе просмотра, но получаю эту ошибку. Адаптер подключен, но он всегда показывает, что адаптер не подключен.

Ошибка:

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 / Хореограф: Пропустил 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);
}

}

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Вы должны установить адаптер и менеджер компоновки в 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();
0 голосов
/ 14 апреля 2020

Установите LayoutManager на свой просмотрщик

...