RecyclerView, показать последнее сообщение, которое я отправляю на recyclerView - PullRequest
0 голосов
/ 05 июня 2018

У меня проблема с этим кодом, я создал личный чат, но когда я отправляю сообщение, RecyclerView не показывает автоматически последнее отправленное сообщение, но мне нужно прокрутить вниз, как я могу убедиться, что автоматически отображаетсяпоследнее сообщение?

открытый класс ChatListAdapter расширяет RecyclerView.Adapter {

private Activity mActivity;
private DatabaseReference mDataBaseReference;
private String mDisplayName;
private ArrayList<DataSnapshot> mDataSnapshot;


private ChildEventListener mListener = new ChildEventListener () {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot,String s) {

        mDataSnapshot.add (dataSnapshot);
        notifyDataSetChanged ();

    }

    @Override
    public void onChildChanged(DataSnapshot dataSnapshot,String s) {

    }

    @Override
    public void onChildRemoved(DataSnapshot dataSnapshot) {

    }

    @Override
    public void onChildMoved(DataSnapshot dataSnapshot,String s) {

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
};




public ChatListAdapter(Activity activity, DatabaseReference ref, String name){

    mActivity = activity;
    mDataBaseReference = ref.child ("messaggi");
    mDisplayName = name;
    mDataSnapshot = new ArrayList <> ();

    mDataBaseReference.addChildEventListener (mListener);
}

public class ChatViewHolder extends RecyclerView.ViewHolder{

    TextView autore;
    TextView messaggio;
    LinearLayout.LayoutParams params;


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

        autore = (TextView)itemView.findViewById (R.id.tv_autore);
        messaggio = (TextView)itemView.findViewById (R.id.tv_messaggio);
        params = (LinearLayout.LayoutParams) autore.getLayoutParams ();
    }
}


@NonNull
@Override
public ChatViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {

    LayoutInflater inflater = (LayoutInflater)mActivity.getSystemService (Context.LAYOUT_INFLATER_SERVICE);
    View v = inflater.inflate (R.layout.chat_msg_row, parent, false);
    ChatViewHolder vh = new ChatViewHolder (v);

    return vh;
}

@Override
public void onBindViewHolder(@NonNull ChatViewHolder holder,int position) {

    DataSnapshot snapshot = mDataSnapshot.get (position);

    Messaggio msg = snapshot.getValue (Messaggio.class);

    holder.autore.setText (msg.getAutore ());
    holder.messaggio.setText (msg.getMessaggio ());

    boolean sonoIo = msg.getAutore ().equals (mDisplayName);
    setChatItemStyle(sonoIo, holder);


}

private void setChatItemStyle(boolean sonoIo, ChatViewHolder holder){
    if(sonoIo){

        holder.params.gravity = Gravity.END;
        holder.autore.setTextColor (Color.GREEN);
        holder.messaggio.setBackgroundResource(R.drawable.in_msg_bg);


    }else{

        holder.params.gravity = Gravity.START;
        holder.autore.setTextColor (Color.CYAN);
        holder.messaggio.setBackgroundResource(R.drawable.out_msg_bg);

    }

    holder.autore.setLayoutParams (holder.params);
    holder.messaggio.setLayoutParams (holder.params);


}


@Override
public int getItemCount() {
    return mDataSnapshot.size ();
}

public void clean(){
    mDataBaseReference.removeEventListener (mListener);
}

}

Ответы [ 2 ]

0 голосов
/ 02 апреля 2019

Я предполагаю, что вы используете представление рециркулятора для заполнения сообщений.

Итак, вот оно

Объявление переменной

private RecyclerView rvChat;

onCreate

rvChat = findViewById(R.id.a_individual_chat_rv_chat);

onChildAdded (После notifyDataSetChanged)

rvChat.smoothScrollToPosition(rvChat.getAdapter().getItemCount());
0 голосов
/ 07 июня 2018

Вы можете установить stackFromEnd на true на вашем LinearLayoutManager.Если ваши сообщения чата возвращаются самыми последними, вы также можете обратиться к менеджеру, а не к данным.Затем, чтобы автоматически прокрутить измененный набор данных, просто установите android:transcriptMode на normal (прокрутка только если уже внизу) или alwaysScroll (всегда прокручивайте вниз после изменения) в вашем RecyclerView xml.

boolean reverseLayout = true; // Or false if your data is already reversed
LinearLayoutManager manager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, reverseLayout);
manager.setStackFromEnd(true);
yourRecyclerView.setLayoutManager(manager);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...