Как обновить/перезагрузить фрагмент, у которого есть viewpager2 и FragmentStateAdapter(фрагментактивность)

#android #android-fragments #android-viewpager2 #fragmentstateadapter

Вопрос:

Я создаю приложение со штрих-кодом/rfid-кодом, которое состоит из 3 фрагментов. Я хотел бы перезагрузить FragmentB из FragmentA. Каждый раз, когда пользователь сканирует штрих-код и добавляет его в базу данных sqlite в FragmentA, он должен обновить список в FragmentB. Фрагмент B использует базу данных sqlite для отображения всех штрих-кодов. На данный момент фрагмент B показывает только список, который он первоначально запросил у sqlite при создании фрагмента. Я хотел бы обновить фрагмент при нажатии на него или перезагрузить фрагмент B при нажатии Добавить из фрагмента A. Я плохо разбираюсь в фрагментах и был бы признателен за детали. Я использую viewpager2 вместе с FragmentStateAdapter(фрагментактивность). Я искал в Интернете и нашел только ответы, касающиеся FragmentStateAdapter(FragmentManager), и ничего для FragmentStateAdapter(FragmentActivity).

ShippingViewPagerАдаптер2

 public class ShippingViewPagerAdapter2 extends FragmentStateAdapter {  public ShippingViewPagerAdapter2(@NonNull FragmentActivity fragmentActivity) {  super(fragmentActivity);   }  @NonNull @Override public Fragment createFragment(int position) {   switch (position){  case 0:    return new ShippingMainFragment();  case 1:   return new ShippingScannedFragment();  case 2:    return new ShippingUnscannedFragment();   }  return null; }   @Override public int getItemCount() {  return 3; }   }  

ДоставкаМеню

 public class ShippingMenu extends AppCompatActivity {     public int getItemPosition(Object object){  return PagerAdapter.POSITION_NONE; }  @Override public void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.viewpager2_item);   TabLayout tabs = findViewById(R.id.tabs);  ViewPager2 view_pager2 = findViewById(R.id.view_pager2);   ShippingViewPagerAdapter2 adapter= new ShippingViewPagerAdapter2(this);  view_pager2.setAdapter(adapter);    new TabLayoutMediator(tabs, view_pager2, new TabLayoutMediator.TabConfigurationStrategy() {  @Override  public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {  tab.setText(getPageTitle(position));  }  }).attach();  }  public CharSequence getPageTitle(int position) {   if (position == 0) {  return "MAIN";    }else if (position == 1) {   return "SCANNED";  } else{   return "UNSCANNED";  } } }  

ShippingMainFragment(FragmentA)

 public class ShippingMainFragment extends Fragment implements View.OnClickListener, IBarcodeResult {   public ShippingMainFragment() {  // Required empty public constructor }  /**  * Use this factory method to create a new instance of  * this fragment using the provided parameters.  * @return A new instance of fragment ShippingMainFragment.  */ // TODO: Rename and change types and number of parameters public static ShippingMainFragment newInstance(String param1, String param2) {  ShippingMainFragment fragment = new ShippingMainFragment();  return fragment; }    @Override public void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState); }  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState) {  // Inflate the layout for this fragment  View rootView= inflater.inflate(R.layout.fragment_shipping_main, container, false);    shippingAdd = (Button) rootView.findViewById(R.id.shippingAdd);   shippingAdd.setOnClickListener(this);  shippingAdd.setOnClickListener(new View.OnClickListener() {  @Override  public void onClick(View v) {  addTagToList();  }  });   return rootView; }  private void addTagToList() {      DBHelperScannedStock dbScannedStock = new DBHelperScannedStock(getActivity());   dbScannedStock.insertStock("", dbBarcode, dbTagID, dbProductCode, dbBlockNumber, dbSlabNumber, "", "",  "", "", "", dbLocationCode, "", dbSalesOrderNumber, "",  dbStatusID, dbStatusName, "", "", "");  }  

ShippingScannedFragment(фрагмент B)

 public class ShippingScannedFragment extends Fragment {   public ShippingScannedFragment() {  // Required empty public constructor }  /**  * Use this factory method to create a new instance of  * this fragment using the provided parameters.  * @return A new instance of fragment ShippingUnscannedFragment.  */ // TODO: Rename and change types and number of parameters public static ShippingScannedFragment newInstance(String param1, String param2) {  ShippingScannedFragment fragment = new ShippingScannedFragment();  fragment.setArguments(args);  return fragment; }   @Override public void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  }  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState) {  // Inflate the layout for this fragment  View rootView = inflater.inflate(R.layout.fragment_shipping_scanned, container, false);  dbScannedStock = new DBHelperScannedStock(getActivity());  Cursor cursor = dbScannedStock.viewData();    if (cursor.getCount() == 0) {  Toast.makeText(getActivity(), "SQLite No data to show", Toast.LENGTH_SHORT).show();  } else {  while (cursor.moveToNext()) {  scannedIDs.add(cursor.getString(cursor.getColumnIndex("id")));  Log.d("scannediddb", String.valueOf(scannedIDs));  scannedbarcodes.add(cursor.getString(cursor.getColumnIndex("Barcode")));  scannedproductCodes.add(cursor.getString(cursor.getColumnIndex("ProductCode")));  scannedtagids.add(cursor.getString(cursor.getColumnIndex("TagID")));  scannedlocations.add(cursor.getString(cursor.getColumnIndex("LocationCode")));  scannedslabnumbers.add(cursor.getString(cursor.getColumnIndex("SlabNumber")));  scannedblocknumbers.add(cursor.getString(cursor.getColumnIndex("BlockNumber")));  scannedsalesordernumbers.add(cursor.getString(cursor.getColumnIndex("SalesOrderNumber")));  scannedstatuses.add(cursor.getString(cursor.getColumnIndex("StatusName")));   }  }  scannedproductListItems = new ArrayListlt;ProductListItemsgt;();  ProductListItems item = new ProductListItems(scannedIDs.get(i), scannedbarcodes.get(i), scannedproductCodes.get(i), scannedlocations.get(i), scannedblocknumbers.get(i), scannedslabnumbers.get(i), scannedtagids.get(i), scannedsalesordernumbers.get(i), ScannedStatusName);  scannedproductListItems.add(item);  RecyclerViewAdapter recyclerViewAdapter = new RecyclerViewAdapter(getContext(), scannedproductListItems);   // Log.d("adapter",adapter.toString());  if (recyclerViewAdapter != null) {  Log.d("adapter", "notnull");  recyclerView = (RecyclerView) rootView.findViewById(R.id.recycler);  recyclerView.setLayoutManager(new LinearLayoutManager(getActivity().getApplicationContext(), LinearLayoutManager.VERTICAL, false));  recyclerView.setAdapter(recyclerViewAdapter);    } else {  Log.d("adapter", "null");  }  recyclerViewAdapter.notifyDataSetChanged();   });  return rootView; }  

Комментарии:

1. Я смог обновить фрагмент, используя onResume(). Вызвав оттуда весь мой процесс sqlite фрагмента, я смог запросить sqlite и заполнить его всякий раз, когда была нажата вкладка фрагмент. Не уверен, что это лучший способ сделать, но это то, что работает для меня и гарантирует, что текущие данные извлекаются из sqlite