Search code examples
androidlistviewrealmscrollview

How to refresh ListView inside scrollView after delete data of ListView using Realm?


I am using ListView which is inside ScrollView. Whenever i perform delete operation on ListView data is delete but problem is after delete data unfortunately app has stopped. I am using realm to store data and delete data from realm. This is my code.

listViewSearchCity.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            PostUserItinerary item = (PostUserItinerary) listViewSearchCity.getItemAtPosition(i);
            view.setBackgroundColor(Color.parseColor("#a9a9a9"));
            // change1();
            h=item.getSearchCity();
            onclick();
            // onitemclick();

        }
    });
public void onclick()
{

    imgDelete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //PostItinerarySearchCityAdapter adapter = new PostItinerarySearchCityAdapter(PostUserItineraryActivity.this,helper.justRefresh());
            String type =h ;
            final RealmResults<PostUserItinerary> students = realm.where(PostUserItinerary.class).findAll();

            PostUserItinerary postUserItinerary = students.where().equalTo("searchCity", type).findFirst();

            if (postUserItinerary != null) {

                if (!realm.isInTransaction()) {
                    realm.beginTransaction();
                }

                postUserItinerary.deleteFromRealm();
                realm.commitTransaction();
                adapter.notifyDataSetChanged();
               // listViewSearchCity.setAdapter(adapter);

            }
        }
        //final int position2 = holder.getAdapterPosition();



    });

}

This is my log show.

10-17 10:51:09.717 6586-6586/com.xitiz.xitizmobile E/AndroidRuntime: FATAL EXCEPTION: main Process: com.xitiz.xitizmobile, PID: 6586 java.lang.NullPointerException at com.xitiz.xitizmobile.PostUserItineraryActivity$7.onClick(PostUserItineraryActivity.java:327) at android.view.View.performClick(View.java:4444) at android.view.View$PerformClick.run(View.java:18440) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5052) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:796) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612) at dalvik.system.NativeStart.main(Native Method)


Solution

  • The simple way to do it would be to make PostItinerarySearchCityAdapter extends RealmBaseAdapter<PostUserItinerary>, initialize it with a RealmResults<PostUserItinerary> directly, then remove any calls you made directly to adapter.notifyDataSetChanged();.

    You can see an example Activity and Adapter in Realm's samples.

    class MyListAdapter extends RealmBaseAdapter<PostUserItinerary> implements ListAdapter {
    
        private static class ViewHolder {
            TextView countText;
            CheckBox deleteCheckBox;
        }
    
        MyListAdapter(OrderedRealmCollection<Counter> realmResults) {
            super(realmResults);
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder viewHolder;
            if (convertView == null) {
                convertView = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.row, parent, false);
                viewHolder = new ViewHolder();
                viewHolder.countText = (TextView) convertView.findViewById(R.id.textview);
                viewHolder.deleteCheckBox = (CheckBox) convertView.findViewById(R.id.checkBox);
                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
    
            final PostUserItinerary item = getItem(position);
            ...
            return convertView;
        }
    }
    

    and

    public class ListViewExampleActivity extends AppCompatActivity {
    
        private Realm realm;
        private MyListAdapter adapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_listview);
            realm = Realm.getDefaultInstance();
    
            // RealmResults are "live" views, that are automatically kept up to date, even when changes happen
            // on a background thread. The RealmBaseAdapter will automatically keep track of changes and will
            // automatically refresh when a change is detected.
            adapter = new MyListAdapter(realm.where(PostUserItinerary.class).findAllAsync());