从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)
答案 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的示例实现。
我也尝试过,它对我有用。