首页 > 解决方案 > 更新片段中的 RecyclerView

问题描述

我创建了一个片段,我在其中实现了一个 recyclerView。我使用从数据库中获取数据的游标填充 recyclerView。光标在 MainActivity 中执行此操作。问题是当我添加或删除一个项目时,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
}

帕济恩蒂

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;
    }
}

标签: javaandroidandroid-fragmentsandroid-activityandroid-recyclerview

解决方案


您需要adapter.notifyDataSetChanged()在将项目添加到列表后调用。所以在片段中你需要执行这样的事情来添加一个项目RecyclerView

 Pazienti.addItem(aNewItem);
 adapter.notifyDataSetChanged();

推荐阅读