NotifyDataSetChanged () no se actualiza el adaptador

Mi lista de adaptadores está actualizando en el receptor de difusión.

Todo está funcionando bien si el tamaño de la lista del adaptador es mayor que 1, significa que si mi recyclerview tiene ya una fila shwoing después la lista que restaura apenas muy bien. Pero si el tamaño de la lista va de 0 a 1 entonces mi adaptador notifica el conjunto de datos Cambiado deja de funcionar. No hay datos sobre recyclerview. No sé por qué no está funcionando.

Recyclerview Clase:

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { v = inflater.inflate(R.layout.job_recyclerview, container, false); getActivity()); initialise(v); init(); showNoTaskMessage(); new loadListTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); mMyBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // Here you can refresh your listview or other UI SlidingTab.slidingTab.getTabAt(0).setText("New (" + SingleTon.getInstance().getNewjob() + ")"); SlidingTab.slidingTab.getTabAt(1).setText("In Progress (" + SingleTon.getInstance().getInprogressjob() + ")");; SlidingTab.slidingTab.getTabAt(2).setText("Completed (" + SingleTon.getInstance().getCompletedjob() + ")"); } }; try { IntentFilter filter = new IntentFilter("newJob"); LocalBroadcastManager.getInstance(context).registerReceiver(mMyBroadcastReceiver, filter); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return v; } 

