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
- RecyclerView onBindViewHolder sólo se llama cuando los cambios getItemViewType
- Cómo cambiar el tipo de vista de un elemento RecyclerView onClick
- Recyclerview Adaptador y Glide - misma imagen cada 4-5 filas
- Facebook Anuncios nativos en RycyclerView android
- Problemas con vistas dinámicas dentro de la vista del reciclador
- RecyclerView se desplaza hacia arriba en notifyDataSetChanged en la pantalla de chat
- No se puede agregar vista vacía abajo Recyclerview
- Cómo eliminar el elemento de RecyclerView con demora
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
- Android: destacar estáticamente el texto dinámico en TextView
- Desplazarse por una vista y actualizar el contenido