【问题标题】:How do I know what I'm clicking Recycle View - Firebase detele data我怎么知道我在点击什么 Recyclerview - Firebase 删除数据
【发布时间】: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


【解决方案1】:

我已经改变了所需的东西, 比如将监听器从活动传递给适配器,然后从适配器回调,

创建1个接口,

public IItemClick{
 public void onItemClick (String key, int position)
}

活动类

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)
                }

        }

适配器代码

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);
    }
}

【讨论】:

  • 我试图按照你告诉我的做,但我一直收到此错误:尝试在空对象引用上调用接口方法 'void com.example.ipill.OnRemoveItemClickListener.onRemoveItemClicked(int)',我如果您想查看代码,请更新代码。谢谢
  • 使用适配器 = new UsersAdapter(array_data,this);不是项目
  • adapter = new UsersAdapter(array_data,CartActivity.this);
  • 你为什么要执行两次相同的操作。首先单击适配器项目,然后单击活动。就像@Override public void onRemoveItemClicked(final int position) { FirebaseDatabase.getInstance().getReference("Cart").child(array_data.get(position).getKey()).removeValue();适配器.notifyItemRemoved(位置); }
【解决方案2】:

请按照步骤操作:

1) 我正在考虑您的 R.layout.list_layout_cart 中有 Image Button,现在通过 FindViewById() 方法在 UserAdapter 的 ViewHolder 类中找到 ImageButton(此处请保持 ViewHolder 类非静态)。

这是你的 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) 创建这样的接口

public interface OnRemoveItemClickListener{
    void onRemoveItemClicked(int position);
}

3) 现在只需在 Activity 中实现接口并在 Activity 中处理从 Array 中删除的项目

【讨论】:

  • 您好,我尝试按照您告诉我的方式进行修改,但它一直告诉我:尝试在空对象引用上调用接口方法 'void com.example.ipill.OnRemoveItemClickListener.onRemoveItemClicked(int)',我更新了代码,以便您现在可以看到实际代码
  • 改变 CartActivity 代码如下:adapter = new UserAdapter(array_items, this);
猜你喜欢
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多