Android ¿;为什么recyclerView不立即更新从Firebase获得的数据?
我正在使用一个recyclerView,它可以放大两种类型的视图,以便能够进行聊天,一切正常,但不会立即发送或接收 当我发送消息时,除非单击编辑文本,否则不会收到消息, 这是错误的,因为在聊天中应该立即显示 我的适配器:Android ¿;为什么recyclerView不立即更新从Firebase获得的数据?,android,firebase,firebase-realtime-database,android-recyclerview,Android,Firebase,Firebase Realtime Database,Android Recyclerview,我正在使用一个recyclerView,它可以放大两种类型的视图,以便能够进行聊天,一切正常,但不会立即发送或接收 当我发送消息时,除非单击编辑文本,否则不会收到消息, 这是错误的,因为在聊天中应该立即显示 我的适配器: public class ChatRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { public Context context; public
public class ChatRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public Context context;
public ArrayList<ChatPersonal> items = new ArrayList<>();
private String mId;
private static final int CHAT_RIGHT = 1;
private static final int CHAT_LEFT = 2;
public ChatRecyclerAdapter (Context context, ArrayList<ChatPersonal> items, String mId){
this.context = context;
this.items = items;
this.mId = mId;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = null;
RecyclerView.ViewHolder holder = null;
switch (viewType){
case CHAT_RIGHT:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_chat_right, parent, false);
holder = new ChatPersonalHolderSender(view);
break;
case CHAT_LEFT:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_chat_left, parent, false);
holder = new ChatPersonalHolder(view);
break;
}
return holder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
ChatPersonal mObject = items.get(position);
int itemViewType = getItemViewType(position);
switch(itemViewType){
case CHAT_RIGHT:
((ChatPersonalHolderSender) holder).mMENSAJE.setText(mObject.getMessage());
((ChatPersonalHolderSender) holder).mHORA.setText(DateUtils.getRelativeTimeSpanString(mObject.getHour()));
break;
case CHAT_LEFT:
((ChatPersonalHolder) holder).mMENSAJE.setText(mObject.getMessage());
((ChatPersonalHolder) holder).mHORA.setText(DateUtils.getRelativeTimeSpanString(mObject.getHour()));
break;
}
}
@Override
public int getItemViewType(int position) {
if(items.get(position).getId().equals(mId)){
return CHAT_RIGHT;
}else{
return CHAT_LEFT;
}
}
@Override
public int getItemCount() {
return items.size();
}
}
公共类ChatRecyclerAdapter扩展了RecyclerView.Adapter{
公共语境;
public ArrayList items=new ArrayList();
私有字符串mId;
私有静态最终int CHAT_RIGHT=1;
私有静态最终int CHAT_左=2;
公共ChatRecyclerAdapter(上下文、ArrayList项、字符串mId){
this.context=上下文;
这个项目=项目;
this.mId=mId;
}
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图=空;
RecyclerView.ViewHolder=null;
开关(视图类型){
案例聊天室右:
view=LayoutInflater.from(parent.getContext()).flate(R.layout.list\u item\u chat\u right,parent,false);
holder=新聊天室PersonalHolderSender(视图);
打破
案例聊天室左:
view=LayoutInflater.from(parent.getContext()).flate(R.layout.list\u item\u chat\u left,parent,false);
支架=新支架(视图);
打破
}
报税表持有人;
}
@凌驾
BindViewHolder上的公共无效(RecyclerView.ViewHolder,int位置){
ChatPersonal mObject=items.get(位置);
int itemViewType=getItemViewType(位置);
开关(itemViewType){
案例聊天室右:
((ChatPersonalHolderSender)holder).mMENSAJE.setText(mObject.getMessage());
((ChatPersonalHolderSender)holder).mHORA.setText(DateUtils.getRelativeTimeSpanString(mObject.getHour());
打破
案例聊天室左:
((ChatPersonalHolder)holder.mMENSAJE.setText(mObject.getMessage());
((ChatPersonalHolder)holder.mHORA.setText(DateUtils.getRelativeTimeSpanString(mObject.getHour());
打破
}
}
@凌驾
public int getItemViewType(int位置){
if(items.get(position.getId().equals(mId)){
返回聊天室右键;
}否则{
回到你的左边;
}
}
@凌驾
public int getItemCount(){
返回items.size();
}
}
这是我聊天课的相关代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
linearLayoutManager = new LinearLayoutManager(ActivityChat.this);
linearLayoutManager.setStackFromEnd(true);
mRecyclerView.setLayoutManager(linearLayoutManager);
mRecyclerView.setHasFixedSize(false);
adapter = new ChatRecyclerAdapter(getApplicationContext(), items, mId);
adapter.notifyDataSetChanged();
mRecyclerView.setAdapter(adapter);
// send message
mSentMensaje.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String message = mEditText.getText().toString();
if (!message.isEmpty()) {
mChat.setMessage(message);
mChat.setHour(System.currentTimeMillis());
mChat.setId(mId);
if(mUser != null){
if(mUser.getIDchat() != null){
FirebaseUtils.getCHATT(mUser.getIDchat()).push().setValue(mChat).addOnSuccessListener(ActivityChat.this, new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
mRecyclerView.scrollToPosition(items.size() -1);
adapter.notifyDataSetChanged();
mEditText.setText("");
}
});
}}
// retreive message
if(mUser != null){
if(mUser.getIDchat() != null){
FirebaseUtils.getCHATT(mUser.getIDchat()).limitToFirst(50).addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
if (dataSnapshot != null && dataSnapshot.getValue() != null) {
try{
ChatPersonal model = dataSnapshot.getValue(ChatPersonal.class);
items.add(model);
} catch (Exception ex) {
Log.e(TAG, ex.getMessage());
}
}
}
@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) {
}
});
}
// status
@Override
protected void onStart() {
super.onStart();
adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override
public void onChanged() {
super.onChanged();
mRecyclerView.scrollToPosition(adapter.getItemCount() - 1);
}
});
}
@Override
protected void onResume() {
super.onResume();
adapter.notifyDataSetChanged();
}
@Override
protected void onPostResume() {
super.onPostResume();
adapter.notifyDataSetChanged();
}
}
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u chat);
linearLayoutManager=新的linearLayoutManager(ActivityChat.this);
linearLayoutManager.setStackFromEnd(true);
mRecyclerView.setLayoutManager(linearLayoutManager);
mRecyclerView.setHasFixedSize(false);
适配器=新的ChatRecyclerAdapter(getApplicationContext(),items,mId);
adapter.notifyDataSetChanged();
mRecyclerView.setAdapter(适配器);
//发送消息
mSentMensaje.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
最终字符串消息=mEditText.getText().toString();
如果(!message.isEmpty()){
设置消息(消息);
mChat.setHour(System.currentTimeMillis());
mChat.setId(mId);
if(mUser!=null){
if(mUser.getIDchat()!=null){
FirebaseUtils.getCHATT(mUser.getIDchat()).push().setValue(mChat).addOnSuccessListener(ActivityChat.this,new OnSuccessListener()){
@凌驾
成功时公开作废(作废避免){
mRecyclerView.scrollToPosition(items.size()-1);
adapter.notifyDataSetChanged();
mEditText.setText(“”);
}
});
}}
//检索消息
if(mUser!=null){
if(mUser.getIDchat()!=null){
FirebaseUtils.getCHATT(mUser.getIDchat()).limitToFirst(50).addChildEventListener(new ChildEventListener()){
@凌驾
公共void onChildAdded(DataSnapshot DataSnapshot,字符串s){
if(dataSnapshot!=null&&dataSnapshot.getValue()!=null){
试一试{
ChatPersonal模型=dataSnapshot.getValue(ChatPersonal.class);
增加(型号);
}捕获(例外情况除外){
Log.e(标记,例如getMessage());
}
}
}
@凌驾
公共void onChildChanged(DataSnapshot DataSnapshot,字符串s){
}
@凌驾
ChildRemoved上的公共void(DataSnapshot DataSnapshot){
}
@凌驾
已移动ChildMoved上的公共void(DataSnapshot DataSnapshot,字符串s){
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
}
//地位
@凌驾
受保护的void onStart(){
super.onStart();
registerAdapterDataObserver(新的RecyclerView.AdapterDataObserver(){
@凌驾
更改后的公共无效(){
super.onChanged();
mRecyclerView.scrollToPosition(adapter.getItemCount()-1);
}
});
}
@凌驾
受保护的void onResume(){
super.onResume();