2017-06-21 14 views
0

2つのチャットを表示するためにRecyclerViewを実装するだけです。すべてがうまくいっていますが、スクロールするときに1つの問題があり、送信者のメッセージの方向をもう一度スクロールすると、受信したメッセージに対してのみ設定したメッセージが残っています(GRAVITY)。あなたが理解することを望む下記のコードを見てください。android recyclerview firebaseを使ったチャットでスクロールを混乱させる

スクロールする前のスクリーンショット。スクロール後の

enter image description here

スクリーンショット。

enter image description here

ここにあなたの設定方向の方法を確認してください、私のRecycleActivity.java

public class RecycleActivity extends AppCompatActivity { 

    RecyclerView recyclerView; 
    DatabaseReference databaseReference,temp; 
    EditText editText; 
    Button btnSend; 
    public static String nameOFUser = ""; 
    LinearLayoutManager linearLayoutManager; 
    SharedPreferences sharedPreferences; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.mainer); 

     sharedPreferences = getSharedPreferences("MyLoginPref",MODE_PRIVATE); 
     nameOFUser = sharedPreferences.getString("name",""); 
     Log.e("name",nameOFUser); 
     recyclerView = (RecyclerView) findViewById(R.id.recyclerid); 
     recyclerView.setHasFixedSize(true); 
     linearLayoutManager= new LinearLayoutManager(this); 

     linearLayoutManager.setStackFromEnd(true); 
     recyclerView.setLayoutManager(linearLayoutManager); 

     databaseReference = FirebaseDatabase.getInstance().getReference().child("msg"); 
     editText = (EditText) findViewById(R.id.edittextmessagetosend); 
     btnSend = (Button) findViewById(R.id.button41); 

     btnSend.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       temp=databaseReference.push(); 
       temp.child("name").setValue(nameOFUser); 
       temp.child("message").setValue(editText.getText().toString().trim()); 
       editText.setText(""); 
       recyclerView.setLayoutManager(linearLayoutManager); 
      } 
     }); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     final FirebaseRecyclerAdapter<MessageBlog,MessageHolder> firebaseRecyclerAdapter 
       = new FirebaseRecyclerAdapter<MessageBlog, MessageHolder>(
       MessageBlog.class,R.layout.message_row,MessageHolder.class,databaseReference 
     ) { 
      @Override 
      protected void populateViewHolder(MessageHolder viewHolder, MessageBlog model, int position) { 
       String name = model.getName(); 
       viewHolder.setSender(name); 
       viewHolder.SetMessage(model.getMessage()); 
       viewHolder.setDirection(name); 
      } 
     }; 

     recyclerView.setAdapter(firebaseRecyclerAdapter); 
     databaseReference.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       recyclerView.smoothScrollToPosition(firebaseRecyclerAdapter.getItemCount()); 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 
    } 

ViewHolder.java

public static class MessageHolder extends RecyclerView.ViewHolder{ 

    View view; 
    LinearLayout lay,linearLayoutback; 
    CardView cardViewreal; 
    DatabaseReference mdatabase; 

    public MessageHolder(View itemView) { 
     super(itemView); 
     view = itemView; 
     linearLayoutback = (LinearLayout) 

     itemView.findViewById(R.id.linearlayoutback); 

     mdatabase=FirebaseDatabase.getInstance().getReference().child("msg"); 

     lay = (LinearLayout) itemView.findViewById(R.id.idcardview); 
     cardViewreal = (CardView) itemView.findViewById(R.id.idrealcard); 
    } 

    void setDirection(final String name){ 
     if(!name.equalsIgnoreCase(nameOFUser)) { 
      lay.setGravity(Gravity.LEFT); 
     cardViewreal.setCardBackgroundColor(Color.parseColor("#ffffff")); 

     } else { 
      lay.setGravity(Gravity.LEFT); 
      cardViewreal.setCardBackgroundColor(Color.parseColor("#f5f4f5")); 

     } 
    } 

    void setSender(String sender){ 
     TextView tvsender = (TextView) view.findViewById(R.id.senderidtv); 
     tvsender.setText(sender); 
    } 

    void SetMessage(String message){ 
     TextView tvmessage = (TextView) view.findViewById(R.id.messageidtv); 
     tvmessage.setText(message); 
    } 
} 
+0

に方向を設定しますか?なぜなら、if/else条件の両方でGravity.LEFTを設定しているからです。 –

+0

なぜ 'if(!name.equalsIgnoreCase(nameOFUser)){'両方の条件設定 'left'? 'lay.setGravity(Gravity.LEFT);を条件の外に置くことができます。 –

+0

row_layout xmlコードも追加してください。 –

答えて

0

です。それは、常に左

無効setDirection(最終文字列名)を使用すると、右のコード内で重力を設定{

  if(!name.equalsIgnoreCase(nameOFUser)) { 
       lay.setGravity(Gravity.LEFT); 
       cardViewreal.setCardBackgroundColor(Color.parseColor("#ffffff")); 
       //linearLayoutback.setBackgroundResource(R.drawable.white); 
      } 
      else{ 
       lay.setGravity(Gravity.LEFT); 
       cardViewreal.setCardBackgroundColor(Color.parseColor("#f5f4f5")); 
       // linearLayoutback.setBackgroundResource(R.drawable.white); 
      } 
+0

xmlファイルに正しく設定されています –

+0

いいえいいえ正しくありません、間違って私が書いた,,, Javaで右に変更したときも同じ問題 –

関連する問題