Представление Recycler не обновляется при любых изменениях в базе данных.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Представление Recycler не обновляется при любых изменениях в базе данных.

Сообщение 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");
}
}


Подробнее здесь: https://stackoverflow.com/questions/793 ... e-database
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»