片段过渡不如应有的平滑

Fragment transition is not smooth as much as it should be

我正在使用底部导航和片段在我的应用程序中显示数据,但在我开始在我的应用程序中加载数据后,片段过渡的动画开始卡住,应用程序的整体性能看起来很糟糕我不知道这是怎么发生的, 没有数据片段转换工作得很好。

这是我加载数据和调用片段的方式。

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;
}

任何人都可以解释是什么让转换看起来像有故障,它在转换过程中有点卡住。

Fragment transition is not smooth as much as it should be

首先是 Fragment 事务很顺利,但是您在 UI 线程中进行了一些长时间的操作,所以 UI 卡住了。而且你觉得那个片段UI不像我应该的那样流畅

  • 我认为你的列表有大量数据,你在 UI thread. Instead of this you can use paging 中填写一次以加载大数据。
  • listTeam = db.displayTeam();,其他可能,可能是您正在 UI 线程中从数据库中获取数据。如果你在 AsyncTask 中这样做。你会克服这个问题的。

或者您可以 post 延迟您的长操作,以便在片段打开后加载数据。 (不推荐)

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 中执行 UI 操作。

编辑

已将 this.getContext() 更改为仅 getContext()。因为这是指 Runnable