更新片段中的 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的主要内容,如果未能解决你的问题,请参考以下文章
活动到片段通信:当我尝试从活动更新片段中的文本视图时,出现空指针异常