RecyclerView, показать последнее сообщение, которое я отправляю на recyclerView

MARDOCH MA спросил: 12 мая 2018 в 04:14 в: java

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

public class 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 ответа

MARDOCH MA ответил: 13 мая 2018 в 06:41

Kalyan Dechiraju это ошибка журнала

Процесс: com.timetochat.mardo.timetochat, PID: 18736

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.scrollToPosition(int)' on a null object reference
    at com.timetochat.mardo.timetochat.adapter.ChatListAdapter$1.onChildAdded(ChatListAdapter.java:41)
    at com.google.android.gms.internal.zzecw.zza(Unknown Source:71)
    at com.google.android.gms.internal.zzeia.zzbyc(Unknown Source:2)
    at com.google.android.gms.internal.zzeig.run(Unknown Source:71)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6938)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
dharms ответил: 13 мая 2018 в 09:17

Вы можете установить 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);
MARDOCH MA ответил: 14 мая 2018 в 11:36
мне тоже нужно ввести весь этот код? в какой части кода я разместил?
dharms ответил: 14 мая 2018 в 08:49
Это настроено на вашем просмотре recycler. У вас нет ссылки в вашем коде, поэтому вам нужно будет подать заявку, поскольку это имеет смысл.