пытаюсь создать приложение, в котором есть фрагмент, в котором мне нужно показать доступных людей в этой задаче и обновлять пользовательский интерфейс всякий раз, когда в базе данных происходят изменения (добавлен новый человек), но пользовательский интерфейс не обновляется с помощью Пользовательский интерфейс?
Я установил репозиторий для извлечения игроков из базы данных, а также модель представления и адаптер, но игроки отображаются только тогда, когда фрагмент создается заново, но нам нужен пользовательский интерфейс для обновляться при вставке или удалении новой строки в стол. Я решил не использовать базу данных комнат и подумываю продолжить работу с базой данных sqLite.
public class TeamViewModel extends AndroidViewModel {
private static final String TAG = "TeamViewModel";
private TeamRepository teamRepository;
private MutableLiveData
playersLiveData;
public TeamViewModel(Application application) {
super(application);
Log.d(TAG, "Initializing TeamViewModel");
// Initialize repository and LiveData teamRepository = new TeamRepository(new DatabaseHelper(application));
playersLiveData = new MutableLiveData();
Log.d(TAG, "TeamViewModel initialized successfully");
}
public LiveData getPlayersForMatch(int matchId) {
Log.d(TAG, "getPlayersForMatch called with matchId: " + matchId);
// Fetch players from the repository in a background thread new Thread(() -> {
try {
Log.d(TAG, "Fetching players from repository for matchId: " + matchId);
PlayerTeam playerTeam = teamRepository.getPlayersForMatch(matchId);
if (playerTeam == null) {
Log.e(TAG, "PlayerTeam fetched is null for matchId: " + matchId);
} else {
Log.d(TAG, "PlayerTeam fetched successfully for matchId: " + matchId);
Log.d(TAG, "Team 1 Players Count: " + playerTeam.getTeam1Players().size());
for (Player player : playerTeam.getTeam1Players()) {
Log.d(TAG, "Team 1 Player: " + player.toString());
}
Log.d(TAG, "Team 2 Players Count: " + playerTeam.getTeam2Players().size());
for (Player player : playerTeam.getTeam2Players()) {
Log.d(TAG, "Team 2 Player: " + player.toString());
}
}
// Post the fetched data to LiveData playersLiveData.postValue(playerTeam);
} catch (Exception e) {
Log.e(TAG, "Error while fetching players for matchId: " + matchId, e);
}
}).start();
Log.d(TAG, "Returning playersLiveData for matchId: " + matchId);
return playersLiveData;
}
}
Адаптер
public class PlayerAdapter extends RecyclerView.Adapter
{
private List players;
// Constructor to accept List public PlayerAdapter(List players) {
this.players = players;
}
@NonNull @Override public PlayerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_player, parent, false);
return new PlayerViewHolder(view);
}
@Override public void onBindViewHolder(@NonNull PlayerViewHolder holder, int position) {
Player player = players.get(position);
holder.bind(player);
}
@Override public int getItemCount() {
return players != null ? players.size() : 0;
}
// Method to update the dataset and notify the RecyclerView public void updatePlayers(List newPlayers) {
DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DiffUtil.Callback() {
@Override public int getOldListSize() {
return players != null ? players.size() : 0;
}
@Override public int getNewListSize() {
return newPlayers != null ? newPlayers.size() : 0;
}
@Override public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
// Assuming Player has a unique identifier like ID return players.get(oldItemPosition).getPlayerId() == newPlayers.get(newItemPosition).getPlayerId();
}
@Override public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
// Compare content equality return players.get(oldItemPosition).equals(newPlayers.get(newItemPosition));
}
});
// Update the dataset this.players = newPlayers;
// Notify RecyclerView of changes diffResult.dispatchUpdatesTo(this);
}
// ViewHolder class public static class PlayerViewHolder extends RecyclerView.ViewHolder {
private TextView playerName;
public PlayerViewHolder(@NonNull View itemView) {
super(itemView);
playerName = itemView.findViewById(R.id.playerNameView);
}
public void bind(Player player) {
playerName.setText(player.getName());
}
}
}
Фрагмент
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.d(TAG, "onCreateView called");
// Inflate the layout for the fragment View view = inflater.inflate(R.layout.activity_mp_teams, container, false);
Log.d(TAG, "Layout inflated successfully");
// SharedPreferences for team names if (getActivity() != null) {
sharedPreferences = requireContext().getSharedPreferences("match_prefs", Context.MODE_PRIVATE);
}
// Initialize RecyclerViews and TextViews for team names team1RecyclerView = view.findViewById(R.id.team1PlayerRecyclerView);
team2RecyclerView = view.findViewById(R.id.team2PlayerRecyclerView);
TextView teamATextView = view.findViewById(R.id.team1TextView);
TextView teamBTextView = view.findViewById(R.id.team2TextView);
// Set team names in TextViews from SharedPreferences String teamAName = sharedPreferences.getString("teamAName", "");
String teamBName = sharedPreferences.getString("teamBName", "");
teamATextView.setText(teamAName);
teamBTextView.setText(teamBName);
// Set GridLayoutManager for RecyclerViews (4 columns per team) team1RecyclerView.setLayoutManager(new GridLayoutManager(getContext(), 4));
team2RecyclerView.setLayoutManager(new GridLayoutManager(getContext(), 4));
// Initialize adapters with empty lists team1Adapter = new PlayerAdapter(new ArrayList());
team2Adapter = new PlayerAdapter(new ArrayList());
// Set adapters to RecyclerViews team1RecyclerView.setAdapter(team1Adapter);
team2RecyclerView.setAdapter(team2Adapter);
// Initialize ViewModel teamViewModel = new ViewModelProvider(this).get(TeamViewModel.class);
Log.d(TAG, "onCreateView completed");
return view;
}
@Override public void onResume() {
super.onResume();
Log.d(TAG, "onResume called");
matchId = sharedPreferences.getLong("currentMatchId", -1);
teamViewModel.getPlayersForMatch((int) matchId).observe(getViewLifecycleOwner(), playerTeam -> {
Log.d(TAG, "LiveData observed, updating UI");
if (playerTeam != null) {
List team1Players = playerTeam.getTeam1Players();
List team2Players = playerTeam.getTeam2Players();
Log.d(TAG, "Team 1 Players Count: " + team1Players.size());
for (Player player : team1Players) {
Log.d(TAG, "Team 1 Player: " + player.toString());
}
// Update Team 1 Adapter team1Adapter.updatePlayers(team1Players);
Log.d(TAG, "Team 2 Players Count: " + team2Players.size());
for (Player player : team2Players) {
Log.d(TAG, "Team 2 Player: " + player.toString());
}
team2Adapter.updatePlayers(team2Players);
} else {
Log.e(TAG, "PlayerTeam object is null");
}
});Log.d(TAG, "onResume completed");
}
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... e-database
Представление Recycler не обновляется при любых изменениях в базе данных. ⇐ JAVA
Программисты JAVA общаются здесь
1735566096
Anonymous
пытаюсь создать приложение, в котором есть фрагмент, в котором мне нужно показать доступных людей в этой задаче и обновлять пользовательский интерфейс всякий раз, когда в базе данных происходят изменения (добавлен новый человек), но пользовательский интерфейс не обновляется с помощью Пользовательский интерфейс?
Я установил репозиторий для извлечения игроков из базы данных, а также модель представления и адаптер, но игроки отображаются только тогда, когда фрагмент создается заново, но нам нужен пользовательский интерфейс для обновляться при вставке или удалении новой строки в стол. Я решил не использовать базу данных комнат и подумываю продолжить работу с базой данных sqLite.
public class TeamViewModel extends AndroidViewModel {
private static final String TAG = "TeamViewModel";
private TeamRepository teamRepository;
private MutableLiveData
playersLiveData;
public TeamViewModel(Application application) {
super(application);
Log.d(TAG, "Initializing TeamViewModel");
// Initialize repository and LiveData teamRepository = new TeamRepository(new DatabaseHelper(application));
playersLiveData = new MutableLiveData();
Log.d(TAG, "TeamViewModel initialized successfully");
}
public LiveData getPlayersForMatch(int matchId) {
Log.d(TAG, "getPlayersForMatch called with matchId: " + matchId);
// Fetch players from the repository in a background thread new Thread(() -> {
try {
Log.d(TAG, "Fetching players from repository for matchId: " + matchId);
PlayerTeam playerTeam = teamRepository.getPlayersForMatch(matchId);
if (playerTeam == null) {
Log.e(TAG, "PlayerTeam fetched is null for matchId: " + matchId);
} else {
Log.d(TAG, "PlayerTeam fetched successfully for matchId: " + matchId);
Log.d(TAG, "Team 1 Players Count: " + playerTeam.getTeam1Players().size());
for (Player player : playerTeam.getTeam1Players()) {
Log.d(TAG, "Team 1 Player: " + player.toString());
}
Log.d(TAG, "Team 2 Players Count: " + playerTeam.getTeam2Players().size());
for (Player player : playerTeam.getTeam2Players()) {
Log.d(TAG, "Team 2 Player: " + player.toString());
}
}
// Post the fetched data to LiveData playersLiveData.postValue(playerTeam);
} catch (Exception e) {
Log.e(TAG, "Error while fetching players for matchId: " + matchId, e);
}
}).start();
Log.d(TAG, "Returning playersLiveData for matchId: " + matchId);
return playersLiveData;
}
}
Адаптер
public class PlayerAdapter extends RecyclerView.Adapter
{
private List players;
// Constructor to accept List public PlayerAdapter(List players) {
this.players = players;
}
@NonNull @Override public PlayerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_player, parent, false);
return new PlayerViewHolder(view);
}
@Override public void onBindViewHolder(@NonNull PlayerViewHolder holder, int position) {
Player player = players.get(position);
holder.bind(player);
}
@Override public int getItemCount() {
return players != null ? players.size() : 0;
}
// Method to update the dataset and notify the RecyclerView public void updatePlayers(List newPlayers) {
DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DiffUtil.Callback() {
@Override public int getOldListSize() {
return players != null ? players.size() : 0;
}
@Override public int getNewListSize() {
return newPlayers != null ? newPlayers.size() : 0;
}
@Override public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
// Assuming Player has a unique identifier like ID return players.get(oldItemPosition).getPlayerId() == newPlayers.get(newItemPosition).getPlayerId();
}
@Override public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
// Compare content equality return players.get(oldItemPosition).equals(newPlayers.get(newItemPosition));
}
});
// Update the dataset this.players = newPlayers;
// Notify RecyclerView of changes diffResult.dispatchUpdatesTo(this);
}
// ViewHolder class public static class PlayerViewHolder extends RecyclerView.ViewHolder {
private TextView playerName;
public PlayerViewHolder(@NonNull View itemView) {
super(itemView);
playerName = itemView.findViewById(R.id.playerNameView);
}
public void bind(Player player) {
playerName.setText(player.getName());
}
}
}
Фрагмент
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.d(TAG, "onCreateView called");
// Inflate the layout for the fragment View view = inflater.inflate(R.layout.activity_mp_teams, container, false);
Log.d(TAG, "Layout inflated successfully");
// SharedPreferences for team names if (getActivity() != null) {
sharedPreferences = requireContext().getSharedPreferences("match_prefs", Context.MODE_PRIVATE);
}
// Initialize RecyclerViews and TextViews for team names team1RecyclerView = view.findViewById(R.id.team1PlayerRecyclerView);
team2RecyclerView = view.findViewById(R.id.team2PlayerRecyclerView);
TextView teamATextView = view.findViewById(R.id.team1TextView);
TextView teamBTextView = view.findViewById(R.id.team2TextView);
// Set team names in TextViews from SharedPreferences String teamAName = sharedPreferences.getString("teamAName", "");
String teamBName = sharedPreferences.getString("teamBName", "");
teamATextView.setText(teamAName);
teamBTextView.setText(teamBName);
// Set GridLayoutManager for RecyclerViews (4 columns per team) team1RecyclerView.setLayoutManager(new GridLayoutManager(getContext(), 4));
team2RecyclerView.setLayoutManager(new GridLayoutManager(getContext(), 4));
// Initialize adapters with empty lists team1Adapter = new PlayerAdapter(new ArrayList());
team2Adapter = new PlayerAdapter(new ArrayList());
// Set adapters to RecyclerViews team1RecyclerView.setAdapter(team1Adapter);
team2RecyclerView.setAdapter(team2Adapter);
// Initialize ViewModel teamViewModel = new ViewModelProvider(this).get(TeamViewModel.class);
Log.d(TAG, "onCreateView completed");
return view;
}
@Override public void onResume() {
super.onResume();
Log.d(TAG, "onResume called");
matchId = sharedPreferences.getLong("currentMatchId", -1);
teamViewModel.getPlayersForMatch((int) matchId).observe(getViewLifecycleOwner(), playerTeam -> {
Log.d(TAG, "LiveData observed, updating UI");
if (playerTeam != null) {
List team1Players = playerTeam.getTeam1Players();
List team2Players = playerTeam.getTeam2Players();
Log.d(TAG, "Team 1 Players Count: " + team1Players.size());
for (Player player : team1Players) {
Log.d(TAG, "Team 1 Player: " + player.toString());
}
// Update Team 1 Adapter team1Adapter.updatePlayers(team1Players);
Log.d(TAG, "Team 2 Players Count: " + team2Players.size());
for (Player player : team2Players) {
Log.d(TAG, "Team 2 Player: " + player.toString());
}
team2Adapter.updatePlayers(team2Players);
} else {
Log.e(TAG, "PlayerTeam object is null");
}
});Log.d(TAG, "onResume completed");
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79317620/recycler-view-not-getting-updated-when-ever-there-is-a-change-in-the-database[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия