#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