Не обновляется 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.