【发布时间】:2020-06-06 21:50:10
【问题描述】:
大家好,我有一个问题,我不知道如何知道我在购物车中单击了数组的哪个元素。所以我有一个有 5 件商品的购物车。每个项目都是一个对象,其中包含(姓名、姓氏、价格、键(是 firebase 实时数据库中对象的键)),对于每个对象,我都有一个 ImageButton,我可以单击它从购物车中删除该项目。我的问题是我不明白我如何知道我在那个特定时刻点击了什么项目,因为当我删除同名时我必须将密钥传递给它并获取密钥我必须知道项目位置数组。
我附上代码以便您更好地理解。我是 Android 新手,这是我第一次这样做。
非常感谢您。
代码:
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 文件:
{
"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"
}
}
}
用户适配器:
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());
}
});
}
}
}
错误: java.lang.NullPointerException:尝试在空对象引用上调用接口方法“void com.example.ipill.OnRemoveItemClickListener.onRemoveItemClicked(int)”
因为在创建回收视图内的对象时会创建图像按钮。
【问题讨论】:
-
请分享UsersAdapter代码
-
我用 UserAdapter 更新了问题
-
请确认一件事:您将如何删除该项目。就像当用户按下列表上的任何项目时,您要保存该位置,当用户单击 ImageButton 时,您将执行删除操作。理想情况下,对于适配器中的每个项目,都应该有一个对应的删除按钮或复选框。
-
第一步:我点击购物车,应用打开 CartActivity。第二步:应用程序从 firebase 实时数据库下载数据,并在回收视图中显示每个对象,每个对象都有一个图像按钮。如果我单击图像按钮,我想从数据库和回收视图中删除该项目,以便购物车有 -1 项。这就是我想要的方式。
标签: java android firebase firebase-realtime-database android-recyclerview