На самом деле я получаю данные с сервера и показываю это на моем recyclerview. Но это ничего не показывало. Даже после большого количества вопросов моя проблема не могла быть решена, но затем я попытался использовать метод setAdapter() после получения данных, и теперь моя проблема решена. Но я спрашиваю: Необычно ли использовать setAdapter более одного раза? . В своей первой попытке я сначала настраивал адаптер, а затем пытался использовать adp.notifyDataSetChanged() после получения данных с сервера. но теперь я снова устанавливаю адаптер после получения данных.

Код:

private List<TImelineDataList> timelineDatalist;
@Override
public void onViewCreated(@NonNull View v, @Nullable Bundle savedInstanceState) {


    timelineDataList= new ArrayList<>();
    adapter=new CustomRecyclerViewAdapter(timelineDataList);
    recyclerView.setItemViewCacheSize(30);
    recyclerView.setDrawingCacheEnabled(true);
    recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
    recyclerView.setLayoutManager(new 
    LinearLayoutManager(ctx,LinearLayoutManager.HORIZONTAL,false));
    recyclerView.setAdapter(adapter);

}
 void addTimelineData(String email,String time,String img_link,String caption){
    timelineDataList.add(new TimelineData(email,time,img_link,caption));
    adapter=new CustomRecyclerViewAdapter(timelineDataList);
    adapter.notifyDataSetChanged();
    recyclerView.setAdapter(adapter);
}
  private  Emitter.Listener handlePosts = new Emitter.Listener(){

    @Override
    public void call(final Object... args){
        try {
            JSONArray jsonArray=(JSONArray)args[0];

               for(int i=0;i<jsonArray.length();i++){
                   try {
                       JSONObject ob=jsonArray.getJSONObject(i);
                       demo_email=ob.getString("_pid");

                       demo_time=ob.getString("time");

                       demo_link=ob.getString("img_link");

                       demo_caption=ob.getString("caption");


                       addTimelineData(demo_email,demo_time,demo_link,demo_caption);

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




        } catch (Exception e) {
            Log.e("error",e.toString());
        }
    }
};
1
anonymous 1 Мар 2018 в 16:18

5 ответов

Лучший ответ

Наконец-то я разобрался с проблемой. Проблема была в том, чтобы построить адаптер дважды. Теперь я удалил следующую конструкцию адаптера и setAdapter(), и он работает без ошибок.

Предыдущий код .

private List<TImelineDataList> timelineDatalist;
@Override
public void onViewCreated(@NonNull View v, @Nullable Bundle savedInstanceState) {


    timelineDataList= new ArrayList<>();
    **adapter=new CustomRecyclerViewAdapter(timelineDataList);**//Here
    recyclerView.setItemViewCacheSize(30);
    recyclerView.setDrawingCacheEnabled(true);
    recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
    recyclerView.setLayoutManager(new 
    LinearLayoutManager(ctx,LinearLayoutManager.HORIZONTAL,false));
    recyclerView.setAdapter(adapter);

}
 void addTimelineData(String email,String time,String img_link,String caption){
    timelineDataList.add(new TimelineData(email,time,img_link,caption));
    **adapter=new CustomRecyclerViewAdapter(timelineDataList);**//Here
    adapter.notifyDataSetChanged();
    recyclerView.setAdapter(adapter);
}
  private  Emitter.Listener handlePosts = new Emitter.Listener(){

    @Override
    public void call(final Object... args){
        try {
            JSONArray jsonArray=(JSONArray)args[0];

               for(int i=0;i<jsonArray.length();i++){
                   try {
                       JSONObject ob=jsonArray.getJSONObject(i);
                       demo_email=ob.getString("_pid");

                       demo_time=ob.getString("time");

                       demo_link=ob.getString("img_link");

                       demo_caption=ob.getString("caption");


                       addTimelineData(demo_email,demo_time,demo_link,demo_caption);

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




        } catch (Exception e) {
            Log.e("error",e.toString());
        }
    }
};

Новый код .

private List<TImelineDataList> timelineDatalist= new ArrayList<>();;
@Override
public void onViewCreated(@NonNull View v, @Nullable Bundle savedInstanceState) {



    adapter=new CustomRecyclerViewAdapter(timelineDataList);
    recyclerView.setItemViewCacheSize(30);
    recyclerView.setDrawingCacheEnabled(true);
    recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
    recyclerView.setLayoutManager(new 
    LinearLayoutManager(ctx,LinearLayoutManager.HORIZONTAL,false));
    recyclerView.setAdapter(adapter);

}
 void addTimelineData(String email,String time,String img_link,String caption){
    timelineDataList.add(new TimelineData(email,time,img_link,caption));
    adapter.notifyDataSetChanged():
}
  private  Emitter.Listener handlePosts = new Emitter.Listener(){

    @Override
    public void call(final Object... args){
        try {
            JSONArray jsonArray=(JSONArray)args[0];

               for(int i=0;i<jsonArray.length();i++){
                   try {
                       JSONObject ob=jsonArray.getJSONObject(i);
                       demo_email=ob.getString("_pid");

                       demo_time=ob.getString("time");

                       demo_link=ob.getString("img_link");

                       demo_caption=ob.getString("caption");


                       addTimelineData(demo_email,demo_time,demo_link,demo_caption);

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




        } catch (Exception e) {
            Log.e("error",e.toString());
        }
    }
};
1
anonymous 1 Мар 2018 в 20:22

Вызвать метод adapter.notifyDataSetChanged() для обновления адаптера RecyclerView после добавления данных в массив, который подключен к адаптеру.

Вы также можете вызвать метод notifyItemInserted(index), который может показать элемент, добавленный с эффектом анимации.

0
Chintak Patel 1 Мар 2018 в 13:31

Я думаю, что обычно использовать setAdapter несколько раз, поскольку это не создает никаких проблем с функциональностью. Но если вы хотите использовать

notifyDataSetChanged()

Затем попытайтесь не повторной инициализации ваших данных при получении данных, если вы выполняете

yourData = newData

Тогда это будет повторно инициализировать ваши старые данные и notifyDataSetChanged () не будет работать на этом

Если его строка, то попробуйте объединить в текущем экземпляре.

0
Harsh Patel 1 Мар 2018 в 13:39

Внесите некоторые изменения в метод, как показано ниже:

        void addTimelineData (String email, String time, String img_link, String caption){
        timelineDataList.clear()
        timelineDataList.add(new TimelineData(email, time, img_link, caption));
        setAdapter();
    }

И сделать один метод setAdapter как ..

  public void setAdapter(){
    if (adpter==null){
        if(!timelineDataList.isEmpty()){
            adapter = new CustomRecyclerViewAdapter(timelineDataList);

        }
    }
    else{
        adapter.notifyDataSetChanged();
    }
}

И удалите код onCreate (), определите recyclerView.setAdapter (адаптер);

0
Android Team 1 Мар 2018 в 14:15

Правильный способ - вызвать notifyDataSetChanged для адаптера или других методов этого семейства. Проблема с настройкой адаптера будет в том, что ваша позиция прокрутки будет потеряна.

Похоже, проблема в вашем CustomRecyclerViewAdapter. Хорошей практикой является перемещение timelineDatalist в CustomRecyclerViewAdapter и получение чего-то вроде:

void addTimelineData(String email,String time,String img_link,String caption){
    adapter.addToTimelineDataList(new TimelineData(email,time,img_link,caption));
    adapter.notifyDataSetChanged();
}

Пожалуйста, оставьте свой CustomRecyclerViewAdapter для более подробной информации.

0
TpoM6oH 1 Мар 2018 в 13:39