Обновите RecyclerView во фрагменте

#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