1

my problem when data come to ArrayAdapter the listview not Update to the last data I have to go to another page and go back to update the listview the problem listview not updated automatic

my action in this code is when data updated on firebase i a insert that data on arraylist and put the arraylist inside the arrayAdapter and i start the app its work and if i add another data into my data base and go to another page and go back to my listview on my app it's showing last data without any problem but when i stay on the listview when new data come and toch any of listview the app go on to crash and IllegalStateException come plz any help for my problem and sorry for me english it not very well i hope you understand the problem and i use mvvm design pattern my code

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
   groupfragmentview = inflater.inflate(R.layout.fragment_group, container, false);
    list_View = (ListView) groupfragmentview.findViewById(R.id.list_view);
    //
    myview = ViewModelProvider.AndroidViewModelFactory.getInstance(getActivity().getApplication()).create(group_frg_view.class);
    myview.init();
    myview.getgroup().observe(this.getActivity(), new Observer<group_frg_model>() {
        @Override
        public void onChanged(final group_frg_model group_frg_model) {

            updateUI(group_frg_model);


            list_View.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    String groupname = parent.getItemAtPosition(position).toString();
                    String groupid= group_frg_model.getGroupid().get(position);
                    String TAG=null;
                    Log.d(TAG,"name " + groupid);
                    Intent groupintent = new Intent(getContext(),GroupChatActivity.class);
                    groupintent.putExtra("groupname",groupname);
                    groupintent.putExtra("groupid",groupid);
                    startActivity(groupintent);


                }
            });






        }
    });


    return groupfragmentview;
}

private void updateUI(group_frg_model group_frg_model) {

    array_Adapter = new ArrayAdapter<>(getActivity(), R.layout.single_row_group_list, R.id.group_name,group_frg_model.getGroupname());
    list_View.setAdapter(array_Adapter);
    list_View.requestLayout();
    array_Adapter.notifyDataSetChanged();



}

the IllegalStateException

  java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. Make sure your adapter calls notifyDataSetChanged() when its content changes. [in ListView(2131230911, class android.widget.ListView) with Adapter(class android.widget.ArrayAdapter)]
    at android.widget.ListView.layoutChildren(ListView.java:1618)
    at android.widget.AbsListView.onTouchUp(AbsListView.java:4013)
    at android.widget.AbsListView.onTouchEvent(AbsListView.java:3806)
    at android.view.View.dispatchTouchEvent(View.java:9943)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2663)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2344)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
    at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:411)
    at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1810)
    at android.app.Activity.dispatchTouchEvent(Activity.java:3061)
    at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69)
    at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69)
    at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:373)
    at android.view.View.dispatchPointerEvent(View.java:10163)
    at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4434)
    at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4302)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3849)
    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3902)
    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3868)
    at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3995)
    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3876)
    at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4052)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3849)
    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3902)
    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3868)
    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3876)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3849)
    at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6210)
    at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6184)
    at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6145)
    at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6313)
    at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
    at android.os.MessageQueue.nativePollOnce(Native Method)
    at android.os.MessageQueue.next(MessageQueue.java:323)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:6077)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
mr.dro
  • 11
  • 1
  • 2
  • you can initialize the adapter once and then only update the list and call notifyDataSetChanged. also switch to RecyclerView. – Raghunandan Mar 16 '20 at 06:32

2 Answers2

0

call this array_Adapter.notifyDataSetChanged(); where your list gone changed like where you got you api response

Amit pandey
  • 1,149
  • 1
  • 4
  • 15
  • i call array_Adapter.notifyDataSetChanged(); after the data insert into listview but nothing change – mr.dro Mar 16 '20 at 05:43
  • array_Adapter = new ArrayAdapter<>(getActivity(), R.layout.single_row_group_list, R.id.group_name,group_frg_model.getGroupname()); list_View.setAdapter(array_Adapter); list_View.requestLayout(); array_Adapter.notifyDataSetChanged(); – mr.dro Mar 16 '20 at 05:45
0

i solve my problem thanks all Upon searching I found that the data was delayed and the listview don't know about any change of data i just a edit the Repository model when the datachange and don then inform the list or arraylist on data change

mr.dro
  • 11
  • 1
  • 2