问题
I am making CURD Activity intergarted with my servers api.
In start of the activity, I am fetching ArrayList of data from server and setting up in recycler view like this
custmerListAdapter = new CustomerListAdapter(customerListSuitcases, context);
customerList_recyclerView.setAdapter(custmerListAdapter);
Theere is a three where there is one options :- Delete
Note:- I am trying not to hit api every time app connect with server. See, only hot api one time when connect with server for tht task and I have to reload the server data for the latest data, So instead of doing this, I am locally deleting the the item as per the user deleted, So there would be an easy for app and not time consuming.
So, say I have three item, If i delete 3 item and it deleted successfully and when I try to delete the secong item it deletd from recyclerview and server but the 3 item shows up again, And the for same for 1 item, 3 does't shows up but 2 shows up.
The server api is all right I have checked , The problem is with the recycycler view adapter.
Here is the adapter
public class CustomerListAdapter extends RecyclerView.Adapter<CustomerListAdapter.ViewHolder> implements Filterable
{
private ArrayList<ListSuitcase> customerListSuitcases = new ArrayList<>();
private Context context;
private OnMoreOptionsClickListener onMoreOptionsClickListener;
private OnItemClickListener onItemClickListener;
private TextFilter textFilter;
private ArrayList<ListSuitcase> mStringFilterList = new ArrayList<>();
public CustomerListAdapter(ArrayList<ListSuitcase> customerListSuitcases, Context context) {
this.customerListSuitcases = customerListSuitcases;
this.context = context;
this.mStringFilterList = customerListSuitcases;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.customer_list_items , parent , false) , onMoreOptionsClickListener , onItemClickListener);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position)
{
holder.customer_name.setText(customerListSuitcases.get(position).FirmName);
if (customerListSuitcases.get(position).GstNo.equals("URP"))
{
holder.tv_urp.setVisibility(View.VISIBLE);
}else
{
holder.tv_urp.setVisibility(View.GONE);
}
}
@Override
public int getItemCount() {
return customerListSuitcases.size();
}
@Override
public Filter getFilter() {
if (textFilter == null) {
textFilter = new TextFilter();
}
return textFilter;
}
public void deleteCustomer(int position)
{
customerListSuitcases.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, customerListSuitcases.size());
}
public void addData(ListSuitcase listSuitcase)
{
customerListSuitcases.add(listSuitcase);
notifyDataSetChanged();
}
public void editData(int position , ListSuitcase listSuitcase)
{
customerListSuitcases.remove(position);
customerListSuitcases.add(listSuitcase);
notifyDataSetChanged();
}
public class ViewHolder extends RecyclerView.ViewHolder
{
TextView customer_name , tv_urp;
ImageButton more_options;
OnMoreOptionsClickListener onMoreOptionsClickListener;
MaterialCardView root_cardView;
OnItemClickListener onItemClickListener;
public ViewHolder(@NonNull View itemView , OnMoreOptionsClickListener onMoreOptionsClickListener , OnItemClickListener onItemClickListener)
{
super(itemView);
this.onMoreOptionsClickListener = onMoreOptionsClickListener;
this.onItemClickListener = onItemClickListener;
more_options = itemView.findViewById(R.id.more_options);
customer_name = itemView.findViewById(R.id.customer_name);
root_cardView = itemView.findViewById(R.id.root_cardView);
tv_urp = itemView.findViewById(R.id.tv_urp);
more_options.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view)
{
ImpMethods.oneTimeClickCountdown(view);
if (onMoreOptionsClickListener != null)
onMoreOptionsClickListener.OnMoreOptionsClick(getAdapterPosition() , more_options , customerListSuitcases.get(getAdapterPosition()));
}
});
root_cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view)
{
ImpMethods.oneTimeClickCountdown(view);
if (onItemClickListener != null)
onItemClickListener.OnItemClick(getAdapterPosition() , root_cardView , customerListSuitcases.get(getAdapterPosition()));
}
});
}
}
public void updateList(ArrayList<ListSuitcase> listSuitcases)
{
customerListSuitcases = listSuitcases;
notifyDataSetChanged();
}
public ArrayList<ListSuitcase> getCustomerListSuitcases() {
return customerListSuitcases;
}
public interface OnMoreOptionsClickListener
{
void OnMoreOptionsClick(int position , View v , ListSuitcase customerListSuitcase);
}
public void setOnMoreOptionsClickListener(OnMoreOptionsClickListener onMoreOptionsClickListener)
{
this.onMoreOptionsClickListener = onMoreOptionsClickListener;
}
public void setOnItemClickListener(OnItemClickListener onItemClickListener)
{
this.onItemClickListener = onItemClickListener;
}
public interface OnItemClickListener
{
void OnItemClick(int position , View v , ListSuitcase customerListSuitcase);
}
private class TextFilter extends Filter
{
@Override
protected FilterResults performFiltering(CharSequence constraint) {
constraint = constraint.toString().toLowerCase();
FilterResults result = new FilterResults();
ArrayList<ListSuitcase> f = new ArrayList<>();
ArrayList<ListSuitcase> p = new ArrayList<>();
for (ListSuitcase listSuitcase : mStringFilterList)
{
p.add(listSuitcase);
}
if (constraint != null && constraint.toString().length() > 0) {
for (int i = 0; i < p.size(); i++) {
ListSuitcase listSuitcase = p.get(i);
if (listSuitcase.FirmName.toLowerCase().contains(constraint))
f.add(listSuitcase);
}
result.count = f.size();
result.values = f;
} else {
result.values = p;
result.count = p.size();
}
return result;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
customerListSuitcases = (ArrayList<ListSuitcase>) results.values;
notifyDataSetChanged();
}
}
}
Go for deleteCustomer method
I am struggling to solve this but can't.
来源:https://stackoverflow.com/questions/65473066/removed-recycler-item-shows-up-again-after-deleting-other