【问题标题】:notifyDataSetChanged() not working for FirebaseRecyclerAdapternotifyDataSetChanged() 不适用于 FirebaseRecyclerAdapter
【发布时间】:2018-07-01 21:49:25
【问题描述】:

FirebaseRecyclerAdapter 删除项目工作正常,直到我转向 MVP 模式。现在适配器没有通知更改并引发错误。我该如何解决这个问题。

这是我的 FirebaseRecyclerAdapter,

@Override
    public FirebaseRecyclerAdapter onEntryListChanged(Query query, FirebaseRecyclerOptions<EntryModel> options) {

        adapter = new FirebaseRecyclerAdapter<EntryModel, EntryHolder>(options) {
            @NonNull
            @Override
            public EntryHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.entry_item_view,parent,false);


                return new EntryHolder(view);
            }

            @Override
            protected void onBindViewHolder(@NonNull final EntryHolder holder, final int position, @NonNull EntryModel model) {
                entryView.attachView(model.getTitle(),model.getContent(),model.getDate(),holder);

                holder.entryUpdate.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        updateFragment(adapter.getRef(position).getKey());
                    }
                });

                holder.entryDelete.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference("Entry").child(FirebaseAuth.getInstance().getUid());
                        mDatabase.child(adapter.getRef(position).getKey()).removeValue();
                        notifyDataSetChanged();

                    }
                });
                holder.expandArrow.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        boolean shouldExpand = holder.expandContent.getVisibility() == View.GONE;
                        ChangeBounds transition = new ChangeBounds();
                        transition.setDuration(200);

                        if(shouldExpand){
                            entryView.expandArror(holder);
                        }
                        else {
                            entryView.collapsArrow(holder);
                        }
                        entryView.startTransition(holder,transition,shouldExpand);



                    }
                });
            }
        };
        return adapter;

问题在于删除。

日志文件,

07-02 00:38:47.678 29773-29773/com.example.nejat.journalapptrail1 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.nejat.journalapptrail1, PID: 29773
    java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
        at java.util.ArrayList.get(ArrayList.java:411)
        at com.firebase.ui.common.BaseObservableSnapshotArray.getSnapshot(BaseObservableSnapshotArray.java:70)
        at com.firebase.ui.database.FirebaseRecyclerAdapter.getRef(FirebaseRecyclerAdapter.java:112)
        at com.example.nejat.journalapptrail1.EntryList.EntryListPresenter$1$2.onClick(EntryListPresenter.java:72)
        at android.view.View.performClick(View.java:6261)
        at android.view.View$PerformClick.run(View.java:23752)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6776)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1518)

【问题讨论】:

  • 您是否在 onStart() 方法中实现了 onStartListening?
  • 是的,我可以正常查看这些项目。我不能只删除它们。
  • 不调用mDatabase.child(adapter.getRef(position).getKey()).removeValue();,您是否尝试过简单地调用:adapter.getRef(position).removeValue()

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


【解决方案1】:

你得到了

 java.lang.IndexOutOfBoundsException: Index: 1, Size: 1

您正在尝试访问索引 1,但您的数组大小为 1,您需要访问 0 索引。

尝试将您的位置值减少 1 以访问数组中的正确字段。

mDatabase.child(adapter.getRef(position-1).getKey()).removeValue();

【讨论】:

    【解决方案2】:

    有几个简单的错误需要修正:

    • 在您使用position 的任何地方,将其更改为holder.getAdapterPosition()。 (为了更容易发现这些错误,请从 position 参数中删除 final 修饰符。)
    • 删除notifyDataSetChanged() 呼叫,这是为您完成的。

    【讨论】:

      【解决方案3】:

      您似乎在从子节点获取值时犯了错误。

      我喜欢 FirebaseRecyclerAdapter 的示例实现。

      https://github.com/firebase/FirebaseUI-Android/blob/master/database/src/main/java/com/firebase/ui/database/FirebaseRecyclerAdapter.java

      我也试过这个,它对我有用。

      【讨论】:

        猜你喜欢
        • 2014-09-04
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-28
        • 1970-01-01
        • 1970-01-01
        • 2018-04-15
        相关资源
        最近更新 更多