En realidad, estoy obteniendo datos del servidor y mostrando eso en mi recyclerview. Pero no mostraba nada. Incluso después de muchas preguntas de referencia, mi problema no se pudo resolver, pero luego intenté usar el método setAdapter() después de buscar datos y ahora mi problema está resuelto. Pero lo que pregunto es ¿Es inusual usar setAdapter más de una vez? En mi primer intento, estaba configurando el adaptador primero y luego tratando de usar adp.notifyDataSetChanged() después de recuperar los datos del servidor. pero ahora estoy configurando el adaptador nuevamente después de obtener datos.

Código:

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 mar. 2018 a las 16:18

5 respuestas

La mejor respuesta

Finalmente descubrí el problema. El problema estaba allí al construir el adaptador dos veces. Ahora he eliminado la próxima construcción del adaptador y el setAdapter() también y funciona sin ningún error.

Código anterior :

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

Nuevo código :

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 mar. 2018 a las 20:22

Llame al método adapter.notifyDataSetChanged() para actualizar el adaptador RecyclerView después de agregar datos a la lista de arrays que está conectada al adaptador.

También puede llamar al método notifyItemInserted(index) que puede mostrar el elemento agregado con efecto de animación.

0
Chintak Patel 1 mar. 2018 a las 13:31

Creo que es habitual usar setAdapter varias veces, ya que no creará ningún problema en la funcionalidad. Pero si quieres usar

notifyDataSetChanged()

Luego intente no reiniciar sus datos mientras recibe los datos si realiza

yourData = newData

Entonces esto reinicializará sus datos antiguos y notifyDataSetChanged () no funcionará en eso

Si es una cadena, intente concatenar en la instancia actual.

0
Harsh Patel 1 mar. 2018 a las 13:39

Hacer algún cambio en el método como el siguiente código ...

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

Y crea un método setAdapter como ...

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

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

Y elimine el código onCreate () define recyclerView.setAdapter (adaptador);

0
Android Team 1 mar. 2018 a las 14:15

La forma correcta es llamar a notifyDataSetChanged en el adaptador u otros métodos de esa familia. El problema con la configuración del adaptador será que se perderá su posición de desplazamiento.

Parece que el problema está en tu CustomRecyclerViewAdapter. Una buena práctica es mover timelineDatalist a CustomRecyclerViewAdapter y tener algo como:

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

Publique su CustomRecyclerViewAdapter para más detalles.

0
TpoM6oH 1 mar. 2018 a las 13:39