Я хочу разработать приложение для чата android для отображения чата между пользователями, у которых есть onClickListener
для отправки сообщения в комнату чата. Использование RecyclerView для отображения всех сообщений вместе с childEventListener
для изменений в чате в реальном времени.
Однако я столкнулся с проблемой, которая гласит:
не может передать значение NULL для аргумента pathString.
и это мой ChatListActivity код.
public class ChatListActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private RecyclerView.Adapter mAdapter;
private LinearLayoutManager layoutManager;
private EditText user_chat, user_edit;
private Button user_next;
private List<ChatListData> mDataset;
private FirebaseDatabase firebaseDatabase =
FirebaseDatabase.getInstance();
private DatabaseReference myRef = firebaseDatabase.getReference("chat");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat_list);
user_chat = (EditText) findViewById(R.id.user_chat);
user_edit = (EditText) findViewById(R.id.user_edit);
user_next = (Button) findViewById(R.id.user_next);
recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
recyclerView.setHasFixedSize(true);
layoutManager = new LinearLayoutManager(this);
layoutManager.setReverseLayout(true);
layoutManager.setStackFromEnd(true);
recyclerView.setLayoutManager(layoutManager);
user_next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (user_edit.getText().toString().equals("") || user_chat.getText().toString().equals("")) {
return;
}
ChatListData chatList = new ChatListData();
chatList.setChatName(user_chat.getText().toString());
chatList.setUserName(user_edit.getText().toString());
Intent intent = new Intent(ChatListActivity.this, ChatActivity.class);
intent.putExtra("user_chat", chatList.getChatName());
intent.putExtra("user_edit", chatList.getUserName());
startActivity(intent);
}
});
showChatList();
}
public void showChatList(){
mDataset = new ArrayList<>();
mAdapter = new ChatListAdapter(mDataset, new View.OnClickListener() {
@Override
public void onClick(View v) {
if (v.getTag() != null) {
int postion = (int) v.getTag();
Intent intent = new Intent(ChatListActivity.this, ChatActivity.class);
intent.putExtra("user_chat", ((ChatListAdapter) mAdapter).getChatList(postion).getChatName());
intent.putExtra("user_edit", ((ChatListAdapter) mAdapter).getChatList(postion).getUserName());
startActivity(intent);
}
}
});
recyclerView.setAdapter(mAdapter);
myRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
ChatListData chatList =
dataSnapshot.getValue(ChatListData.class);
((ChatListAdapter)mAdapter).addChatList(chatList);
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
и это мой код ChatActivity .
public class ChatActivity extends UtilActivity {
private RecyclerView recyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager layoutManager;
private List<ChatData> chatDataList;
private EditText EditText_chat;
private Button Button_send;
private String nick;
private FirebaseDatabase database = FirebaseDatabase.getInstance();
private DatabaseReference myRef = database.getReference();
private String CHAT_NAME ;
private String USER_NAME;
private FirebaseAuth mAuth;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
mAuth = FirebaseAuth.getInstance();
nick = mAuth.getCurrentUser().getEmail();
Intent intent = getIntent();
CHAT_NAME = intent.getStringExtra("user_chat");
USER_NAME = intent.getStringExtra("user_edit");
Button_send = findViewById(R.id.Button_send);
EditText_chat = findViewById(R.id.EditText_chat);
Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
toolbar.setTitle(CHAT_NAME);
setSupportActionBar(toolbar);
Button_send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String msg = EditText_chat.getText().toString();
if(msg != null){
ChatData chat = new ChatData();
chat.setNickname(nick);
chat.setMsg(msg);
myRef.child("chat").child(CHAT_NAME).push().setValue(chat);
}
}
});
recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
recyclerView.setHasFixedSize(true);
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
chatDataList = new ArrayList<>();
mAdapter = new ChatAdapter(chatDataList, ChatActivity.this, nick);
recyclerView.setAdapter(mAdapter);
// Write a message to the database
FirebaseDatabase database = FirebaseDatabase.getInstance();
myRef = database.getReference();
openChat();
}
public void openChat(){
myRef.child("chat").child(CHAT_NAME).addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
ChatData chat = dataSnapshot.getValue(ChatData.class);
((ChatAdapter)mAdapter).addChat(chat);
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}