Clase del adaptador:

  public JobAdapter(ArrayList<Info> myDataset, Context context) { this.mDataset = myDataset; this.mAct = context; } public void addApplications(ArrayList<Info> candidates) { if (this.filterList == null) { filterList = new ArrayList<>(); } this.mDataset.clear(); this.mDataset.addAll(candidates); this.filterList.addAll(mDataset); this.notifyItemRangeInserted(0, candidates.size() - 1); } public void clearApplications() { int size = this.mDataset.size(); if (size > 0) { for (int i = 0; i < size; i++) { mDataset.remove(0); filterList.remove(0); } this.notifyItemRangeRemoved(0, size); } } @Override public int getItemViewType(int position) { return VIEW_NORMAL; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_job_card, parent, false); ViewHolder fh = new ViewHolder(v); return fh; } @Override public void onBindViewHolder(final ViewHolder holder, final int position) { // holder.jobPhone.setText(mDataset.get(position).mobileNo); holder.jobNumber.setText(mDataset.get(position).jobNumber); holder.jobTime.setText(mDataset.get(position).time); holder.jobAddress.setText(mDataset.get(position).address); // holder.jobInstructionText.setText(mDataset.get(position).spclInstruction); if (mDataset.get(position).jobStatus != null && mDataset.get(position).jobStatus.equalsIgnoreCase("Completed")) { holder.endsat.setText("Submitted at"); holder.jobTime.setText(mDataset.get(position).completedOnString); holder.jobTimeLeft.setVisibility(View.INVISIBLE); holder.timerImage.setVisibility(View.INVISIBLE); } else { if (mDataset.get(position).status.equalsIgnoreCase("Active")) { holder.jobTimeLeft.setText(mDataset.get(position).appointmentTime); } else { holder.jobTimeLeft.setText("-" + mDataset.get(position).appointmentTime); } } holder.jobLayout1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SingleTon.getInstance().setWorkDescHolder(mDataset.get(position).descHolder); FragmentManager fragmentManager = ((FragmentActivity) mAct).getSupportFragmentManager(); FragmentTransaction ft = ((FragmentActivity) mAct).getSupportFragmentManager().beginTransaction(); ft.setCustomAnimations(R.anim.glide_fragment_horizontal_in, R.anim.glide_fragment_horizontal_out); ft.replace(R.id.content_frame1, new DetailsFragment(), "persondetails"); ft.addToBackStack("persondetails"); // Start the animated transition. ft.commit(); } }); } @Override public int getItemCount() { return mDataset.size(); } public class ViewHolder extends RecyclerView.ViewHolder { private TextView jobNumber, jobTimeLeft, jobStatus, jobAddress, jobEmail, jobPhone, timeTimer, jobInstructionText, jobTime, endsat; private ImageView timerImage; private FrameLayout frameLayout; private CardView cardView; private LayoutRipple jobLayout1; public ViewHolder(View v) { super(v); this.jobNumber = (TextView) v.findViewById(R.id.job_number); this.jobTime = (TextView) v.findViewById(R.id.job_time); this.jobTimeLeft = (TextView) v.findViewById(R.id.job_timertext); this.timerImage = (ImageView) v.findViewById(R.id.timerimage); this.cardView = (CardView) v.findViewById(R.id.card_view); // this.jobStatus = (TextView) v.findViewById(R.id.job_status); this.jobAddress = (TextView) v.findViewById(R.id.job_addresstext); // this.jobInstructionText = (TextView) v.findViewById(R.id.instruction_text); // this.jobLayout = (LayoutRipple)v.findViewById(R.id.job_cardLayout); this.jobLayout1 = (LayoutRipple) v.findViewById(R.id.cardLayout1); this.endsat = (AppCompatTextView) v.findViewById(R.id.endsat); this.jobNumber.setTypeface(Utils.RegularTypeface(mAct)); this.jobAddress.setTypeface(Utils.RegularTypeface(mAct)); this.jobTimeLeft.setTypeface(Utils.RegularTypeface(mAct)); this.jobTime.setTypeface(Utils.RegularTypeface(mAct)); } } } 

Por favor, ayúdame a encontrar el error o algún otro enfoque. Gracias

Llame a la tarea de carga de datos dentro de la onReceive() de BroadcastReceiver

  mMyBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // Here you can refresh your listview or other UI new loadListTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); SlidingTab.slidingTab.getTabAt(0).setText("New (" + SingleTon.getInstance().getNewjob() + ")"); SlidingTab.slidingTab.getTabAt(1).setText("In Progress (" + SingleTon.getInstance().getInprogressjob() + ")");; SlidingTab.slidingTab.getTabAt(2).setText("Completed (" + SingleTon.getInstance().getCompletedjob() + ")"); } }; 

Y también hacer los siguientes cambios en su clase de adaptador .

  public void addApplications(ArrayList<Info> candidates) { if (this.filterList == null) { filterList = new ArrayList<>(); } this.mDataset.clear(); this.mDataset.addAll(candidates); this.filterList.addAll(mDataset); this.notifyItemRangeInserted(0, candidates.size()); } public void clearApplications() { int size = this.mDataset.size(); if (size > 0) { for (int i = 0; i < size; i++) { mDataset.remove(i); filterList.remove(i); } this.notifyItemRangeRemoved(0, size); } } 

Espero que funcione!

Cambia esto:

 mMyBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // Here you can refresh your listview or other UI recycleAdapter.addItems(SingleTon.getInstance() .getInfoArrayList()); // I'm assuming your "SingleTon.getInstance().getInfoArrayList()" is the received data. } 

En tu adaptador

 public void addItems(List<Info> itemsList) { // This check could be avoided if you declared your mDataset final if(mDataset == null) { mDataset = new ArrayList<>(); } int prevSize = mDataset.size(); mDataset.addAll(itemsList); notifyItemRangeInserted(prevSize, itemsList.size()); } 

No debe llamar a notifyDataSetChanged () después de this.notifyItemRangeInserted(0, candidates.size() - 1); Probar algo como esto:

Ponga este método en su clase de adaptador

 public void setData(ArrayList<Info> infos) { this.mDataset = infos; notifyDataSetChanged(); } 

Y lo llaman así:

 ArrayList<Info> list = SingleTon.getInstance().getInfoArrayList().isEmpty(); if (list != null && !list.isEmpty()) { recycleAdapter.setData(list); } 

Corrija este método en su adaptador

 @Override public int getItemCount() { return mDataset != null && !mDataset.isEmpty() ? mDataset.size() : 0; } 

Base en su código, necesitamos una lista de variables para almacenar sus datos de información.

 //Declare the info list private ArrayList<Info> mInfos = new ArrayList<Info>() 

En su onCreateView() , defina mInfos en su recycleAdapter

 recycleAdapter = new JobAdapter(mInfos, getActivity()); recyclerView.setAdapter(recycleAdapter); 

Por lo tanto, cada vez que desee establecer nueva lista de información. Simplemente mInfos a mInfos y asegúrate de que mInfos datos de la lista anterior para evitar datos duplicados.

 mInfos.clear() mInfos.addAll(SingleTon.getInstance().getInfoArrayList()); //refresh data recycleAdapter.notifyDataSetChanged(); 

No estoy seguro de dónde está utilizando clearApplications () en JobAdapter.class. Pero, parece estar mal. En el bucle for, está intentando eliminar el valor en el índice 0 cada vez en lugar de índice 'i'. Espero que esto ayude.

Cuando está utilizando el adaptador personalizado then notifyDatasetChange () no se llama desde fuera de ese adaptador para que haga addItem función en el adaptador y agregar nueva lista en la lista de adaptadores y llamar a notifyDataSetChanged

 public void addItem(List<Model> list) { if (lit != null) { clear(); adapterList.addAll(list); } notifyDataSetChanged(); } 

Cambia En tu clase de reciclaje.

 //Change condition ">1" to "!=null" if (SingleTon.getInstance().getInfoArrayList().size() != null) { recycleAdapter.addApplications(SingleTon.getInstance().getInfoArrayList()); recycleAdapter.notifyDataSetChanged(); 

Y luego hacer cambios en su adaptador.

 public void addApplications(ArrayList<Info> candidates) { if (this.filterList == null) { filterList = new ArrayList<>(); } this.mDataset.clear(); this.mDataset.addAll(candidates); this.filterList.addAll(mDataset); this.notifyItemRangeInserted(0, mDataset.size()); //notify to mDataset } 

Espero que esto funcione

  • Elemento de Recyclerview efecto de ondulación de clic
  • ¿Cómo auto desplazarse hasta Recycler ver en Android?
  • Eliminar elementos de RecyclerView
  • Haga clic en un elemento de la lista RecyclerView
  • Android RecyclerView con volteo de CardView
  • RealmSearchAdapter no recicla la vista
  • Recuperando onBindViewHolder al desplazarse por la vista Recycler
  • Cómo reutilizar objetos RecyclerView, adaptadores y soportes de visualización
  • Android Recycler filtro adaptador de vista con animación
  • StaggeredGridLayout desordena al desplazarse hacia arriba
  • ¿Cómo ajustar correctamente el valor de elevación a recyclerview?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.