如何删除viewpager2中无用的片段

jtoj6r0c  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(405)

如何摧毁 retain Fragmentsunused Fragments ( Fragment 数字为1-4) ViewPager2 当正确的交换。我只要 retain one Fragment 左边 visible Fragment (片段5)?

  1. private static class SettingAdapter extends FragmentStateAdapter {
  2. public SettingAdapter(@NonNull Fragment fragment) {
  3. super(fragment);
  4. }
  5. public void destroyUnusedFragment(){
  6. // ?
  7. }
  8. @NonNull
  9. @Override
  10. public Fragment createFragment(int position) {
  11. Log.i("xxx", "createFragment: " + position);
  12. switch (position) {
  13. default:
  14. case 0:
  15. return new Fragment1();
  16. case 1:
  17. return new Fragment2();
  18. case 2:
  19. return new Fragment3();
  20. case 3:
  21. return new Fragment4();
  22. case 4:
  23. return new Fragment5();
  24. case 5:
  25. return new DispenserFragment();
  26. case 6:
  27. return new Fragment7();
  28. case 7:
  29. return new Fragment8();
  30. case 8:
  31. return new Fragment9();
  32. case 9:
  33. return new Fragment10();
  34. case 10:
  35. return new Fragment11();
  36. case 11:
  37. return new Fragment12();
  38. case 12:
  39. return new Fragment13();
  40. case 13:
  41. return new Fragment14();
  42. case 14:
  43. return new Fragment15();
  44. }
  45. }
  46. @Override
  47. public int getItemCount() {
  48. return 15;
  49. }
  50. }
  51. // call above from onCreateView in Fragment
  52. String[] titles = getSettingTabTitlesRes(context);
  53. settingAdapter = new SettingAdapter(this);
  54. binding.settingViewpager.setOffscreenPageLimit(1);
  55. binding.settingViewpager.setAdapter(settingAdapter);
  56. new TabLayoutMediator(binding.settingTablayout, binding.settingViewpager, (tab, position) -> {
  57. tab.setText(titles[position]);
  58. }).attach();


  1. package id.ctech.dispenser_pos.ui.fragment.setting.dispenser.view;
  2. import android.app.Activity;
  3. import android.content.Context;
  4. import android.content.DialogInterface;
  5. import android.graphics.Color;
  6. import android.os.Bundle;
  7. import android.util.Log;
  8. import android.view.LayoutInflater;
  9. import android.view.View;
  10. import android.view.ViewGroup;
  11. import androidx.annotation.NonNull;
  12. import androidx.annotation.Nullable;
  13. import androidx.appcompat.app.AlertDialog;
  14. import androidx.core.content.ContextCompat;
  15. import androidx.fragment.app.Fragment;
  16. import java.util.List;
  17. import id.ctech.dispenser_pos.R;
  18. import id.ctech.dispenser_pos.databinding.FragmentDispenserBinding;
  19. import id.ctech.dispenser_pos.db.local.datasource.setting.dispenser.dispenser.DispenserDataSource;
  20. import id.ctech.dispenser_pos.db.local.datasource.setting.dispenser.dispenser_brand.DispenserBrandDataSource;
  21. import id.ctech.dispenser_pos.db.local.datasource.setting.nozzle.NozzleDataSourceHelper;
  22. import id.ctech.dispenser_pos.db.local.datasource.setting.work_schedule.shift_work.ShiftWorkDataSourceHelper;
  23. import id.ctech.dispenser_pos.db.local.datasource.setting.work_schedule.work_schedule.WorkScheduleDataSourceHelper;
  24. import id.ctech.dispenser_pos.etc.ChooseColor;
  25. import id.ctech.dispenser_pos.etc.ThreadExecutors;
  26. import id.ctech.dispenser_pos.ui.activity.main.MainActivity;
  27. import id.ctech.dispenser_pos.ui.compound.table.listeners.ITableDataClickListener;
  28. import id.ctech.dispenser_pos.ui.compound.table.listeners.ITableDataLongClickListener;
  29. import id.ctech.dispenser_pos.ui.fragment.etc.DebouncedOnClickListener;
  30. import id.ctech.dispenser_pos.ui.fragment.setting.SettingFragment;
  31. import id.ctech.dispenser_pos.ui.fragment.setting.dispenser.model.Dispenser;
  32. import id.ctech.dispenser_pos.ui.fragment.setting.dispenser.model.DispenserBrand;
  33. import id.ctech.dispenser_pos.ui.fragment.setting.dispenser.presenter.DispenserPresenter;
  34. import id.ctech.dispenser_pos.ui.fragment.setting.dispenser.presenter.IDispenserPresenter;
  35. import id.ctech.dispenser_pos.ui.fragment.setting.dispenser.view.table.dispenser.DispenserDataAdapter;
  36. import id.ctech.dispenser_pos.ui.fragment.setting.dispenser.view.table.dispenser_brand.DispenserBrandDataAdapter;
  37. import id.ctech.dispenser_pos.ui.fragment.setting.nozzle.model.Nozzle;
  38. import id.ctech.dispenser_pos.ui.fragment.setting.user_account.model.UserAccount;
  39. import id.ctech.dispenser_pos.ui.fragment.setting.work_schedule.model.ShiftWork;
  40. import id.ctech.dispenser_pos.ui.fragment.setting.work_schedule.model.WorkSchedule;
  41. import static android.widget.Toast.LENGTH_SHORT;
  42. import static id.ctech.dispenser_pos.dev.dispenser.ENozzleStatus.IN_HOLSTER;
  43. import static id.ctech.dispenser_pos.etc.Common.ADMIN;
  44. import static id.ctech.dispenser_pos.etc.Common.getDispenser;
  45. import static id.ctech.dispenser_pos.etc.Common.getNozzles;
  46. import static id.ctech.dispenser_pos.etc.Common.getShiftWorks;
  47. import static id.ctech.dispenser_pos.etc.Common.getWorkSchedules;
  48. import static id.ctech.dispenser_pos.etc.CommonColor.readThemeFromPref;
  49. import static id.ctech.dispenser_pos.etc.CommonDate.toShortTime24;
  50. import static id.ctech.dispenser_pos.ui.compound.alert_dialog.SweetAlertDialog.showConfirmDialog;
  51. import static id.ctech.dispenser_pos.ui.compound.snackbar.SweetSnackbar.showSnackbarError;
  52. import static id.ctech.dispenser_pos.ui.compound.snackbar.SweetSnackbar.showSnackbarInfo;
  53. import static id.ctech.dispenser_pos.ui.compound.snackbar.SweetSnackbar.showSnackbarSuccess;
  54. public class DispenserFragment extends Fragment implements IDispenserView {
  55. private final static int PREV_PAGE = 3;
  56. private final static int NEXT_PAGE = 5;
  57. private Context context;
  58. private IDispenserPresenter iDispenserPresenter;
  59. // Dispenser
  60. private DispenserDataAdapter dispenserDataAdapter;
  61. private Dispenser dispenserClicked = null, dispenserLongClicked = null;
  62. private int dispenserClickedRowIndex = -1, dispenserLongClickedRowIndex = -1;
  63. private int hiddenNewID;
  64. // DispenserBrand
  65. private DispenserBrandDataAdapter dispenserBrandDataAdapter;
  66. private DispenserBrand dispenserBrandClicked = null, dispenserBrandLongClicked = null;
  67. private int dispenserBrandClickedRowIndex = -1, dispenserBrandLongClickedRowIndex = -1;
  68. private int dispenserBrandNewID;
  69. private FragmentDispenserBinding binding;
  70. private ThreadExecutors threadExecutors;
  71. private UserAccount signInAccount;
  72. //
  73. private Dispenser dispenser;
  74. private Nozzle[] nozzles;
  75. private ShiftWork[] shiftWorks;
  76. private WorkSchedule[] workSchedules;
  77. private int nozzleQty;
  78. private int shiftWorkQty;
  79. public DispenserFragment() {
  80. }
  81. private void readDispenser() {
  82. try {
  83. dispenser = getDispenser(context);
  84. if (dispenser == null) {
  85. showSnackbarError(getString(R.string.message_failed_to_load_dispenser_module), LENGTH_SHORT);
  86. }
  87. } catch (Exception ex) {
  88. ex.printStackTrace();
  89. }
  90. }
  91. private void readNozzles() {
  92. try {
  93. nozzles = getNozzles(context);
  94. if (nozzles.length == 0) {
  95. showSnackbarError(getString(R.string.message_failed_to_load_nozzle_module), LENGTH_SHORT);
  96. }
  97. } catch (Exception ex) {
  98. ex.printStackTrace();
  99. }
  100. }
  101. private void readShiftWorks() {
  102. try {
  103. shiftWorks = getShiftWorks(context);
  104. if (shiftWorks.length == 0) {
  105. showSnackbarError(getString(R.string.message_failed_to_load_shift_work_module), LENGTH_SHORT);
  106. }
  107. } catch (Exception ex) {
  108. ex.printStackTrace();
  109. }
  110. }
  111. private void readWorkSchedules() {
  112. try {
  113. workSchedules = getWorkSchedules(context);
  114. if (workSchedules.length == 0) {
  115. showSnackbarError(getString(R.string.message_failed_to_load_work_schedule_module), LENGTH_SHORT);
  116. }
  117. } catch (Exception ex) {
  118. ex.printStackTrace();
  119. }
  120. }
  121. private void nozzleSync() {
  122. try {
  123. readDispenser();
  124. readNozzles();
  125. // nozzle sync
  126. if (dispenser != null && nozzles != null) {
  127. nozzleQty = dispenser.getNozzleQty(); // references
  128. if (nozzleQty < nozzles.length) {
  129. for (int i = nozzleQty + 1; i <= nozzles.length; i++) {
  130. NozzleDataSourceHelper.deleteNozzle(context, i);
  131. }
  132. } else if (nozzleQty > nozzles.length) {
  133. for (int i = nozzles.length + 1; i <= nozzleQty; i++) {
  134. Nozzle nozzle = new Nozzle(i, i, 0, 0, 0, 0, IN_HOLSTER);
  135. NozzleDataSourceHelper.createNozzle(context, nozzle);
  136. }
  137. }
  138. nozzles = getNozzles(context);
  139. // nozzle validation
  140. nozzleQty = dispenser.getNozzleQty();
  141. if (nozzleQty != nozzles.length) {
  142. showSnackbarError(getString(R.string.message_nozzle_sync_failed), LENGTH_SHORT);
  143. }
  144. }
  145. } catch (Exception ex) {
  146. ex.printStackTrace();
  147. }
  148. }
  149. private void shiftWorkSync() {
  150. try {
  151. readDispenser();
  152. readShiftWorks();
  153. // shift work sync
  154. if (dispenser != null && shiftWorks != null) {
  155. shiftWorkQty = dispenser.getShiftWorkQty(); // references
  156. if (shiftWorkQty < shiftWorks.length) {
  157. for (int i = shiftWorkQty + 1; i <= shiftWorks.length; i++) {
  158. ShiftWorkDataSourceHelper.deleteShiftWork(context, i);
  159. }
  160. } else if (shiftWorkQty > shiftWorks.length) {
  161. for (int i = shiftWorks.length + 1; i <= shiftWorkQty; i++) {
  162. String strTime24 = "";
  163. switch (i) {
  164. case 1:
  165. strTime24 = "06:00";
  166. break;
  167. case 2:
  168. strTime24 = "14:00";
  169. break;
  170. case 3:
  171. strTime24 = "22:00";
  172. break;
  173. }
  174. // create shift work
  175. ShiftWork shiftWork = new ShiftWork(i, toShortTime24(strTime24));
  176. ShiftWorkDataSourceHelper.createShiftWork(context, shiftWork);
  177. }
  178. }
  179. shiftWorks = getShiftWorks(context);
  180. // shiftWorks validation
  181. shiftWorkQty = dispenser.getShiftWorkQty();
  182. if (shiftWorkQty != shiftWorks.length) {
  183. showSnackbarError(getString(R.string.message_shiftworks_sync_failed), LENGTH_SHORT);
  184. }
  185. }
  186. } catch (Exception ex) {
  187. ex.printStackTrace();
  188. }
  189. }
  190. private void workScheduleSync() {
  191. try {
  192. readDispenser();
  193. readWorkSchedules();
  194. // work schedule sync
  195. if (dispenser != null && workSchedules != null) {
  196. nozzleQty = dispenser.getNozzleQty(); // references
  197. if (nozzleQty < workSchedules.length) {
  198. for (int i = nozzleQty + 1; i <= workSchedules.length; i++) {
  199. WorkScheduleDataSourceHelper.deleteWorkSchedule(context, i);
  200. }
  201. } else if (nozzleQty > workSchedules.length) {
  202. for (int i = workSchedules.length + 1; i <= nozzleQty; i++) {
  203. WorkSchedule workSchedule = new WorkSchedule(i, i, 1, 1, 1);
  204. WorkScheduleDataSourceHelper.createWorkSchedule(context, workSchedule);
  205. }
  206. }
  207. workSchedules = getWorkSchedules(context);
  208. // work schedule validation
  209. nozzleQty = dispenser.getNozzleQty();
  210. if (nozzleQty != workSchedules.length) {
  211. showSnackbarError(getString(R.string.message_workschedule_sync_failed), LENGTH_SHORT);
  212. }
  213. }
  214. } catch (Exception ex) {
  215. ex.printStackTrace();
  216. }
  217. }
  218. private void doSyncs() {
  219. try {
  220. nozzleSync();
  221. shiftWorkSync();
  222. workScheduleSync();
  223. } catch (Exception ex) {
  224. ex.printStackTrace();
  225. }
  226. }
  227. @Override
  228. public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  229. try {
  230. Log.i("xxx", "DispenserFragment onCreateView");
  231. context = getActivity();
  232. if (context != null) {
  233. binding = FragmentDispenserBinding.inflate(inflater, container, false);
  234. View rootView = binding.getRoot();
  235. threadExecutors = ThreadExecutors.getInstance();
  236. doSyncs();
  237. DispenserDataSource dispenserDataSource = DispenserDataSource.getInstance(context);
  238. DispenserBrandDataSource dispenserBrandDataSource = DispenserBrandDataSource.getInstance(context);
  239. new DispenserPresenter(context, dispenserDataSource, dispenserBrandDataSource, this);
  240. // DispenserBrand
  241. binding.dispenserBrandAddButton.setOnClickListener(new DispenserBrandAddButtonClickListener());
  242. binding.dispenserBrandEditButton.setOnClickListener(new DispenserBrandEditButtonClickListener());
  243. binding.dispenserBrandDeleteButton.setOnClickListener(new DispenserBrandDeleteButtonClickListener());
  244. iDispenserPresenter.readDispenserBrands();
  245. // dispenser
  246. binding.dispenserPrevButton.setOnClickListener(new DispenserPrevButtonClickListener());
  247. binding.dispenserNextButton.setOnClickListener(new DispenserNextButtonClickListener());
  248. binding.dispenserAddButton.setOnClickListener(new DispenserAddButtonClickListener());
  249. binding.dispenserEditButton.setOnClickListener(new DispenserEditButtonClickListener());
  250. binding.dispenserDeleteButton.setOnClickListener(new DispenserDeleteButtonClickListener());
  251. signInAccount = ((MainActivity) getActivity()).getSignInAccount();
  252. iDispenserPresenter.readDispensers();
  253. setTheme(context);
  254. return rootView;
  255. }
  256. } catch (Exception ex) {
  257. ex.printStackTrace();
  258. }
  259. return null;
  260. }
  261. private void setTheme(@NonNull Context context) {
  262. try {
  263. // set theme from pref
  264. ChooseColor chooseColor = readThemeFromPref(context);
  265. if (chooseColor != null) {
  266. context.setTheme(chooseColor.getTheme()); // app theme (default: R.style.app_theme_red)
  267. }
  268. Activity activity = getActivity();
  269. if (activity != null) {
  270. int colorPrimary = ((MainActivity) activity).getColorPrimary();
  271. binding.dispenserAddButton.setBackgroundColor(colorPrimary);
  272. binding.dispenserDeleteButton.setBackgroundColor(colorPrimary);
  273. binding.dispenserEditButton.setBackgroundColor(colorPrimary);
  274. binding.dispenserPrevButton.setBackgroundColor(colorPrimary);
  275. binding.dispenserNextButton.setBackgroundColor(colorPrimary);
  276. binding.dispenserBrandAddButton.setBackgroundColor(colorPrimary);
  277. binding.dispenserBrandDeleteButton.setBackgroundColor(colorPrimary);
  278. binding.dispenserBrandEditButton.setBackgroundColor(colorPrimary);
  279. }
  280. } catch (Exception ex) {
  281. ex.printStackTrace();
  282. }
  283. }
  284. @Override
  285. public void onDestroyView() {
  286. super.onDestroyView();
  287. Log.i("xxx", "DispenserFragment onDestroyView");
  288. binding = null;
  289. threadExecutors = null;
  290. dispenserBrandDataAdapter = null;
  291. dispenserBrandClicked = null;
  292. dispenserBrandLongClicked = null;
  293. dispenserDataAdapter = null;
  294. dispenserClicked = null;
  295. dispenserLongClicked = null;
  296. }
  297. @Override
  298. public void setPresenter(@NonNull IDispenserPresenter iPresenter) {
  299. iDispenserPresenter = iPresenter;
  300. }
  301. // DispenserBrand
  302. @Override
  303. public void onCreateDispenserBrand(boolean result) {
  304. Runnable r = () -> {
  305. try {
  306. if (binding == null) {
  307. return;
  308. }
  309. if (result) {
  310. showSnackbarSuccess(getString(R.string.message_successfully_to_save_data), LENGTH_SHORT);
  311. iDispenserPresenter.readDispenserBrands();
  312. binding.dispenserBrandAddButton.setText(getString(R.string.button_add));
  313. binding.dispenserBrandEditButton.setEnabled(true);
  314. binding.dispenserBrandDeleteButton.setEnabled(true);
  315. binding.dispenserBrandAddButton.setTextColor(Color.WHITE);
  316. } else {
  317. showSnackbarError(getString(R.string.message_failed_to_save_data), LENGTH_SHORT);
  318. }
  319. } catch (Exception ex) {
  320. ex.printStackTrace();
  321. }
  322. };
  323. threadExecutors.getMainThreadExecutor().execute(r);
  324. }
  325. @Override
  326. public void onReadDispenserBrands(@NonNull List<DispenserBrand> dispenserBrandList) {
  327. Runnable r = () -> {
  328. try {
  329. if (binding == null) {
  330. return;
  331. }
  332. dispenserBrandDataAdapter = new DispenserBrandDataAdapter(context, dispenserBrandList, binding.dispenserBrandTable);
  333. dispenserBrandDataAdapter.setSelectedColor(-1);
  334. binding.dispenserBrandTable.setDataAdapter(dispenserBrandDataAdapter);
  335. binding.dispenserBrandTable.sort(0, true);
  336. binding.dispenserBrandTable.invalidate();
  337. binding.dispenserBrandTable.removeDataClickListener(new DispenserBrandClickListener());
  338. binding.dispenserBrandTable.removeDataLongClickListener(new DispenserBrandLongClickListener());
  339. binding.dispenserBrandTable.addDataClickListener(new DispenserBrandClickListener());
  340. binding.dispenserBrandTable.addDataLongClickListener(new DispenserBrandLongClickListener());
  341. dispenserBrandClickedRowIndex = -1;
  342. dispenserBrandClicked = null;
  343. dispenserBrandLongClickedRowIndex = -1;
  344. dispenserBrandLongClicked = null;
  345. } catch (Exception ex) {
  346. ex.printStackTrace();
  347. }
  348. };
  349. threadExecutors.getMainThreadExecutor().execute(r);
  350. }
  351. @Override
  352. public void onUpdateDispenserBrand(boolean result) {
  353. Runnable r = () -> {
  354. try {
  355. if (binding == null) {
  356. return;
  357. }
  358. if (result) {
  359. showSnackbarSuccess(getString(R.string.message_successfully_to_save_data), LENGTH_SHORT);
  360. iDispenserPresenter.readDispenserBrands();
  361. binding.dispenserBrandEditButton.setText(getString(R.string.button_edit));
  362. binding.dispenserBrandAddButton.setEnabled(true);
  363. binding.dispenserBrandDeleteButton.setEnabled(true);
  364. binding.dispenserBrandEditButton.setTextColor(Color.WHITE);
  365. } else {
  366. showSnackbarError(getString(R.string.message_failed_to_save_data), LENGTH_SHORT);
  367. }
  368. } catch (Exception ex) {
  369. ex.printStackTrace();
  370. }
  371. };
  372. threadExecutors.getMainThreadExecutor().execute(r);
  373. }
  374. @Override
  375. public void onDeleteDispenserBrand(boolean result) {
  376. Runnable r = () -> {
  377. try {
  378. if (binding == null) {
  379. return;
  380. }
  381. if (result) {
  382. showSnackbarSuccess(getString(R.string.message_data_deleted), LENGTH_SHORT);
  383. } else {
  384. showSnackbarError(getString(R.string.message_failed_to_delete_data), LENGTH_SHORT);
  385. }
  386. iDispenserPresenter.readDispenserBrands();
  387. binding.dispenserBrandAddButton.setEnabled(true);
  388. binding.dispenserBrandEditButton.setEnabled(true);
  389. } catch (Exception ex) {
  390. ex.printStackTrace();
  391. }
  392. };
  393. threadExecutors.getMainThreadExecutor().execute(r);
  394. }
  395. @Override
  396. public void onNewIDDispenserBrand(int ID) {
  397. Runnable r = () -> {
  398. try {
  399. if (binding == null) {
  400. return;
  401. }
  402. dispenserBrandNewID = ID;
  403. dispenserBrandDataAdapter.add(new DispenserBrand(dispenserBrandNewID, ""));
  404. dispenserBrandDataAdapter.notifyDataSetChanged();
  405. binding.dispenserBrandTable.enterEditMode();
  406. } catch (Exception ex) {
  407. ex.printStackTrace();
  408. }
  409. };
  410. threadExecutors.getMainThreadExecutor().execute(r);
  411. }
  412. @Override
  413. public void onErrorDispenserBrand(@NonNull Throwable result) {
  414. Runnable r = () -> {
  415. try {
  416. String strMessage = result.getMessage();
  417. if (strMessage != null) {
  418. showSnackbarError(strMessage, LENGTH_SHORT);
  419. }
  420. } catch (Exception ex) {
  421. ex.printStackTrace();
  422. }
  423. };
  424. threadExecutors.getMainThreadExecutor().execute(r);
  425. }
  426. // Dispenser
  427. @Override
  428. public void onCreateDispenser(boolean result) {
  429. Runnable r = () -> {
  430. try {
  431. if (binding == null) {
  432. return;
  433. }
  434. if (result) {
  435. showSnackbarSuccess(getString(R.string.message_successfully_to_save_data), LENGTH_SHORT);
  436. iDispenserPresenter.readDispensers();
  437. binding.dispenserAddButton.setText(getString(R.string.button_add));
  438. binding.dispenserEditButton.setEnabled(true);
  439. binding.dispenserDeleteButton.setEnabled(true);
  440. binding.dispenserAddButton.setTextColor(Color.WHITE);
  441. doSyncs();
  442. } else {
  443. showSnackbarError(getString(R.string.message_failed_to_save_data), LENGTH_SHORT);
  444. }
  445. } catch (Exception ex) {
  446. ex.printStackTrace();
  447. }
  448. };
  449. threadExecutors.getMainThreadExecutor().execute(r);
  450. }
  451. @Override
  452. public void onReadDispensers(@NonNull List<Dispenser> result) {
  453. Runnable r = () -> {
  454. try {
  455. if (binding == null) {
  456. return;
  457. }
  458. dispenserDataAdapter = new DispenserDataAdapter(context, result, binding.dispenserTable);
  459. dispenserDataAdapter.setSelectedColor(-1);
  460. binding.dispenserTable.setDataAdapter(dispenserDataAdapter);
  461. binding.dispenserTable.sort(0, true);
  462. binding.dispenserTable.invalidate();
  463. binding.dispenserTable.removeDataClickListener(new DispenserClickListener());
  464. binding.dispenserTable.removeDataLongClickListener(new DispenserLongClickListener());
  465. binding.dispenserTable.addDataClickListener(new DispenserClickListener());
  466. binding.dispenserTable.addDataLongClickListener(new DispenserLongClickListener());
  467. dispenserClickedRowIndex = -1;
  468. dispenserClicked = null;
  469. dispenserLongClickedRowIndex = -1;
  470. dispenserLongClicked = null;
  471. } catch (Exception ex) {
  472. ex.printStackTrace();
  473. }
  474. };
  475. threadExecutors.getMainThreadExecutor().execute(r);
  476. }
  477. @Override
  478. public void onUpdateDispenser(boolean result) {
  479. Runnable r = () -> {
  480. try {
  481. if (binding == null) {
  482. return;
  483. }
  484. if (result) {
  485. showSnackbarSuccess(getString(R.string.message_successfully_to_save_data), LENGTH_SHORT);
  486. iDispenserPresenter.readDispensers();
  487. binding.dispenserEditButton.setText(getString(R.string.button_edit));
  488. binding.dispenserAddButton.setEnabled(true);
  489. binding.dispenserDeleteButton.setEnabled(true);
  490. binding.dispenserEditButton.setTextColor(Color.WHITE);
  491. doSyncs();
  492. } else {
  493. showSnackbarError(getString(R.string.message_failed_to_save_data), LENGTH_SHORT);
  494. }
  495. } catch (Exception ex) {
  496. ex.printStackTrace();
  497. }
  498. };
  499. threadExecutors.getMainThreadExecutor().execute(r);
  500. }
  501. @Override
  502. public void onDeleteDispenser(boolean result) {
  503. Runnable r = () -> {
  504. try {
  505. if (binding == null) {
  506. return;
  507. }
  508. if (result) {
  509. showSnackbarSuccess(getString(R.string.message_data_deleted), LENGTH_SHORT);
  510. doSyncs();
  511. } else {
  512. showSnackbarError(getString(R.string.message_failed_to_delete_data), LENGTH_SHORT);
  513. }
  514. iDispenserPresenter.readDispensers();
  515. binding.dispenserAddButton.setEnabled(true);
  516. binding.dispenserEditButton.setEnabled(true);
  517. } catch (Exception ex) {
  518. ex.printStackTrace();
  519. }
  520. };
  521. threadExecutors.getMainThreadExecutor().execute(r);
  522. }
  523. @Override
  524. public void onNewIDDispenser(int ID) {
  525. Runnable r = () -> {
  526. try {
  527. if (binding == null) {
  528. return;
  529. }
  530. hiddenNewID = ID;
  531. // create default dispenser (dispenserId:1, dispenserType:new, nozzleQty:8, workScheduleQty:3)
  532. dispenserDataAdapter.add(new Dispenser(hiddenNewID, 1, 2, 8, 3));
  533. dispenserDataAdapter.notifyDataSetChanged();
  534. binding.dispenserTable.enterEditMode();
  535. } catch (Exception ex) {
  536. ex.printStackTrace();
  537. }
  538. };
  539. threadExecutors.getMainThreadExecutor().execute(r);
  540. }
  541. @Override
  542. public void onErrorDispenser(@NonNull Throwable result) {
  543. Runnable r = () -> {
  544. try {
  545. String strMessage = result.getMessage();
  546. if (strMessage != null) {
  547. showSnackbarError(strMessage, LENGTH_SHORT);
  548. }
  549. } catch (Exception ex) {
  550. ex.printStackTrace();
  551. }
  552. };
  553. threadExecutors.getMainThreadExecutor().execute(r);
  554. }
  555. // DispenserBrand
  556. private class DispenserBrandAddButtonClickListener extends DebouncedOnClickListener {
  557. @Override
  558. public void onDebouncedClick(final View v) {
  559. }
  560. }
  561. private class DispenserBrandEditButtonClickListener extends DebouncedOnClickListener {
  562. @Override
  563. public void onDebouncedClick(View v) {
  564. }
  565. }
  566. private class DispenserBrandDeleteButtonClickListener extends DebouncedOnClickListener {
  567. @Override
  568. public void onDebouncedClick(View v) {
  569. }
  570. }
  571. private class DispenserBrandClickListener implements ITableDataClickListener<DispenserBrand> {
  572. @Override
  573. public void onDataClicked(int rowIndex, DispenserBrand clickedData) {
  574. }
  575. }
  576. private class DispenserBrandLongClickListener implements ITableDataLongClickListener<DispenserBrand> {
  577. @Override
  578. public boolean onDataLongClicked(int rowIndex, DispenserBrand clickedData) {
  579. return false;
  580. }
  581. }
  582. // Dispenser
  583. private class DispenserPrevButtonClickListener extends DebouncedOnClickListener {
  584. @Override
  585. public void onDebouncedClick(View v) {
  586. }
  587. }
  588. private class DispenserNextButtonClickListener extends DebouncedOnClickListener {
  589. @Override
  590. public void onDebouncedClick(View v) {
  591. }
  592. }
  593. private class DispenserAddButtonClickListener extends DebouncedOnClickListener {
  594. @Override
  595. public void onDebouncedClick(final View v) {
  596. }
  597. }
  598. private class DispenserEditButtonClickListener extends DebouncedOnClickListener {
  599. @Override
  600. public void onDebouncedClick(View v) {
  601. }
  602. }
  603. private class DispenserDeleteButtonClickListener extends DebouncedOnClickListener {
  604. @Override
  605. public void onDebouncedClick(View v) {
  606. }
  607. }
  608. private class DispenserClickListener implements ITableDataClickListener<Dispenser> {
  609. @Override
  610. public void onDataClicked(int rowIndex, Dispenser clickedData) {
  611. }
  612. }
  613. private class DispenserLongClickListener implements ITableDataLongClickListener<Dispenser> {
  614. @Override
  615. public boolean onDataLongClicked(int rowIndex, Dispenser clickedData) {
  616. return false;
  617. }
  618. }
  619. }
