更新片段中的 RecyclerView

Posted

技术标签:

【中文标题】更新片段中的 RecyclerView【英文标题】:Update RecyclerView in a Fragment 【发布时间】:2021-12-02 03:55:33 【问题描述】:

我创建了一个片段,我在其中实现了一个 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();

片段列表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;
    

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

谢谢,我尝试添加adapter.notifyDataSetChanged();在 recyclerView.setAdapter(适配器)之后的 FragmentListaPazienti 片段中;但列表没有更新。你能告诉我在哪里添加它。此外,我在主要活动中添加了项目,这是正确的还是应该直接将它们添加到片段中? @amirho3ein

以上是关于更新片段中的 RecyclerView的主要内容,如果未能解决你的问题,请参考以下文章

活动到片段通信:当我尝试从活动更新片段中的文本视图时,出现空指针异常

无法从 ViewPager 中的另一个片段刷新/更新片段中的列表视图

更新片段中的 RecyclerView

实时数据中的 Observables 更新在片段中不起作用

动态 TextView 未在片段中更新

如何更新 Tablayout 中的片段? (Viewpager2, FragmentStateAdapter)