notifyDataSetChanged()对FirebaseRecyclerAdapter不起作用

时间:2018-07-01 21:49:26

标签: android firebase firebase-realtime-database recycler-adapter firebaseui

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)

3 个答案:

答案 0 :(得分:0)

您将获得

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

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

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

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

答案 1 :(得分:0)

有几个简单的错误可以解决:

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

答案 2 :(得分:0)

从子节点获取值似乎是错误的。

我喜欢FirebaseRecyclerAdapter的示例实现。

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

我也尝试过,它对我有用。