2017-08-20 1 views
-1

firebaseデータベース に基づいてリアルタイムのチャットアプリケーションを構築しているので、アプリケーションがoncreatメソッドを呼び出すたびに、私はdisplaychatmessages()メソッドですべてのメッセージ私のDBのどこにリストビューに表示されます。 データベースが大きくなったときにアプリがいくつかの問題に直面することができ、私の質問は?いくつかのmonthesまたは年後??私はそれが私がとlocalY古いメッセージを保存し、後でそれらをロードしようとしていると、アプリが唯一の新しい追加チャイルズをロードするソリューションとして、開始時刻にAndroid - リアルタイムチャットアプリケーションFirebaseを使用

のデータの多くをヘンデルなることを意味ですか?いくつかのいずれかが私を助けることができるが、私はそれは良いアイデアだ場合は、これを起動する方法を知りませんか?

私の古いdisplayChatMessagesメソッド: 新しいものについてのアイデア??

private void displayChatMessages() { 

    RecyclerView recycler = (RecyclerView)findViewById(R.id.myRv); 
    LinearLayoutManager layoutmang = new LinearLayoutManager(this); 
    layoutmang.setStackFromEnd(true); 
    recycler.setLayoutManager(layoutmang); 
    mAdapter = new FirebaseRecyclerAdapter<ChatMessage, RecyclerView.ViewHolder>(
      ChatMessage.class, R.layout.activity_main, RecyclerView.ViewHolder.class, FirebaseDatabase.getInstance().getReference()) { 
     @Override 
     protected void populateViewHolder(final RecyclerView.ViewHolder viewHolder, final ChatMessage user, 
              final int position) { 


      int y=0; 
      ChatMessage user2; 
      if (position>1){ 
       user2 = getItem(position - 1); 
      }else{ 
       user2 = getItem(position); 
      } 

      ChatMessage ori2 = getItem(position); 
      if (user.getMessageUser().matches(FirebaseAuth.getInstance().getCurrentUser().getEmail())) { 
        if (user2.getMessageFULL()<ori2.getMessageFULL()){ 
        y=1; 
        populateType1((HolderMe) viewHolder, user, 1); 
       }else{ 
        populateType1((HolderMe) viewHolder, user, 0); 
       } 

      }else if (!user.getMessageUser().matches(FirebaseAuth.getInstance().getCurrentUser().getEmail())){ 
       if (user2.getMessageFULL()<ori2.getMessageFULL()){ 
        populateType2((HolderYou) viewHolder, user, 1,FirebaseAuth.getInstance().getCurrentUser().getEmail()); 
       }else{ 
        populateType2((HolderYou) viewHolder, user, 0,FirebaseAuth.getInstance().getCurrentUser().getEmail()); 
       } 

      } 
      if(user.getMessageTime()< new Date().getTime()) { 
       HolderDate vh3 = (HolderDate) viewHolder; 
       populateType3(vh3, user, position); 
      } 
     } 

      @Override 
     public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      Log.e("ViewT",viewType+""); 
      if (viewType == 1) { 
       View userType1 = LayoutInflater.from(parent.getContext()) 
         .inflate(R.layout.layout_holder_me, parent, false); 
       return new HolderMe(userType1); 
      } else{ 
       View userType2 = LayoutInflater.from(parent.getContext()) 
         .inflate(R.layout.layout_holder_you, parent, false); 
       return new HolderYou(userType2); 
      } 

     } 

     @Override 
     public int getItemViewType(int position) { 
       ChatMessage user = getItem(position); 
      String s = FirebaseAuth.getInstance().getCurrentUser().getEmail(); 
      if (s.equals(user.getMessageUser())) { 
      return 1; 
      } else { 
       return 2; 
      } 

     } 

     private void populateType1(HolderMe v, ChatMessage model, int position) { 
      v.getTimeView().setText(DateFormat.format("HH:mm",model.getMessageTime())); 
      if (position==1) { 
       v.getFullDateView().setText(DateFormat.format("dd-MM-yyyy", model.getMessageTime())); 
       v.getFullDateView().setVisibility(View.VISIBLE); 
      } 
       v.getTextv().setText(model.getMessageText()); 
     } 
     private void populateType3(HolderDate vcv, ChatMessage model, int position) { 
      vcv.getDate().setText(DateFormat.format("dd-MM-yyyy",model.getMessageTime())); 
     } 
     private void toaa1(String text) { 
      Toast.makeText(ChatActivity.this,text,Toast.LENGTH_LONG).show(); 
     } 
     private void populateType2(HolderYou vv, ChatMessage model, int position,String username) { 
      vv.getTimeView().setText(DateFormat.format("HH:mm",model.getMessageTime())); 
      if (position==1) { 
       vv.getFullDateView().setVisibility(View.VISIBLE); 
       vv.getFullDateView().setText(DateFormat.format("dd-MM-yyyy", model.getMessageTime())); 
      } 
      vv.getTextv().setText(model.getMessageText()); 
      if (username.matches("[email protected]")) { 
       vv.getImageView().setBackgroundResource(R.drawable.userm); 
      } else { 
       vv.getImageView().setBackgroundResource(R.drawable.usera); 
       } 
     } 

    }; 
    recycler.setAdapter(mAdapter); 
} 

答えて

0

チャットアプリ内のすべてのメッセージを表示すると、メッセージ数が増えるにつれて実際に問題が発生します。代わりに、あなただけの最新のメッセージを表示するようにFirebaseデータベースのクエリを使用することができます。たとえば、次のように、その後

DatabaseReference messages = FirebaseDatabase.getInstance().getReference(); 
Query recent = messages.orderByKey().limitToLast(100); 

そして、あなたのアダプタであることを使用します。

mAdapter = new FirebaseRecyclerAdapter<ChatMessage, RecyclerView.ViewHolder>(
     ChatMessage.class, 
     R.layout.activity_main, 
     RecyclerView.ViewHolder.class, 
     recent) { 
+0

おかげで、それは私がeverday新しい子が追加ソリューションを作成していると、すべてのメッセージがそこに行くと毎回、ユーザうも働くたくさんのloaadに私はより多くの負荷をクリックするたびに増加したときにアプリが一日-iのメッセージをロードする複数のメッセージをタップ!最高のソリューションはどうですか? –

関連する問題