Android 从第三个片段导航时未加载第一个片段视图
在这里,当我登陆到第一个片段时,所有视图都被加载并滚动,但当我来自第三个片段,即来自其他一些活动时,我需要登陆到第三个片段,当导航到第一个片段时,视图没有加载,这使得不可滚动。 Firstfragment xml包含recyclerview和Group元素 我的活动类别:Android 从第三个片段导航时未加载第一个片段视图,android,android-fragments,android-viewpager,fragmentpageradapter,Android,Android Fragments,Android Viewpager,Fragmentpageradapter,在这里,当我登陆到第一个片段时,所有视图都被加载并滚动,但当我来自第三个片段,即来自其他一些活动时,我需要登陆到第三个片段,当导航到第一个片段时,视图没有加载,这使得不可滚动。 Firstfragment xml包含recyclerview和Group元素 我的活动类别: MyAdapter adapter = new MyAdapter(this, getSupportFragmentManager(), fragments); viewPager.setOffscr
MyAdapter adapter = new MyAdapter(this, getSupportFragmentManager(), fragments);
viewPager.setOffscreenPageLimit(3);
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
//MyAdapter
public class MyAdapter extends FragmentPagerAdapter {
private Context mContext;
private List<Fragment> fragmentList ;
public MyAdapter(Context context, FragmentManager fm,List<Fragment> fragmentList) {
super(fm);
mContext = context;
this.fragmentList = fragmentList;
}
@Override
public Fragment getItem(int position) {
return fragmentList.get(position);
}
@Override
public int getCount() {
return 3;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return mContext.getString(R.string.firstfragmentname);
case 1:
return mContext.getString(R.string.seconsfrag);
case 2:
return mContext.getString(R.string.thirdfrag);
default:
return null;
}
}
}
//XML has custom viewpager
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="@dimen/headerHeight"
android:layout_marginBottom="@dimen/footerHeight"
android:fadingEdgeLength="0dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_30_60"
android:layout_marginTop="10dp"
android:layout_marginEnd="@dimen/dp_30_60"
android:orientation="vertical">
<TextView
android:id="@+id/sp_header"
style="@style/pageTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:text="@string/my_bill" />
<com.view.Tab
android:id="@+id/tab_custom"
android:layout_width="match_parent"
android:layout_height="@dimen/tab_height" />
<com.custom.CustomViewPager
android:id="@+id/sp_viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="@dimen/dp_10_53"
android:layout_marginTop="4dp"
android:layout_marginEnd="@dimen/dp_10_53"
android:layout_marginBottom="4dp" />
</LinearLayout>
</ScrollView>
//CustomViepager
public class CustomViepager extends ViewPager {
public CustomViepager(Context context) {
super(context);
initPageChangeListener();
}
public CustomViepager(Context context, AttributeSet attrs) {
super(context, attrs);
initPageChangeListener();
}
private void initPageChangeListener() {
addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
requestLayout();
}
});
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
View child = getChildAt(getCurrentItem());
if (child != null) {
child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
int h = child.getMeasuredHeight();
heightMeasureSpec = MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY);
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
public void setCurrentItem(int item) {
super.setCurrentItem(item, false);
}
@Override
public void setCurrentItem(int item, boolean smoothScroll) {
super.setCurrentItem(item, false);
}
}
MyAdapter adapter=newmyadapter(这个,getSupportFragmentManager(),fragments);
viewPager.setOffscreenPageLimit(3);
viewPager.setAdapter(适配器);
tabLayout.setupWithViewPager(viewPager);
//MyAdapter
公共类MyAdapter扩展了FragmentPagerAdapter{
私有上下文;
私有列表碎片列表;
公共MyAdapter(上下文上下文、FragmentManager fm、列表fragmentList){
超级(fm);
mContext=上下文;
this.fragmentList=碎片列表;
}
@凌驾
公共片段getItem(int位置){
返回碎片列表。获取(位置);
}
@凌驾
public int getCount(){
返回3;
}
@凌驾
公共字符序列getPageTitle(int位置){
开关(位置){
案例0:
返回mContext.getString(R.string.firstfragmentname);
案例1:
返回mContext.getString(R.string.seconfrag);
案例2:
返回mContext.getString(R.string.thirdfrag);
违约:
返回null;
}
}
}
//XML具有自定义的viewpager
//定制寻呼机
公共类CustomViepager扩展了ViewPager{
公共自定义寻呼机(上下文){
超级(上下文);
initPageChangeListener();
}
公共CustomViepager(上下文、属性集属性){
超级(上下文,attrs);
initPageChangeListener();
}
私有void initPageChangeListener(){
addOnPageChangeListener(新的ViewPager.SimpleOnPageChangeListener(){
@凌驾
已选择页面上的公共无效(内部位置){
requestLayout();
}
});
}
@凌驾
测量时的保护空隙(内部宽度测量等级、内部高度测量等级){
View child=getChildAt(getCurrentItem());
if(child!=null){
child.measure(widthmasurespec,MeasureSpec.makeMeasureSpec(0,MeasureSpec.unspected));
int h=child.getMeasuredHeight();
heightmeasspec=MeasureSpec.makeMeasureSpec(h,MeasureSpec.justice);
}
超级测量(宽度测量、高度测量);
}
@凌驾
公共无效setCurrentItem(int项){
super.setCurrentItem(item,false);
}
@凌驾
public void setCurrentItem(int项,布尔平滑滚动){
super.setCurrentItem(item,false);
}
}
使用一个简单的视图寻呼机,并尝试像这样使用它
定制页面雷达
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentStatePagerAdapter
class MyPagerAdapter(fm: FragmentManager, behaviour: Int) : FragmentStatePagerAdapter(fm, behaviour) {
private val mFragmentList = ArrayList<Fragment>()
override fun getItem(position: Int): Fragment {
return mFragmentList[position]
}
override fun getCount(): Int {
return mFragmentList.size
}
fun addFragment(fragment: Fragment) {
mFragmentList.add(fragment)
}
}
在onCreate中
mAdapter = MyPagerAdapter(getChildFragmentManager(), FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)
mAdapter?.addFragment(YOUR_FIRST_FRAGMENT)
mAdapter?.addFragment(YOUR_SECOND_FRAGMENT)
mAdapter?.addFragment(YOUR_THIRD_FRAGMENT)
sp_viewpager.offscreenPageLimit = 3
sp_viewPAger.adapter = mAdapter
当你想降落到所需的位置时,在上面的代码编写之后
sp_viewpager.setCurrentItem(1/2/3,true/false)
对这个问题的回答是完美的
我只想强调一点,主要的技巧或真正的问题在于屏幕外页面限制
是寻呼机在当前片段左侧或右侧创建的片段数,默认情况下该值为1
这就是为什么当我们滚动到第三个片段时,它不会加载任何内容,因为加载第三个片段将需要同时在左侧加载2个片段,通过更改屏幕外页面限制
值,我们可以确定在这种情况下在特定时间加载的片段数量,即2个
如果我们这样做了,那么我们还必须覆盖PagerAdapter的默认函数
destroyItem()
在没有super
的情况下使用空函数,这样就不会同时销毁和创建太多碎片,从而导致滑动不平稳或碎片为空。使用FragmentStatePagerAdapter而不是FragmentStateAdapter您需要自定义视图吗pager@LakhwinderSingh如果我不将CustomViewpager用于在测量覆盖,然后无法看到布局,它是完全空白的屏幕。你认为会发生什么,如果你不使用自定义视图寻呼机,因为我不明白的使用onMesuare,你能指定吗
sp_viewpager.setCurrentItem(1/2/3,true/false)