Фрагмент перехода не так гладок, как должно быть - PullRequest
0 голосов
/ 13 мая 2018

Я использую нижнюю навигацию и фрагменты для отображения данных в моем приложении, но после того, как я начал загружать данные в мое приложение, анимация перехода фрагментов начала зависать, и общая производительность приложения выглядит ужасно, я не знаю, как это произошло, безпереход фрагментов данных работает просто отлично.

вот как я загружаю данные и вызываю фрагменты.

MainActivity.java

private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
        = new BottomNavigationView.OnNavigationItemSelectedListener() {

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        android.app.FragmentManager manager = getFragmentManager();
        switch (item.getItemId()) {
            case R.id.navigation_schedule:
                Fragment scheduleFragment = new ScheduleFragment();
                    manager.beginTransaction().replace(R.id.main, scheduleFragment).commit();
                return true;
            case R.id.navigation_teams:
                Fragment teamFragment = new TeamFragment();
                manager.beginTransaction().replace(R.id.main, teamFragment).commit();
                return true;
            case R.id.navigation_champions:
                Fragment championsFragment = new PointTableFragment();
                manager.beginTransaction().replace(R.id.main, championsFragment).commit();
                return true;
            case R.id.navigation_live:
                Fragment liveFragment = new LiveFragment();
                manager.beginTransaction().replace(R.id.main, liveFragment).commit();
                return true;
            case R.id.navigation_records:
                Fragment recordsFragment = new RecordsFragment();
                manager.beginTransaction().replace(R.id.main, recordsFragment).commit();
                return true;
        }
        return false;
    }
};

Fragment.java

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState){
    View view = inflater.inflate(R.layout.fragment_team, null);
    lvTeam = (ListView)view.findViewById(R.id.lvTeam);

    DatabaseHandler db = new DatabaseHandler(this.getContext());
    listTeam = db.displayTeam();


    adapterTeam = new CustomAdapterTeam(this.getContext(),listTeam);
    lvTeam.setAdapter(adapterTeam);
    adapterTeam.notifyDataSetChanged();


    return view;
}

Кто-нибудь может объяснить, почему переходы выглядят как глюки, они как бы застревают во время перехода.

1 Ответ

0 голосов
/ 13 мая 2018

Переход фрагмента не настолько плавный, как должен быть

Во-первых, транзакция фрагмента гладкая, но вы выполняете длинную операцию в потоке пользовательского интерфейса, поэтому пользовательский интерфейс застревает. И вы чувствуете, что фрагмент UI не является гладким, как я должен быть.

  • Я думаю, что ваш список содержит большое количество данных, которые вы заполняете один раз в ветке пользовательского интерфейса . Вместо этого вы можете использовать paging для загрузки больших данных.
  • listTeam = db.displayTeam();, другое дело, может быть, вы извлекаете данные из базы данных в потоке пользовательского интерфейса. Если вы сделаете это в AsyncTask . Вы преодолеете эту проблему.

или вы можете отложить задержку вашей длинной операции, чтобы загрузка данных после открытия фрагмента. ( Не рекомендуется )

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState){
    View view = inflater.inflate(R.layout.fragment_team, null);
    lvTeam = (ListView)view.findViewById(R.id.lvTeam);
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    DatabaseHandler db = new DatabaseHandler(getContext());
                    listTeam = db.displayTeam();
                    adapterTeam = new CustomAdapterTeam(getContext(),listTeam);
                    lvTeam.setAdapter(adapterTeam);
                    adapterTeam.notifyDataSetChanged();
                }
            });
        }
    },100);
    return view;
}
  • Обратите внимание, что вы не можете выполнять операции пользовательского интерфейса в worker thread.

Редактировать

Изменено this.getContext() только на getContext(). Потому что это относится к Runnable

...