2017-12-23 24 views
2

を下にスクロールしながら、私はアンドロイドのためのブログのアプリを開発していると私は、バックエンドのためfirebaseを使用しています。アプリは正常に動作していますが、最後の投稿にスクロールするとアプリがクラッシュします。私はかなり長い時間から解決策を見つけることに取り組んできましたが、おそらく何も見つけることができませんでした。Androidアプリのクラッシュ

ここで問題

public class UserActivity extends AppCompatActivity { 
    private RecyclerView mStatusView; 
    private DatabaseReference mDatabase; 
    private DatabaseReference mDatabaseUsers; 
    private DatabaseReference mDatabaseLike; 

    private FirebaseAuth mFirebaseAuth; 

    private FirebaseAuth.AuthStateListener mAuthListener; 

    String userID = ""; 
    private Boolean exit = false; 
    private Boolean mProcessLike = false; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
     setContentView(R.layout.activity_main); 

     mFirebaseAuth = FirebaseAuth.getInstance(); 
     mAuthListener = new FirebaseAuth.AuthStateListener() { 
      @Override 
      public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 

       if (firebaseAuth.getCurrentUser() == null) { 
        Intent loginIntent = new Intent(UserActivity.this, LoginActivity.class); 

        loginIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
        startActivity(loginIntent); 
       } 

      } 
     }; 

     mDatabase = FirebaseDatabase.getInstance().getReference().child("Status"); 
     mDatabaseUsers = FirebaseDatabase.getInstance().getReference().child("Users"); 
     mDatabaseLike = FirebaseDatabase.getInstance().getReference().child("Likes"); 

     mDatabaseUsers.keepSynced(true); 
     mDatabaseLike.keepSynced(true); 
     mDatabase.keepSynced(true); 

     mStatusView = findViewById(R.id.status_list); 
     mStatusView.setHasFixedSize(true); 
     mStatusView.setLayoutManager(new LinearLayoutManager(this)); 

    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 

     checkUserExists(); 

     mFirebaseAuth.addAuthStateListener(mAuthListener); 

     // Creating a Firebase recycle Adapter 
     FirebaseRecyclerAdapter<Status, StatusViewHolder> firebaseRecyclerAdapter = 
       new FirebaseRecyclerAdapter<Status, StatusViewHolder>(
         Status.class, 
         R.layout.status_row, 
         StatusViewHolder.class, 
         mDatabase 
       ) { 
        @Override 
        protected void populateViewHolder(StatusViewHolder viewHolder, Status model, int position) { 

         final String postKey = getRef(position).getKey(); 

         viewHolder.setTitle(model.getTitle()); 
         viewHolder.setDescription((model.getDescription())); 
         viewHolder.setImage(getApplicationContext(), model.getImage()); 

         viewHolder.mNumberOfLikesTextView.setVisibility(View.GONE); 

         viewHolder.setLikeButton(postKey); 
         viewHolder.mLikeButton.setOnClickListener(new View.OnClickListener() { 
          @Override 
          public void onClick(View view) { 

           mProcessLike = true; 
           mDatabaseLike.addValueEventListener(new ValueEventListener() { 

            @Override 
            public void onDataChange(DataSnapshot dataSnapshot) { 

             if (mProcessLike) { 
              if (dataSnapshot.child(postKey).hasChild(mFirebaseAuth.getCurrentUser().getUid())) { 
               mDatabaseLike.child(postKey).child(mFirebaseAuth.getCurrentUser().getUid()).removeValue(); 
               mProcessLike = false; 
               Toast.makeText(UserActivity.this, "Like removed", Toast.LENGTH_SHORT).show(); 

              } else { 
               mDatabaseLike.child(postKey).child(mFirebaseAuth.getCurrentUser().getUid()).setValue("RandomValue"); 
               mProcessLike = false; 
               Toast.makeText(UserActivity.this, "Liked", Toast.LENGTH_SHORT).show(); 

              } 
             } 
            } 

            @Override 
            public void onCancelled(DatabaseError databaseError) { 

            } 
           }); 

          } 
         }); 
        } 
       }; 

     mStatusView.setAdapter(firebaseRecyclerAdapter); 

    } 

    private void checkUserExists() { 

     try { 
      userID = mFirebaseAuth.getCurrentUser().getUid(); 
     } catch (NullPointerException e) { 
      e.printStackTrace(); 
     } 
     mDatabaseUsers.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       if (!dataSnapshot.hasChild(userID)) { 

        Intent registerIntent = new Intent(UserActivity.this, 
          RegisterActivity.class); 
        registerIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
        startActivity(registerIntent); 

       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 

    } 

    // Setting up Recycler View 
    public static class StatusViewHolder extends RecyclerView.ViewHolder { 

     View mView; 

     ImageButton mLikeButton; 
     TextView mNumberOfLikesTextView; 

     DatabaseReference mDataBaseLike; 
     FirebaseAuth mAuth; 

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

      mView = itemView; 
      mLikeButton = itemView.findViewById(R.id.like_button); 
      mNumberOfLikesTextView = itemView.findViewById(R.id.number_of_likes_text_view); 

      mDataBaseLike = FirebaseDatabase.getInstance().getReference().child("Likes"); 
      mAuth = FirebaseAuth.getInstance(); 

      mDataBaseLike.keepSynced(true); 
     } 

     public void setLikeButton(final String postKey) { 
      mDataBaseLike.addValueEventListener(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        if (dataSnapshot.child(postKey).hasChild(mAuth.getCurrentUser().getUid())) { 
         mLikeButton.setImageResource(R.drawable.ic_thumb_up_blue_24dp); 
        } else { 
         mLikeButton.setImageResource(R.drawable.ic_thumb_up_black_24dp); 
        } 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 

       } 
      }); 
     } 


     // Setting the title 
     public void setTitle(String title) { 
      TextView statusTitle = mView.findViewById(R.id.status_title_textView); 
      statusTitle.setText(title); 
     } 

     public void setDescription(String desc) { 
      TextView statusDescription = mView.findViewById(R.id.status_description_textView); 
      statusDescription.setText(desc); 
     } 

     public void setImage(Context context, String image) { 
      ImageView statusImage = mView.findViewById(R.id.status_image); 

      Picasso.with(context).load(image).into(statusImage); 

     } 
    } 
} 

