Не обновляется ListView при нажатии пункта PopupMenu в CustomAdapter

При нажатии кнопки в item появляется PopupMenu. Выбираю пункт "Удалить", сразу не обновляется список ListVeiw, только при следующем заходе в MainActivity. Как сделать, чтобы обновлялся сразу?

public class CustomAdapter extends SimpleCursorAdapter {

SQLiteDatabase db;
DBHelper dbHelper;
CustomAdapter customAdapter;


public CustomAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) {
    super(context, layout, c, from, to, flags);
}


@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    LayoutInflater inflater =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View v =inflater.inflate(R.layout.item_layout, null);
    return v;
}

@Override
public void bindView(final View view, final Context context, final Cursor cursor) {
    final TextView tvTurnoutDate = view.findViewById(R.id.tvTurnoutDate);
    final TextView tvTurnoutTime = view.findViewById(R.id.tvTurnoutTime);
    TextView tvEndOfWorkTime = view.findViewById(R.id.tvEndOfWorkTime);
    TextView tvStationStart = view.findViewById(R.id.tvStationStart);
    TextView tvStationFinish = view.findViewById(R.id.tvStationFinish);
    TextView tvDurationOfWork = view.findViewById(R.id.tvDurationOfWork);
    Button buttonPopup = view.findViewById(R.id.buttonPopup);

    String column1 = cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_1));
    String column2 = cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_2));
    String column3 = cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_3));
    String column4 = cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_4));
    String column5 = cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_5));
    String column6 = cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_6));

    buttonPopup.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(final View v) {
            final PopupMenu popupMenu = new PopupMenu(context, v);
            popupMenu.inflate(R.menu.popup_menu);
            popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    dbHelper = new DBHelper(context);
                    db =dbHelper.getWritableDatabase();
                    long id = cursor.getLong(cursor.getColumnIndex(DBHelper.COLUMN_ID));

                    switch (item.getItemId()){
                        case R.id.menuItem_change:
                            Toast.makeText(context, "Редактирование " , Toast.LENGTH_LONG).show();
                            return true;

                        case R.id.menuItem_delete:
                            db.delete("routeSheet", "_id = " + id, null);
                            Toast.makeText(context, "Удален пункт № " + id, Toast.LENGTH_LONG).show();

                            return true;

                        case R.id.menuItem_share:
                            Toast.makeText(context, "Поделиться ", Toast.LENGTH_LONG).show();
                            return true;
                        default:
                            return false;
                    }
                }
            });
            popupMenu.show();
        }
    });
    tvTurnoutDate.setText(column1);
    tvTurnoutTime.setText(column2);
    tvEndOfWorkTime.setText(column3);
    tvStationStart.setText(column4);
    tvStationFinish.setText(column5);
    tvDurationOfWork.setText(column6);

    super.bindView(view, context, cursor);
}

}

public class MainActivity extends AppCompatActivity {

Button btnAdd;
Button btnLogin;
Button btnSearch;
Button btnCalendar;
Button btnSetting;
ListView listView;

SQLiteDatabase db;
CustomAdapter customAdapter;
Cursor cursor;
DBHelper dbHelper;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btnAdd = findViewById(R.id.btnAdd);
    btnLogin = findViewById(R.id.btnLogin);
    btnSearch = findViewById(R.id.btnSearch);
    btnCalendar = findViewById(R.id.btnCalendar);
    btnSetting = findViewById(R.id.btnSetting);
    listView = findViewById(R.id.listView);

    dbHelper = new DBHelper(getApplicationContext());
}

@Override
protected void onPostResume() {
    super.onPostResume();
    // подключаемся к БД
    db = dbHelper.getReadableDatabase();

    // получаем данные в виде курсора
    cursor = db.rawQuery("select * from " + DBHelper.TABLE, null);

    // определяем в какие столбцы попадут данные из БД в ListView
    String [] headers = new String[] {DBHelper.COLUMN_1, DBHelper.COLUMN_2, DBHelper.COLUMN_3, DBHelper.COLUMN_4, DBHelper.COLUMN_5, DBHelper.COLUMN_6};
    int [] to = new int[] {R.id.tvTurnoutDate, R.id.tvTurnoutTime, R.id.tvEndOfWorkTime, R.id.tvStationStart, R.id.tvStationFinish, R.id.tvDurationOfWork};

    // создаем адаптер и передаем в него курсор
    customAdapter = new CustomAdapter(this, R.layout.item_layout, cursor, headers, to, 0 );
    listView.setAdapter(customAdapter);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    db.close();
    cursor.close();
}

public void bottomMenu(View view){
    switch (view.getId()){
        case R.id.btnAdd:
            Intent intentAdd = new Intent(this,NewAddActivity.class);
            startActivityForResult(intentAdd, 1);
            break;
        case R.id.btnLogin:
            Intent intentLogin = new Intent(this, LoginActivity.class);
            startActivity(intentLogin);
            break;
        case R.id.btnSearch:
            Intent intentSearch = new Intent(this, SearchActivity.class);
            startActivity(intentSearch);
            break;
        case R.id.btnCalendar:
            Intent intentCalendar = new Intent(this, CalendarActivity.class);
            startActivity(intentCalendar);
            break;
        case R.id.btnSetting:
            Intent intentSetting = new Intent(this, SettingActivity.class);
            startActivity(intentSetting);
            break;

    }
}
}

Пробовал в CustomAdapter метод notifyDataSetChanged();

switch (item.getItemId()){
                        case R.id.menuItem_change:
                            Toast.makeText(context, "Редактирование " , Toast.LENGTH_LONG).show();
                            return true;

                        case R.id.menuItem_delete:
                            db.delete("routeSheet", "_id = " + id, null);
                            Toast.makeText(context, "Удален пункт № " + id, Toast.LENGTH_LONG).show();
                            **notifyDataSetChanged();**
                            return true;

                        case R.id.menuItem_share:
                            Toast.makeText(context, "Поделиться ", Toast.LENGTH_LONG).show();
                            return true;
                        default:
                            return false;
                    }

Пробовал метод swapCursor();

switch (item.getItemId()){
                        case R.id.menuItem_change:
                            Toast.makeText(context, "Редактирование " , Toast.LENGTH_LONG).show();
                            return true;

                        case R.id.menuItem_delete:
                            db.delete("routeSheet", "_id = " + id, null);
                            Toast.makeText(context, "Удален пункт № " + id, Toast.LENGTH_LONG).show();
                            swapCursor(cursor);
                            return true;

                        case R.id.menuItem_share:
                            Toast.makeText(context, "Поделиться ", Toast.LENGTH_LONG).show();
                            return true;
                        default:
                            return false;
                    }

Ничего не помогает. В чем ошибка?


Ответы (2 шт):

Автор решения: Darsi

Можете попробовать это.

    private void goHome() {
        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        startActivity(intent);

    }

И потом вызвать в нужном месте goHome()

→ Ссылка
Автор решения: Andrey Mihalev

Т.к. вы используете и SQL и ListView (рекомендую сразу переходить на RecyclerView), то swapCursor и notifyDataSetChanged не дадут результата по одиночке.

Нужно сначала обновить курсор в адаптере методом swapCursor, а после информировать адаптер об изменениях в данных вызовом notifyDataSetChanged.

→ Ссылка