【问题标题】:java.lang.ArrayIndexOutOfBoundsException: length=10; index=-1 from OnChildRemoved Firebase Databasejava.lang.ArrayIndexOutOfBoundsException:长度=10;索引=-1 来自 OnChildRemoved Firebase 数据库
【发布时间】:2019-07-27 17:56:35
【问题描述】:

我正在尝试从我的 recyclerview 中删除数据,并让它在移动用户界面中更新。这是一个 android 应用程序。我可以删除数据,但我总是必须离开该页面并在进行更改时返回。我尝试对 onChildRemoved 方法进行一些修改,但在进行此更改时我开始出现崩溃。我该怎么办?下面是我的代码。

MainActivity.java

DatabaseReference databaseReference;
List<DataSnapshot> listData;
RecyclerView recyclerView;
MyCart.MyAdapter adapter;


recyclerView = findViewById(R.id.recyclerview);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setHasFixedSize(true);

listData = new ArrayList<>();
adapter = new MyCart.MyAdapter(listData);
adapter.setHasStableIds(true);

GetDataFirebase();

private void GetDataFirebase() {
    databaseReference = FirebaseDatabase.getInstance().getReference()
            .child("Customers")
            .child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("My Cart");
    databaseReference.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {

            Items students = dataSnapshot.getValue(Items.class);

            listData.add(dataSnapshot);

            recyclerView.setAdapter(adapter);

        }

        @Override
        public void onChildChanged(@NonNull DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
            int index = listData.indexOf(dataSnapshot);
            listData.remove(index);
            adapter.notifyDataSetChanged();
        }

        @Override
        public void onChildMoved(@NonNull DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

适配器类

public class MyAdapter extends RecyclerView.Adapter<MyCart.MyAdapter.ViewHolder> {

    List<DataSnapshot> list;

    public MyAdapter(List<DataSnapshot> List) {
        this.list = List;
    }

    @Override
    public void onBindViewHolder(MyCart.MyAdapter.ViewHolder holder, int position) {
        final DataSnapshot studentSnapshot = list.get(position);

        final Items students = studentSnapshot.getValue(Items.class);

        final String list_user_id = studentSnapshot.getKey();

        holder.item_name.setText(students.getItem_name());
        holder.item_price.setText(students.getItem_price());

        Picasso.with(holder.item_image.getContext()).load(students.getItem_image()).placeholder(R.drawable.no_image_two).into(holder.item_image);

        holder.delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                DatabaseReference prod_ref = FirebaseDatabase.getInstance().getReference().child("Customers").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("My Cart").child(list_user_id);
                prod_ref.removeValue();
                adapter.notifyDataSetChanged();
                Toast.makeText(MyCart.this, "Item removed from cart", Toast.LENGTH_SHORT).show();
            }
        });

    }

    @NonNull
    @Override
    public MyCart.MyAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cart_item_layout, parent, false);

        return new MyCart.MyAdapter.ViewHolder(view);
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        TextView item_name, item_price;
        ImageView item_image;
        ImageView delete;

        public ViewHolder(View itemView) {
            super(itemView);

            item_name = itemView.findViewById(R.id.item_name);
            item_price = itemView.findViewById(R.id.item_price);

            item_image = itemView.findViewById(R.id.item_image);

            delete = itemView.findViewById(R.id.delete_item);

        }

    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    @Override
    public long getItemId(int position) {
        return position;

    }

    @Override
    public int getItemViewType(int position) {
        return position;
    }
}

【问题讨论】:

  • 你是不是在适配器类里面删除数据后调用了notifyDatasetChanged()方法?
  • 请不要。让我尽快试试
  • 好的,请将适配器类代码也添加到问题中
  • 我已经编辑了我的问题。当我添加 notifyDatasetChanged() 方法时,它仍然崩溃。我错过了什么吗?
  • 如果应用程序崩溃,会有一个堆栈跟踪。请在 logcat 上查找,并将其添加到您的问题中。

标签: java android firebase-realtime-database android-recyclerview


【解决方案1】:
holder.delete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            DatabaseReference prod_ref = FirebaseDatabase.getInstance().getReference().child("Customers").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("My Cart").child(list_user_id);
            prod_ref.removeValue();

            //add/modify these two lines here 
            list.remove(position);
            notifyDataSetChanged();


        }
    });

还有一个你需要做的改变 // 将此 toast 移动到 onChildRemoved 方法并从那里清除其他代码

Toast.makeText(MyCart.this, "Item removed from cart", Toast.LENGTH_SHORT).show();

喜欢

@Override
    public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
        //remove these line these will raise the exception and Toast here 
        int index = listData.indexOf(dataSnapshot);
        listData.remove(index);
        adapter.notifyDataSetChanged();
    }

【讨论】:

  • 嘿伙计,你知道我如何在删除时添加某种动画吗?我阅读了关于 notifyitemremoved 的信息,但它似乎不起作用。有什么建议吗?
【解决方案2】:

dataSnapshot在列表中不存在时,它返回-1。列表索引从0 开始。因此,您遇到了错误。您需要在此处添加一个警戒检查,例如:

        @Override
        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

            int index = listData.indexOf(dataSnapshot);
            if(index > 0) {
               listData.remove(index);
            }
            adapter.notifyDataSetChanged();
        }

【讨论】:

  • 感谢您的评论@Tayyab。即使崩溃已经停止,用户界面也不会更新。我仍然必须离开 ui 并回来查看更改。你有什么建议吗?
  • 哦!我只是修复了异常问题。更新了代码,请立即检查。希望您的问题现在得到解决。
  • 嘿伙计,你知道我如何在删除时添加某种动画吗?我阅读了关于 notifyitemremoved 的信息,但它似乎不起作用。有什么建议吗?
  • 你好兄弟有什么帮助吗?
猜你喜欢
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 2018-11-05
  • 2018-09-21
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
相关资源
最近更新 更多