Hi everyone I have a question that I can't figure out about how do I know what element of the array I'm clicking in the shopping cart. So I have a shopping cart with 5 items. Each item is an object that contains (Name, Surname, Price, Key(is the key of the object inside the firebase realtime database)) and for each object, I have an ImageButton that I can click to remove that item from the cart. My problem is that I can't understand how I can know what item I'm clicking in that specific moment, because when I delete the idem I have to pass it the key and to get the key I have to know the item position in the array.
I'm attaching the Code so you can understand better. I'm new to Android and it's the first time that I'm doing this.
Thank you so much in advance.
Code :
public class CartActivity extends AppCompatActivity implements OnRemoveItemClickListener{
private TextView total;
private ImageButton removeFromCart;
private Button pay;
private RecyclerView mResultList2;
private DatabaseReference mUserDatabase;
int i=0;
int Totalprice=0;
OnRemoveItemClickListener item;
private RecyclerView.Adapter adapter;
private ArrayList<Users_get> array_data = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cart);
mUserDatabase = FirebaseDatabase.getInstance().getReference("Cart");
total = findViewById(R.id.TotalPrice);
removeFromCart = findViewById(R.id.removeFromCart);
mResultList2 = findViewById(R.id.cartList);
pay = findViewById(R.id.pay);
mResultList2.setHasFixedSize(true);
mResultList2.setLayoutManager(new LinearLayoutManager(this));
// Attach a listener to read the data at our posts reference
mUserDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot childSnapshot : dataSnapshot.getChildren()) {
Users_get post = childSnapshot.getValue(Users_get.class);
array_data.add(new Users_get(post.getName(),post.getSurname(),post.getPrice(),childSnapshot.getKey()));
getTotalPrice(post.getPrice());
adapter = new UsersAdapter(array_data,item);
mResultList2.setAdapter(adapter);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
System.out.println("The read failed: " + databaseError.getCode());
}
});
}
public int getTotalPrice(Long price){
if (array_data != null) {
Totalprice+=price;
}System.out.println("total Price is :"+Totalprice);
return Totalprice;
}
@Override
public void onRemoveItemClicked(final int position) {
removeFromCart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FirebaseDatabase.getInstance().getReference("Cart").child(array_data.get(position).getKey()).removeValue();
}
});
adapter.notifyItemRemoved(position);
}
}
JSON file :
{
"Cart" : {
"-M0U3UXq2ZA00Jq5o9as" : {
"name" : "Alex",
"price" : 120,
"surname" : "Kyto"
},
"-M0WlUbQHj1hdH40uWVF" : {
"name" : "Alex",
"price" : 120,
"surname" : "Kyto"
},
"-M0WxZhI98Xb1s9Xy5HV" : {
"name" : "Alex",
"price" : 120,
"surname" : "Kyto"
},
"-M0X00Zr64RocyQHhoFB" : {
"name" : "Alex",
"price" : 120,
"surname" : "Kyto"
}
},
"Users" : {
"01" : {
"Name" : "Alex",
"Price" : 120,
"Surname" : "Kyto"
},
"02" : {
"Name" : "Alex",
"Price" : 200,
"Surname" : "Pablo"
}
}
}
USER ADAPTER :
package com.example.ipill;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
public class UsersAdapter extends RecyclerView.Adapter<UsersAdapter.ViewHolder> {
private ArrayList<Users_get> cities;
public int position;
private OnRemoveItemClickListener mListener;
public UsersAdapter(ArrayList<Users_get> cities,OnRemoveItemClickListener listener) {
this.cities = cities;
this.mListener = listener;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = (View) LayoutInflater.from(parent.getContext()).inflate(R.layout.list_layout_cart, parent, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
final Users_get city = cities.get(position);
holder.name.setText(city.getName());
holder.surname.setText(city.getSurname());
holder.price.setText(Long.toString(city.getPrice()));
}
@Override
public int getItemCount() {
if (cities != null) {
return cities.size();
} else {
return 0;
}
}
public class ViewHolder extends RecyclerView.ViewHolder {
public final View view;
public final TextView name;
public final TextView surname;
public final TextView price;
public final ImageButton removee;
public ViewHolder(View view) {
super(view);
this.view = view;
name = view.findViewById(R.id.name2);
surname = view.findViewById(R.id.Surname2);
price = view.findViewById(R.id.Price2);
removee = view.findViewById(R.id.removeFromCart);
removee.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.onRemoveItemClicked(ViewHolder.this.getAdapterPosition());
}
});
}
}
}
Error : java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.ipill.OnRemoveItemClickListener.onRemoveItemClicked(int)' on a null object reference
Since the Image button is create when the objects inside the recycle view are created.