#java #android #object
#java #Android #объект
Вопрос:
Я работаю над простым приложением для отправки текстовых сообщений в Android. В моем MainActivity, когда пользователь нажимает на разговор с кем-либо, я отправляю свой пользовательский объект беседы через намерение с использованием Parcelable. Это работает отлично. Проблема в том, что если я изменю какие-либо поля в этом объекте, при возвращении к MainActivity ни одно из моих изменений не отображается. Насколько я могу судить, Parcelable просто передает копию объекта, а не передает ссылку на него. Есть ли какой-либо способ сохранить эти изменения в действиях?
Я хочу постоянно обновлять последнее сообщение, которое было отправлено в чате. Существует RecyclerView.Адаптер, который обновит представление новым текстом. Этот последний текст сообщения должен отображаться при возвращении к моему основному действию.
Я не могу прикрепить изображение, потому что у меня недостаточно очков репутации. Но мой MainActivity — это просто список разговоров. Мой ChatActivity — это фактический экран чата. Вот мой код:
public class ChatActivity extends AppCompatActivity implements Parcelable {
//receive my custom Conversation object here, left out for brevity
mConversation.setLastMessage("This is a new message.");
mChatAdapter.notifyDataSetChanged();
}
При возвращении к моей MainActivity, несмотря на изменение поля lastMessage, никаких изменений не отображается. Как я могу это сделать? Или есть альтернативный способ непрерывного обновления объекта в разных действиях?
Любая помощь очень ценится, и спасибо за ваше время. Извините, если это был запутанный вопрос.
Комментарии:
1. Можете ли вы сказать мне, как вы возвращаете свой объект Conversation обратно в MainActivity?
2. Я этого не делаю! Я просто обновляю поле lastMessage. Я надеялся, что Parcelable передаст ссылку на объект, что повлияет на все действия.
3. Может быть, вы можете импортировать jetpack ( developer.android.com/jetpack/guide ) в вашей программе. Или поддерживать свой чат с помощью ContentProider( developer.android.com/guide/topics/providers/content-providers )
4. Где хранятся ваши сообщения? Вы используете базу данных?
5. Я сохраняю их в ArrayList внутри моего ChatActivity. Здесь хранятся фактические тексты, которые отправляют люди. Переданный объект Conversation содержит поле lastMessage, которое я хочу регулярно обновлять. Спасибо, хорошо. Попробуйте ответить, я посмотрю на ссылки, которые вы прикрепили.
Ответ №1:
Вы можете использовать ViewModel для хранения и обновления ваших данных. Это позволяет вашим действиям / фрагментам просматривать данные на предмет обновлений и координирует их жизненный цикл с жизненными циклами подключенных действий / фрагментов.
Создайте новый класс ViewModel:
public class MessagesViewModel extends ViewModel{
// Define the LiveData variable(s) you want to store/interact with
private MutableLiveData<ArrayList<Message>> messageList = new MutableLiveData<>();
public MessagesViewModel(){
// Read your file here ...
// Use the file's data to update the value(s) of your LiveData
messageList.setValue(newMessageList);
}
// Create a method for your Activity/Fragment(s) to access the LiveData
public LiveData<ArrayList<Message>> getMessageList(){
return messageList;
}
// Create a method for your Activity/Fragment(s) to update the LiveData
public void updateMessageList(ArrayList<Message> updatedMessageList){
messageList.setValue(updatedMessageList);
}
// Called when all connected Activity/Fragment lifecycles have finished
// (If necessary, here is where you can clean up any resources your ViewModel uses)
@Override
protected void onCleared(){
// Save your data back to file here ...
super.onCleared();
}
}
Извлеките свою ViewModel из методов onCreate () обоих ваших действий:
// Retrieve your ViewModel
// (You may want to make this a member variable depending on where you may need to access the ViewModel from)
MessagesViewModel messagesViewModel = new ViewModelProvider(this).get(MessagesViewModel.class);
// Call observe() to receive the data as well as any updates to it
messagesViewModel.getMessageList().observe(this, new Observer<ArrayList<Message>>(){
@Override
public void onChanged(ArrayList<Message> messageList){
// Do something with your data ...
}
});
Когда вам нужно обновить данные из вашего действия:
// Create your updated data ...
// Update your ViewModel with the new data
messagesViewModel.updateMessageList(updatedMessageList);
Вы можете найти более подробную информацию о ViewModels наhttps://developer.android.com/topic/libraries/architecture/viewmodel