ArrayAdapter.NotifyDataSetChanged () no está funcionando?

Tengo una lista que puede actualizar el usuario, pero notifyDataSetChanged() no funciona en el adaptador asociado con listView . Lo estoy usando en un fragmento. Datbase se actualiza, pero el adpater no lo hace. Lo siguiente es mi implementación:

Mi Fargment principal:

 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); myArrayList = new ArrayList(); myArrayList = Database.getSharedObject(getActivity()).getMyList(); if (myArrayList != null && myArrayList.size() > 0) { adapter = new myListAdapter(getActivity(), 0, myArrayList); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.mainfragment, container, false); myListView = (ListView) v.findViewById(R.id.my_list_view); myListView.setOnItemClickListener(this); if (adapter != null) { myListView.setAdapter(adapter); } return v; } 

Después de un proceso de navegación, la Lista se actualiza y en mi método onResume() obtengo la Lista actualizada de la base de datos y llamo notifyDatasetChanged() método notifyDatasetChanged() que no actualiza mi vista, sin embargo la matriz correspondiente de DB se actualiza.

 @Override public void onResume() { super.onResume(); myArrayList = Database.getSharedObject(getActivity()).getMyList(); adapter.setItems (myArrayList); adapter.notifyDataSetChanged(); } 

MyListAdapter

 public class MyListAdapter extends ArrayAdapter { private ArrayList myList; /* Context */ private Context context; public void setItems (ArrayList myList) { this.myList = myList; } public MyListAdapter (Context context, int textViewResourceId, ArrayList myList) { super(context, textViewResourceId, myList); this.context = context; this.myList = myList; } @Override public View getView (int position, View v, ViewGroup parent) { // Keeps reference to avoid future findViewById() MyViewHolder viewHolder; if (v == null) { LayoutInflater li = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = li.inflate(R.layout.list_row, parent, false); viewHolder = new MyViewHolder(); viewHolder.txtImage = (ImageView) v.findViewById(R.id.message_icon); viewHolder.txtMessage = (TextView) v.findViewById(R.id.message); viewHolder.txtDate = (TextView) v.findViewById(R.id.date); v.setTag(viewHolder); } else { viewHolder = (MyViewHolder) v.getTag(); } Message myMessage = new Message(); myMessage = myList.get(position); if (myMessage != null) { viewHolder.txtMessage.setText(myMessage.getText()); viewHolder.txtDate.setText(myMessage.getDate()); } return v; } static class MyViewHolder { ImageView txtImage; TextView txtMessage; TextView txtDate; } } 

¿Alguna idea de lo que está pasando mal? ¿Por qué no se actualiza la lista? Cualquier ayuda es apreciada.

notifyDataSetChanged() no funcionará para usted. Razones por las cuales

  1. Su adaptador pierde referencia a su lista.
  2. Siempre creando y agregando una nueva lista al Adaptador. Haga esto: inicialice ArrayList mientras declara globalmente.

    ArrayList myArrayList=new ArrayList(); // como una variable global

    Agregue la lista al adaptador directamente sin verificar la condición nula y vacía. Configure el adaptador directamente en la lista (no verifique ninguna condición)

    myListView.setAdapter(adapter);

  3. Agregue datos a myArrayList todas las veces (si sus datos son completamente nuevos, puede llamar a adapter.clear () y myArrayList.clear () antes de agregar datos a la lista) pero no configure el adaptador, es decir, si los datos son nuevos. poblado en myArrayList que simplemente adapter.notifyDataSetChanged()

     adapter = new myListAdapter(getActivity(), 0, myArrayList); 
  4. Eliminar esta linea

    adapter.setItems (myArrayList);

Simplemente sobre el método getCount

  @Override public int getCount() { return myArrayList.count(); } 

En su método setItems intente borrar el ArrayList anterior.

en lugar de esto:

 public void setItems(ArrayList myList) { this.myList = myList; } 

Prueba esto:

 public void setItems(ArrayList myList) { this.myList.clear(); this.myList.addAll(myList); notifyDataSetChanged(); } 

El problema está en el constructor de MyListAdapter

En lugar de

 public MyListAdapter(Context context, int textViewResourceId, ArrayList myList) { super(context, textViewResourceId, scheduledMessageList); this.context = context; this.myList = myList; } 

tratar

 public MyListAdapter(Context context, int textViewResourceId, ArrayList myList) { super(context, textViewResourceId, myList); this.context = context; this.myList = myList; } 

también en lugar de tener su propio método SetItems, debe llamar a adapter.clear(); seguido de adapter.addAll(myArrayList);

Si puede usar notifyDataSetChanged() pero en Adapter! crea un pequeño método dentro