#java #android #android-fragments #android-activity #android-recyclerview
Вопрос:
Я создал фрагмент, в котором реализовал просмотр вторсырья. Я заполняю просмотр вторсырья с помощью курсора, который извлекает данные из базы данных. Курсор делает это в основной активности. Проблема в том, что когда я добавляю или удаляю элемент, список RecyclerView не обновляется.
Основная Деятельность
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Sessione sessione = new Sessione(this);
String mailUtente = sessione.getSessione();
dbHelper = new DBHelper(this);
Cursor cursor = dbHelper.datiPaziente(mailUtente);
Pazienti lista = new Pazienti();
while (cursor.moveToNext()) {
lista.addItem(new Pazienti.PazientiItem(cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), cursor.getString(5)));
}
//Associo alla variabile il corrispettivo menu
bottomNavigation = findViewById(R.id.bottomNavigationView);
//Seleziono l'item di default
bottomNavigation.setSelectedItemId(R.id.navHome);
bottomNavigation.setOnNavigationItemSelectedListener (new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
//Inizializzo i fragment
Fragment fragment = null;
//Imposto le condizioni del menu
switch (item.getItemId()) {
case R.id.navHome:
//Scelta menu HOME
fragment = new FragmentListaPazienti();
break;
case R.id.navSearch:
//Scelta menu AGGIUNGI PAZIENTE (da modificare)
fragment = new FragmentAggiungiPaziente();
break;
case R.id.navInfo:
//Scelta menu INFO
fragment = new FragmentInfo();
break;
case R.id.navLogout:
//Scelta menu LOGOUT
fragment = new FragmentLogout();
break;
}
// Carico i fragment
loadFragment(fragment);
return true;
}
});
setDefaultFragment();
//Implemento il FAB
floatingActionButton = findViewById(R.id.fab);
floatingActionButton.setOnClickListener(new View.OnClickListener() {
Fragment fragment = null;
@Override
public void onClick(View view) {
fragment = new FragmentAggiungiPaziente();
loadFragment(fragment);
}
});
}
private void loadFragment(Fragment fragment) {
getSupportFragmentManager().beginTransaction().replace(R.id.frameLayoutMain,fragment).addToBackStack(null).commit();
}
private void setDefaultFragment() {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.frameLayoutMain, new FragmentListaPazienti());
transaction.commit();
}
@Override
//Questo metodo mi dice cosa fare quando clicco sul singolo item
public void onListFragmentInteraction(Pazienti.PazientiItem item) {
fdet = FragmentSingoloPaziente.newInstance(item.nome, item.cognome, item.data, item.mail, item.telefono);
getSupportFragmentManager().beginTransaction().replace(R.id.frameLayoutMain, fdet).addToBackStack(null).commit();
}}
Fragment Lista Pazienti
//Codice professore
private static final String ARG_COLUMN_COUNT = "column-count"; //numero di colonne
private int mColumnCount = 1; //n° colonne inizializzato a 1
private OnListFragmentInteractionListener mListener; //interfaccia per comunicare con il fragment
AdapterPazienti adapter;
DBHelper dbHelper;
public FragmentListaPazienti() {
}
// TODO: Customize parameter initialization
@SuppressWarnings("unused")
public static FragmentListaPazienti newInstance(int columnCount) {
FragmentListaPazienti fragment = new FragmentListaPazienti();
Bundle args = new Bundle(); //salva in un bundle il parametro (nel nostro caso è un intero)
args.putInt(ARG_COLUMN_COUNT, columnCount);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mColumnCount = getArguments().getInt(ARG_COLUMN_COUNT);
//verifica che ci sono argomenti passati tramite il metodo setArguments. Se getArguments
//non è nullo, allora prendo questi argomenti e setto la variabile mColumnCount
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_lista_pazienti, container, false);
// Set the adapter
if (view instanceof RecyclerView) {
Context context = view.getContext();
RecyclerView recyclerView = (RecyclerView) view;
if (mColumnCount <= 1) {
recyclerView.setLayoutManager(new LinearLayoutManager(context));
} else {
recyclerView.setLayoutManager(new GridLayoutManager(context, mColumnCount));
}
//recyclerView.setAdapter(new AdapterPazienti(Pazienti.ITEMS, mListener));
//Invece di scrivere la riga qui sopra, avrei potuto farlo così:
adapter = new AdapterPazienti(Pazienti.ITEMS, mListener);
recyclerView.setAdapter(adapter);
}
return view;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnListFragmentInteractionListener) {
mListener = (OnListFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
" must implement OnListFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
public interface OnListFragmentInteractionListener {
// TODO: Update argument type and name
void onListFragmentInteraction(Pazienti.PazientiItem item); //questo metodo dovrà essere implementato dalla MainActivity
// che dovrà dire cosa fare in caso di pressione di un item della lista. DummyItem è l'oggetto che ha il
// contenuto di un singolo item della lista
}
Pazienti
public static final List<PazientiItem> ITEMS = new ArrayList<PazientiItem>();
public static void addItem(PazientiItem item) {
//aggiungo un item alla lista
ITEMS.add(item);
}
public static class PazientiItem {
//Qui descrivo il contenuto del dato
public final String nome;
public final String cognome;
public final String data;
public final String mail;
public final String telefono;
public PazientiItem(String nome, String cognome, String data, String mail, String telefono) {
this.nome = nome;
this.cognome = cognome;
this.data = data;
this.mail = mail;
this.telefono = telefono;
}
@Override
public String toString() {
return cognome;
}
}
Ответ №1:
вам нужно позвонить adapter.notifyDataSetChanged()
после добавления элемента в список. итак, во фрагменте вам нужно выполнить что-то подобное, чтобы добавить элемент в RecyclerView
:
Pazienti.addItem(aNewItem);
adapter.notifyDataSetChanged();
Комментарии:
1. Спасибо, я попытался добавить adapter.notifyDataSetChanged (); во ФрагментЛистаПазиенти после RecyclerView.setAdapter (адаптер); но список не обновляется. Не могли бы вы сказать мне, куда его добавить. более того, я добавляю элементы в основное действие, это правильно или я должен добавить их непосредственно во фрагмент? @amirho3ein