[英]How do I know what I'm clicking Recycle View - Firebase detele data
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.所以我有一个装有 5 件商品的购物车。 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.每个项目都是一个包含(姓名、姓氏、价格、键(是 firebase 实时数据库中对象的键))的对象,对于每个对象,我都有一个 ImageButton,我可以单击它从购物车中删除该项目。 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.我是 Android 新手,这是我第一次这样做。
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 : JSON 文件:
{
"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错误:java.lang.NullPointerException:尝试在空对象引用上调用接口方法“void com.example.ipill.OnRemoveItemClickListener.onRemoveItemClicked(int)”
Since the Image button is create when the objects inside the recycle view are created.因为 Image 按钮是在创建回收视图内的对象时创建的。
I have changed the required thing, like passing listener from activity to adapter then callback from adapter,我已经改变了所需的东西,比如将侦听器从活动传递到适配器,然后从适配器回调,
Create 1 interface,创建1个接口,
public IItemClick{
public void onItemClick (String key, int position)
}
Activity Class活动课
public class CartActivity extends AppCompatActivity implements IItemClick {
// change
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()));
adapter = new UsersAdapter(array_data, this);
mResultList2.setAdapter(adapter);
}
}
override public void onItemClick(String key, int position){
// perform your delete operation from firebase here
// after delete
adapter.notifyItemRemoved(position)
}
}
Adapter Code适配器代码
public class UsersAdapter extends RecyclerView.Adapter<UsersAdapter.ViewHolder> {
private ArrayList<Users_get> cities;
public int position;
IItemClick listener;
public UsersAdapter(ArrayList<Users_get> cities,IItemClick listener ) {
this.cities = cities;
this.listener = 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, int position) {
Users_get city = cities.get(position);
holder.name.setText(city.getName());
holder.surname.setText(city.getSurname());
holder.price.setText(Long.toString(city.getPrice()));
holder.name.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
listener.onItemClick(city.getKey(), position);
}
}
@Override
public int getItemCount() {
if (cities != null) {
return cities.size();
} else {
return 0;
}
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public final View view;
public final TextView name;
public final TextView surname;
public final TextView price;
public ViewHolder(View view) {
super(view);
this.view = view;
name = view.findViewById(R.id.name_text2);
surname = view.findViewById(R.id.status_text2);
price = view.findViewById(R.id.price2);
}
}
Please follow step by step procedure:请按照以下步骤操作:
1) I'm considering that you have the Image Button
in your R.layout.list_layout_cart
, now find that ImageButton by FindViewById() method in your ViewHolder class in UserAdapter (Here please keep the ViewHolder class non-static). 1)我正在考虑您的R.layout.list_layout_cart
有Image Button
,现在通过 FindViewById() 方法在 UserAdapter 的 ViewHolder 类中找到 ImageButton (此处请保持 ViewHolder 类为非静态)。
So here is your UserAdapter所以这是你的 UserAdapter
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, int position) {
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 Button mImageButton;
public ViewHolder(View view) {
super(view);
this.view = view;
name = view.findViewById(R.id.name_text2);
surname = view.findViewById(R.id.status_text2);
price = view.findViewById(R.id.price2);
mImageButton = view.findViewById(R.id.btn_img_remove);
mImageButton.setOnClickListener(v -> {
if(mListener != null) {
mListener.onRemoveItemClicked(getAdapterPosition()));
}
});
}
}
}
2) Create an Interface like this 2)创建一个这样的接口
public interface OnRemoveItemClickListener{
void onRemoveItemClicked(int position);
}
3) Now Just Implement the Interface in your Activity and handle the item removal from Array in your Activity 3)现在只需在您的活动中实现接口并处理从您的活动中的数组中删除的项目
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.