が直面していると、ここれる活動は私が解決しようとしてきた

FATAL EXCEPTION: main 
Process: com.example.akash.iametderick, PID: 12384 
com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.Long to type com.example.akash.iametderick.Status 
at com.google.android.gms.internal.zzdzr.zzb(Unknown Source:842) 
at com.google.android.gms.internal.zzdzr.zza(Unknown Source:0) 
at com.google.firebase.database.DataSnapshot.getValue(Unknown Source:10) 
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 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.GapWorker.prefetchPositionWithDeadline(GapWorker.java:285) 
at android.support.v7.widget.GapWorker.flushTaskWithDeadline(GapWorker.java:342) 
at android.support.v7.widget.GapWorker.flushTasksWithDeadline(GapWorker.java:358) 
at android.support.v7.widget.GapWorker.prefetch(GapWorker.java:365) 
at android.support.v7.widget.GapWorker.run(GapWorker.java:396) 
at android.os.Handler.handleCallback(Handler.java:790) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:164) 
at android.app.ActivityThread.main(ActivityThread.java:6494) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 

を得ている問題のログですかなり長い間問題は解決していませんでした。

これは私の状態ノードである:

Status { 
    -L10rFvy6N-t7RiF7FJ6 { 
     date: ...; 
     description: ...; 
     image: ...; 
     title: ...'' 
    } 
    date: ...; 
    description: ...; 
    image: ...; 
    title: ...'' 
} 
+0

あなたfirebaseデータであなたが最初のノードのデータと最後のノードのデータを投稿することができますか? – ABDevelopers

+1

はあなたのコード.DEBUGその型の不一致エラー「型のオブジェクトを変換できません」と、あなたのデータベースを確認してください。 – ADM

+0

あなたのエラーは 'DatabaseExceptionのです:データベース上のいくつかのデータを意味com.example.akash.iametderick.Status'を入力するタイプがjava.lang.Longのオブジェクトを変換することはできませんされていない正しい形式で – Marlon

答えて

4

問題がfirebaseに保存したデータです。

ノードStatusObjectであり、データベース内のその特定ノードの値をlongとして保存している可能性があります。

だからデータベースをチェックし、他のノードと比較します。あなたはwhen I scroll down to the last posはので、あなたの最後のノードをチェック言ったように、特別に問題が発生しているノードが最後になります

関連する問題