I'm having an issue that i'm trying to solve for days.
I have a filter method in my RecyclerView that search for certain items by writing something in an EditText. The RecyclerView is opening in a Dialog and the list is populated from the activity with two edittext and after pressing a button they are going to be added in list.
Until here everything is working fine, but I've added a swipe method that should delete items from RecyclerView, but it's working in a strange way.
If I open it (Dialog) and delete some items everything is working fine and even if I search for an item and delete it, it works fine as well, but the issue comes when...
I search for an item and then delete it (Item gets deleted as expected) but then I delete another item without searching for it (items swipe away), but when I close the dialog and reopen it the deleted item without searching returns to the list.
Here is a video example of what is happening. As you can see I'm searching for 5 and deleting it then I am deleting 6 and 7, but when I reopen Dialog, 6 and 7 are still here. Obviously if i delete them again they will get deleted.
Here is my adapter code and my Dialog method from Activity:
@TargetApi(Build.VERSION_CODES.KITKAT)
public void customAlertItems() {
final Dialog dialog = new Dialog(this);
dialog.setCancelable(false);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.alert_data);
RecyclerView recyclerView = dialog.findViewById(R.id.myRecyclerView);
final EditText edtSearch = dialog.findViewById(R.id.edtSearch);
ImageButton delete = dialog.findViewById(R.id.ivDelete);
ImageButton close = dialog.findViewById(R.id.ivClose);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
final ItemAdapter itemAdapter = new ItemAdapter(itemModel);
recyclerView.setAdapter(itemAdapter);
new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
if (direction == ItemTouchHelper.RIGHT || direction == ItemTouchHelper.LEFT) {
model = itemAdapter.getModel();
itemAdapter.removeItem(viewHolder.getAdapterPosition());
edtSearch.getText().clear();
}
}
}).attachToRecyclerView(recyclerView);
edtSearch.setOnEditorActionListener(new EditText.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
return true;
}
return false;
}
});
edtSearch.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (edtSearch.getText().toString().isEmpty()) {
if (model != null)
itemModel.remove(model);
}
itemAdapter.getFilter().filter(edtSearch.getText().toString().toLowerCase());
}
@Override
public void afterTextChanged(Editable s) {
}
});
close.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialog.dismiss();
}
});
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
edtSearch.requestFocus();
Objects.requireNonNull(dialog.getWindow()).setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
Objects.requireNonNull(dialog.getWindow()).setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);
dialog.show();
}
Here is recyclerView adapter
public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ExampleViewHolder> implements Filterable {
private ArrayList<ItemModel> variantiConstructors;
private ArrayList<ItemModel> mFilteredList;
private ItemModel itemModel;
ItemAdapter(ArrayList<ItemModel> exampleList) {
variantiConstructors = exampleList;
mFilteredList = variantiConstructors;
}
@NonNull
@Override
public ItemAdapter.ExampleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycler, parent, false);
RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
v.setLayoutParams(lp);
return new ItemAdapter.ExampleViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull final ExampleViewHolder holder, @SuppressLint("RecyclerView") final int position) {
ItemModel item = variantiConstructors.get(position);
holder.desc.setText(item.getCodiceArticolo());
holder.qta.setText(item.getQta());
itemModel = item;
if (position % 2 == 0) {
holder.itemView.setBackgroundColor(Color.parseColor("#5C5C5C"));
} else if (position % 2 == 1) {
holder.itemView.setBackgroundColor(Color.parseColor("#9E9E9E"));
}
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
final FilterResults oReturn = new FilterResults();
final ArrayList<ItemModel> results = new ArrayList<>();
if (mFilteredList == null)
mFilteredList = new ArrayList<>(variantiConstructors);
if (constraint != null && constraint.length() > 0) {
if (mFilteredList != null && mFilteredList.size() > 0) {
for (final ItemModel cd : mFilteredList) {
if (cd.getCodiceArticolo().toLowerCase()
.contains(constraint.toString().toLowerCase()))
results.add(cd);
}
}
oReturn.values = results;
oReturn.count = results.size(); //newly Aded by ZA
} else {
oReturn.values = mFilteredList;
oReturn.count = mFilteredList.size(); //newly added by ZA
}
return oReturn;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(final CharSequence constraint,
FilterResults results) {
variantiConstructors = new ArrayList<>((ArrayList<ItemModel>) results.values);
notifyDataSetChanged();
}
};
}
@Override
public int getItemCount() {
return variantiConstructors.size();
}
public class ExampleViewHolder extends RecyclerView.ViewHolder {
public TextView desc;
public TextView qta;
ExampleViewHolder(View itemView) {
super(itemView);
desc = itemView.findViewById(R.id.Desc);
qta = itemView.findViewById(R.id.Qta);
}
}
ItemModel getModel() {
return itemModel;
}
public ArrayList<ItemModel> getList() {
return variantiConstructors;
}
void removeItem(int position) {
variantiConstructors.remove(position);
notifyDataSetChanged();
}
}
Here is method from button click where i'm adding items :
conferma.setOnClickListener(new View.OnClickListener() {
@TargetApi(Build.VERSION_CODES.KITKAT)
@Override
public void onClick(View view) {
if(qta.getText().length() > 4 ){
MediaPlayer mpFound = MediaPlayer.create(InventarioActivity.this,R.raw.errorsound);
mpFound.start();
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
Objects.requireNonNull(v).vibrate(1000);
new GlideToast.makeToast(InventarioActivity.this, "QUANTITA' NON VALIDA", GlideToast.LENGTHLONG, GlideToast.FAILTOAST).show();
qta.clearFocus();
} else
if (!code.getText().toString().equals("")) {
if(TextUtils.isDigitsOnly(code.getText())) {
if (code.getText().length() >= 1 && code.getText().length() <= 999999) {
if (!qta.getText().toString().equals("")) {
lastQta.setText(qta.getText().toString());
lastCode.setText(code.getText().toString());
itemModel.add(new ItemModel(code.getText().toString(), qta.getText().toString()));
} else {
qta.setText("1");
lastQta.setText(qta.getText().toString());
lastCode.setText(code.getText().toString());
itemModel.add(new ItemModel(code.getText().toString(), qta.getText().toString()));
}
} else if (code.getText().length() == 8) {
// check digit
} else if (code.getText().length() == 11) {
// check digit
} else if (code.getText().length() == 13) {
// check digit
}
}
code.setText("");
qta.setText("");
code.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
Objects.requireNonNull(imm).showSoftInput(code, InputMethodManager.SHOW_IMPLICIT);
}
}
});
from Item not deleted in the RecyclerView even after deleting on Swipe
No comments:
Post a Comment