我创建了一个词汇应用程序,用户可以在其中添加单词。我使用Firebase进行文字存储。该应用程序在开始时工作正常,但我尝试改进该片段中的一些东西,它开始崩溃。我删除了我添加的所有内容但是当我尝试打开该片段时它仍然会崩溃。在Run中我也无法弄明白。
这是该片段的代码
公共类MyWordsFragment扩展了Fragment {
private FloatingActionButton mUp,mLogout,mAdd;
private Animation FabOpen, FabClose, FabClockwise, FabAntiClockwise;
boolean isOpen = false;
private FirebaseAuth mAuth;
private DatabaseReference mFirebase;
private RecyclerView mMyWordsRecyclerView;
public MyWordsFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View mainView = inflater.inflate(R.layout.fragment_my_words, container, false);
return mainView;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mUp = (FloatingActionButton) getActivity().findViewById(R.id.myword_fab_up);
mLogout = (FloatingActionButton) getActivity().findViewById(R.id.myword_fab_logout);
mLogout.setBackgroundTintList(ColorStateList.valueOf(Color
.parseColor("#212121")));
mAdd = (FloatingActionButton) getActivity().findViewById(R.id.myword_fab_add);
mAdd.setBackgroundTintList(ColorStateList.valueOf(Color
.parseColor("#212121")));
FabOpen = AnimationUtils.loadAnimation(getContext(),R.anim.fab_open);
FabClose = AnimationUtils.loadAnimation(getContext(),R.anim.fab_close);
FabClockwise = AnimationUtils.loadAnimation(getContext(),R.anim.rotate_clockwise);
FabAntiClockwise = AnimationUtils.loadAnimation(getContext(),R.anim.rotate_anticlockwise);
mAuth = FirebaseAuth.getInstance();
FirebaseUser currentuser = FirebaseAuth.getInstance().getCurrentUser();
String uid = currentuser.getUid();
mFirebase = FirebaseDatabase.getInstance().getReference().child("MyWords").child(uid);
mFirebase.keepSynced(true);
mMyWordsRecyclerView = (RecyclerView)getActivity().findViewById(R.id.myword_category_rv);
mMyWordsRecyclerView.setHasFixedSize(true);
mMyWordsRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
mAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final AlertDialog.Builder mBulider = new AlertDialog.Builder(getActivity());
View mView = getLayoutInflater().inflate(R.layout.add_category_dialog,null);
final TextInputLayout mCategory = (TextInputLayout)mView.findViewById(R.id.add_categoryName);
final TextInputLayout mWord = (TextInputLayout)mView.findViewById(R.id.add_firstword);
final TextInputLayout mMeaning = (TextInputLayout)mView.findViewById(R.id.add_firstmeaning);
mBulider.setView(view)
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.cancel();
}
})
.setPositiveButton("Add", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
String category = mCategory.getEditText().getText().toString();
String word = mWord.getEditText().getText().toString();
String meaning = mMeaning.getEditText().getText().toString();
if(!TextUtils.isEmpty(category) && !TextUtils.isEmpty(word) && !TextUtils.isEmpty(meaning)){
HashMap<String, String> addcat = new HashMap<>();
addcat.put("dbWord",word);
addcat.put("dbMeaning",meaning);
mFirebase.child(category).push().setValue(addcat).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()){
Toast.makeText(getActivity(),"Category is Added",Toast.LENGTH_LONG).show();
}else {
Toast.makeText(getActivity(),task.getException().getMessage(),Toast.LENGTH_LONG).show();
}
}
});
mFirebase.keepSynced(true);
dialogInterface.dismiss();
}else {
Toast.makeText(getActivity(),"Fill all the fields and try again",Toast.LENGTH_LONG).show();
}
}
});
mBulider.setView(mView);
AlertDialog dialog = mBulider.create();
dialog.show();
}
});
mUp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (isOpen){
mLogout.startAnimation(FabClose);
mAdd.startAnimation(FabClose);
mUp.startAnimation(FabAntiClockwise);
mLogout.setClickable(false);
mAdd.setClickable(false);
isOpen = false;
}else {
mLogout.startAnimation(FabOpen);
mAdd.startAnimation(FabOpen);
mUp.startAnimation(FabClockwise);
mLogout.setClickable(true);
mAdd.setClickable(true);
isOpen = true;
}
}
});
mLogout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 1. Instantiate an AlertDialog.Builder with its constructor
final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
// 2. Chain together various setter methods to set the dialog characteristics
builder.setMessage("Are you sure you want to logout?")
.setTitle("Logout");
// 3. Add the buttons
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// User clicked YES button
mAuth.signOut();
Intent intent = new Intent(getActivity(),MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
getActivity().finish();
}
});
builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// User cancelled the dialog
dialog.cancel();
}
});
// 4. Get the AlertDialog from create()
AlertDialog dialog = builder.create();
dialog.show();
}
});
}
@Override
public void onStart() {
super.onStart();
final FirebaseRecyclerAdapter<MyWordsCategoryModel, MyWordsCategoryViewholder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<MyWordsCategoryModel, MyWordsCategoryViewholder>(
MyWordsCategoryModel.class,
R.layout.mywords_rv_layout,
MyWordsCategoryViewholder.class,
mFirebase
) {
@Override
protected void populateViewHolder(MyWordsCategoryViewholder viewHolder, MyWordsCategoryModel model, int position) {
final String dbcategoryId = getRef(position).getKey();
viewHolder.setCategory(dbcategoryId);
viewHolder.mCategoryDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 1. Instantiate an AlertDialog.Builder with its constructor
final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
// 2. Chain together various setter methods to set the dialog characteristics
builder.setMessage("Are you sure you want to delete this category?")
.setTitle("Delete Category");
// 3. Add the buttons
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// User clicked YES button
// 1. Instantiate an AlertDialog.Builder with its constructor
final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
// 2. Chain together various setter methods to set the dialog characteristics
builder.setMessage("All the words inside this category will be deleted")
.setTitle("Delete All Words");
// 3. Add the buttons
builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// User clicked YES button
mFirebase.child(dbcategoryId).removeValue().addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
Toast.makeText(getActivity(),"Deleted",Toast.LENGTH_LONG).show();
}
}
});
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// User cancelled the dialog
dialog.cancel();
}
});
// 4. Get the AlertDialog from create()
AlertDialog dialogfinal = builder.create();
dialogfinal.show();
}
});
builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// User cancelled the dialog
dialog.cancel();
}
});
// 4. Get the AlertDialog from create()
AlertDialog dialog = builder.create();
dialog.show();
}
});
viewHolder.mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent profileIntant = new Intent(getActivity(), MyWordsListActivity.class);
profileIntant.putExtra("DbCategoryId", dbcategoryId);
startActivity(profileIntant);
}
});
}
};
ScaleInAnimationAdapter alphaAdapter = new ScaleInAnimationAdapter(firebaseRecyclerAdapter);
alphaAdapter.setDuration(800);
alphaAdapter.setInterpolator(new OvershootInterpolator());
alphaAdapter.setFirstOnly(false);
mMyWordsRecyclerView.setAdapter(alphaAdapter);
}
public static class MyWordsCategoryViewholder extends RecyclerView.ViewHolder{
View mView;
public ImageView mCategoryDelete;
public MyWordsCategoryViewholder(View itemView) {
super(itemView);
mView = itemView;
mCategoryDelete = (ImageView)itemView.findViewById(R.id.mywords_rv_cross);
}
public void setCategory(String category){
TextView cat = (TextView)mView.findViewById(R.id.mywords_rv_Category);
cat.setText(category);
}
}
}
错误运行
I/System.out: [socket][/10.163.173.254:38082] connected
D/NativeCrypto: ssl=0x80c12380 NativeCrypto_SSL_do_handshake fd=0x8f732c60 shc=0x8f732c64 timeout_millis=0 client_mode=1 npn=0x0
D/NativeCrypto: ssl=0x80c12380 info_callback calling handshakeCompleted
D/skia: SkJpegCodec::onGetPixels +
D/skia: SkJpegCodec::onGetPixels -
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.aniketvishal.commonindianwords, PID: 7574
com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.aniketvishal.commonindianwords.Models.MyWordsCategoryModel
at com.google.android.gms.internal.zg.zzb(Unknown Source)
at com.google.android.gms.internal.zg.zza(Unknown Source)
at com.google.firebase.database.DataSnapshot.getValue(Unknown Source)
at com.firebase.ui.database.ClassSnapshotParser.parseSnapshot(ClassSnapshotParser.java:22)
at com.firebase.ui.database.ObservableSnapshotArray.getObject(ObservableSnapshotArray.java:160)
at com.firebase.ui.database.CachingObservableSnapshotArray.getObject(CachingObservableSnapshotArray.java:40)
at com.firebase.ui.database.FirebaseRecyclerAdapter.getItem(FirebaseRecyclerAdapter.java:180)
at com.firebase.ui.database.FirebaseRecyclerAdapter.onBindViewHolder(FirebaseRecyclerAdapter.java:217)
at jp.wasabeef.recyclerview.adapters.AnimationAdapter.onBindViewHolder(AnimationAdapter.java:54)
at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6482)
at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6515)
at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5458)
at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5724)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5563)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5559)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2229)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1556)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1516)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:608)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3693)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3410)
at android.support.v7.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1710)
at android.support.v7.widget.RecyclerView$1.run(RecyclerView.java:346)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:910)
at android.view.Choreographer.doCallbacks(Choreographer.java:712)
at android.view.Choreographer.doFrame(Choreographer.java:643)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:896)
at android.os.Handler.handleCallback(Handler.java:836)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:203)
at android.app.ActivityThread.main(ActivityThread.java:6339)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1084)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:945)
D/OpenGLRenderer: ~CanvasContext() 0xa3afaa80
D/NativeCrypto: ssl=0x80c12380 cert_verify_callback => 1
D/NativeCrypto: ssl=0x80c12380 info_callback calling handshakeCompleted
D/NativeCrypto: ssl=0x80c12380 NativeCrypto_SSL_get_certificate => NULL
I/System.out: gba_cipher_suite:TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
Application terminated.
请帮帮我。谢谢
答案 0 :(得分:1)
您正面临此异常
DatabaseException: Can't convert object of type java.lang.String to type com.aniketvishal.commonindianwords.Models.MyWordsCategoryModel
因为您正在尝试读取类型为String的类型为MyWordsCategoryModel的数据,这就是异常的原因。
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
MyWordsCategoryModel data = ds.getValue(MyWordsCategoryModel.class);
}
}
有关详细信息,请查看此问题
DatabaseException: Can't convert object of type java.lang.String to type