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