jfgube3f

jfgube3f1#

viewpager2的错误,我得到如下解决方案:

  1. /**
  2. * Sets whether the LayoutManager should be queried for views outside of
  3. * its viewport while the UI thread is idle between frames.
  4. *
  5. * <p>If enabled, the LayoutManager will be queried for items to inflate/bind in between
  6. * view system traversals on devices running API 21 or greater. Default value is true.</p>
  7. *
  8. * <p>On platforms API level 21 and higher, the UI thread is idle between passing a frame
  9. * to RenderThread and the starting up its next frame at the next VSync pulse. By
  10. * prefetching out of window views in this time period, delays from inflation and view
  11. * binding are much less likely to cause jank and stuttering during scrolls and flings.</p>
  12. *
  13. * <p>While prefetch is enabled, it will have the side effect of expanding the effective
  14. * size of the View cache to hold prefetched views.</p>
  15. *
  16. * @param enabled <code>True</code> if items should be prefetched in between traversals.
  17. *
  18. * @see #isItemPrefetchEnabled()
  19. */
  20. RecyclerView.LayoutManager layoutManager = ((RecyclerView)(binding.settingViewpager.getChildAt(0))).getLayoutManager();
  21. if(layoutManager != null) {
  22. layoutManager.setItemPrefetchEnabled(false);
  23. }
  24. /**
  25. * Set the number of offscreen views to retain before adding them to the potentially shared
  26. * {@link #getRecycledViewPool() recycled view pool}.
  27. *
  28. * <p>The offscreen view cache stays aware of changes in the attached adapter, allowing
  29. * a LayoutManager to reuse those views unmodified without needing to return to the adapter
  30. * to rebind them.</p>
  31. *
  32. * @param size Number of views to cache offscreen before returning them to the general
  33. * recycled view pool
  34. */
  35. RecyclerView recyclerView= ((RecyclerView)(binding.settingViewpager.getChildAt(0)));
  36. if(recyclerView != null) {
  37. recyclerView.setItemViewCacheSize(0);
  38. }
展开查看全部

相关问题