Не обновляется recyclerview при удалении последней оставшейся записи и при удалении сразу всех записей
Есть recyclerview, в котором отображаются записи из таблицы базы данных. В адаптере реализовано два варианта удаления записей (удаление одной выделенной записи и удаление всех записей). Если в таблице больше одной записи, то при удалении любой из них recyclerview обновляется нормально, но если в таблице осталась только одна запись, то при ее удалении recyclerview не обновляется, т.е. удаленная запись не исчезает (чтобы она исчезла нужно закрыть и открыть activity с recyclerview). Также не происходит обновления recyclerview если производится удаление всех записей одновременно (после удаления, записи продолжают отображаться в recyclerview). Как обновлять recyclerview при удалении последней оставшейся записи или всех записей одновременно?
// Получить все записи адресной книги:
public class GetAddressBook extends AsyncTask<String, Void, String> {
Context mContext;
RecyclerView mRv;
protected void onPreExecute(){}
protected String doInBackground(String... arg0) {
try {
URL url = new URL(ServerAPI.url_get_address_book);
// Формируем JSON из значений введенных в поля ввода:
JSONObject json = new JSONObject();
// Получение полей ввода:
json.put("uic", CurrentSettings.UserID);
return netS.httpConn(json, url);
}
catch(Exception e){
if(CurrentSettings.debugMsgVisualization)
return new String("Exception: " + e.getMessage());
else
return new String("");
}
}
GetAddressBook(Context ctx, RecyclerView rv){
this.mContext= ctx;
mRv = rv;
}
@Override
protected void onPostExecute(String result) {
// Создаем ArrayList:
ArrayList<AddressBookData> data = new ArrayList<>();
// Заполняем ArrayList данными:
try {
JSONArray jArray = new JSONArray(result);
// Извлекаем данные из JSON и записываем их в ArrayList, как объект класса CreditorsItemData:
for(int i=0;i<jArray.length();i++){
JSONObject json_data = jArray.getJSONObject(i);
AddressBookData addressBookData = new AddressBookData();
addressBookData.address_book_id = json_data.getString("address_book_id");
addressBookData.author_id = json_data.getString("author_id");
addressBookData.user_code = json_data.getString("user_code");
addressBookData.user_name = json_data.getString("user_name");
addressBookData.create_datetime = json_data.getString("create_datetime");
data.add(addressBookData);
}
// Получаем recyclerView, создаем экземпляр адаптера, создаем экземпляр LinearLyoutManager:
RecyclerView recyclerView = mRv;
RecyclerView.Adapter adapter = new AddressBookRecyclerViewAdapter(this.mContext, data, mRv);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this.mContext);
// Связываем recyclerView с адаптером и layout-менеджером:
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(layoutManager);
} catch (JSONException e) {
if(CurrentSettings.debugMsgVisualization)
Toast.makeText(this.mContext, e.toString(), Toast.LENGTH_LONG).show();
}
}
}
Код адаптера (обратите внимание на последний метод onPostExecute):
public class AddressBookRecyclerViewAdapter extends RecyclerView.Adapter<AddressBookRecyclerViewAdapter.RecyclerViewHolder> {
String current_code, // UIC лица из текущей записи.
current_name; // Имя лица из текущей записи.
int deletingRows = -1; // Количество удаляемых строк (1 - 1 строка, 0 - все строки).
private Context context;
private RecyclerView mRV;
private ArrayList<AddressBookData> arrayListAddressBook;
private ArrayList<AddressBookData> selectedItems = new ArrayList<AddressBookData>();
AddressBookData current_record; // Текущая, выбранная длинным кликом, запись.
// В конструкторе передаем данные из RecyclerView в адаптер:
public AddressBookRecyclerViewAdapter(Context context, ArrayList<AddressBookData> arrayListAddressBook, RecyclerView rv){
this.context=context;
this.arrayListAddressBook = arrayListAddressBook;
this.mRV = rv;
}
@NonNull
@Override
public AddressBookRecyclerViewAdapter.RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.ac_address_book_dlg_item, parent, false);
return new AddressBookRecyclerViewAdapter.RecyclerViewHolder(view);
}
@Override
public void onBindViewHolder(AddressBookRecyclerViewAdapter.RecyclerViewHolder holder, int position) {
holder.update(arrayListAddressBook.get(position));
}
@Override
public int getItemCount() {
return arrayListAddressBook.size();
}
class RecyclerViewHolder extends RecyclerView.ViewHolder {
LinearLayout frameLayout;
TextView tvAddressBookName, tvAddressBookUIC;
RecyclerViewHolder(View itemView) {
super(itemView);
frameLayout = itemView.findViewById(R.id.addressBookItemLayout);
frameLayout.setBackgroundColor(Color.RED);
tvAddressBookName = itemView.findViewById(R.id.tvAddressBookName);
tvAddressBookUIC = itemView.findViewById(R.id.tvAddressBookUIC);
}
void selectItem(AddressBookData item) {
selectedItems.add(item);
frameLayout.setBackgroundColor(Color.LTGRAY);
}
void update(final AddressBookData value) {
tvAddressBookName.setText(value.getUser_name().toString());
tvAddressBookUIC.setText(value.getUser_code().toString());
if (selectedItems.contains(value)) {
frameLayout.setBackgroundColor(Color.LTGRAY);
} else {
frameLayout.setBackgroundColor(Color.WHITE);
}
// Обработка длинных кликов:
itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
frameLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.colorAccent));
current_record = value;
current_code = value.getUser_code();
current_name = value.getUser_name();
final PopupMenu popupMenu = new PopupMenu(context, frameLayout);
popupMenu.inflate(R.menu.address_book_menu);
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.addressBookDeleteRow: // Удаляем одну запись:
deletingRows = 1;
new DeleteAddressBookRow().execute();
break;
case R.id.addressBookDeleteAllRow: // Удаляем все записи:
deletingRows = 0;
new DeleteAddressBookRow().execute();
break;
default:
break;
}
return false;
}
});
popupMenu.show();
return true;
}
});
// Обработка коротких кликов:
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Получаем позицию (номер строки) на которой был сделан клик:
int position = getAdapterPosition();
<Какой-то код, копирующий данные в поля другой activity>
}
});
}
}
public class DeleteAddressBookRow extends AsyncTask<String, Void, String> {
int pos;
protected void onPreExecute(){}
protected String doInBackground(String... arg0) {
try {
URL url = new URL(ServerAPI.url_delete_address_book_row);
// Формируем JSON из значений введенных в поля ввода:
JSONObject json = new JSONObject();
// Получение полей ввода:
json.put("author", CurrentSettings.UserID);
json.put("uic", current_code);
json.put("name", current_name);
if(deletingRows == 0) { // Удаляем все строки:
json.put("deletingRows", "0");
} else if(deletingRows == 1) { // Удвляем одну строку:
json.put("deletingRows", "1");
}
return netS.httpConn(json, url);
}
catch(Exception e){
if(CurrentSettings.debugMsgVisualization)
return new String("Exception: " + e.getMessage());
else
return new String("");
}
}
@Override
protected void onPostExecute(String result) {
**ЗДЕСЬ ЕЩЕ РАЗ ВЫЗЫВАЕМ ПОЛУЧЕНИЕ ДАННЫХ ИЗ ТАБЛИЦЫ ДЛЯ ОБНОВЛЕНИЯ В recyclerview**
new GetAddressBook(context, mRV).execute();
notifyDataSetChanged();
}
}
}