Android 仅更新当前的viewpager片段

Android 仅更新当前的viewpager片段,android,android-fragments,android-recyclerview,android-viewpager,android-adapter,Android,Android Fragments,Android Recyclerview,Android Viewpager,Android Adapter,我有200多个标签页的ViewPager。每个选项卡都包括recyclerview,可通过2动态加载数据。每次onTabSelected()操作后都会加载数据 但是由于viewpager加载position-1(如果有)、position、position+1(如果有)我得到了2-3个具有相同数据的选项卡 问题是-如何仅加载一个当前选择的片段而不加载相邻位置? 我认为我的FragmentPagerAdapter中的BEHAVIOR\u RESUME\u ONLY\u CURRENT\u FRAG

我有200多个标签页的ViewPager。每个选项卡都包括recyclerview,可通过2动态加载数据。每次
onTabSelected()
操作后都会加载数据

但是由于viewpager加载
position-1(如果有)、position、position+1(如果有)
我得到了2-3个具有相同数据的选项卡

问题是-如何仅加载一个当前选择的片段而不加载相邻位置?

我认为我的
FragmentPagerAdapter
中的
BEHAVIOR\u RESUME\u ONLY\u CURRENT\u FRAGMENT
将通过将其传递给构造函数来解决我的问题:

public Adapter_programmes(FragmentManager fm, Context context) {
    super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
    mContext = context;
    fragment_some = new Fragment_Some();
}
但一切都没有改变

UPD: 我想我在这里找到了解决办法:

但我不明白: 用占位符图像加载网格,在页面更改之前不要加载真实图像

**UPD2:* setOffscreenPageLimit(1)无法解决我的问题

我的代码:

public static Fragment_some newInstance(int page) {
    Bundle args = new Bundle();
    args.putInt(ARG_PAGE, page);
    Fragment_some fragment = new Fragment_some();
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mPage = getArguments().getInt(ARG_PAGE);
    }
    arrayNames.clear();
    arrayTimes.clear();
}

@Override
public void onAttach(@NonNull Context context) {
    super.onAttach(context);
    mContext=context;
}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    Log.d(TAG, "");
    //creating fragment
    rootView = inflater.inflate(R.layout.content_list, container, false);

    loadProgrammes(CID); //doing retrofit query for data, using argument which I've got from onTabSelected by SharedPreferences
    //data loaded succecfully
    Handler handler = new Handler();
    handler.postDelayed(() -> {
    adapterItem = new Adapter_programme_item(mContext, arrayTimes, arrayNames);
    RecyclerView RV = rootView.findViewById(R.id.recycler_view);
    LinearLayoutManager layoutManager = new LinearLayoutManager(mContext);
    RV.setLayoutManager(layoutManager);
    RV.setAdapter(adapterItem);
            }, 3000);   //3 seconds waiting

    return rootView;
}
片段:

public static Fragment_some newInstance(int page) {
    Bundle args = new Bundle();
    args.putInt(ARG_PAGE, page);
    Fragment_some fragment = new Fragment_some();
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mPage = getArguments().getInt(ARG_PAGE);
    }
    arrayNames.clear();
    arrayTimes.clear();
}

@Override
public void onAttach(@NonNull Context context) {
    super.onAttach(context);
    mContext=context;
}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    Log.d(TAG, "");
    //creating fragment
    rootView = inflater.inflate(R.layout.content_list, container, false);

    loadProgrammes(CID); //doing retrofit query for data, using argument which I've got from onTabSelected by SharedPreferences
    //data loaded succecfully
    Handler handler = new Handler();
    handler.postDelayed(() -> {
    adapterItem = new Adapter_programme_item(mContext, arrayTimes, arrayNames);
    RecyclerView RV = rootView.findViewById(R.id.recycler_view);
    LinearLayoutManager layoutManager = new LinearLayoutManager(mContext);
    RV.setLayoutManager(layoutManager);
    RV.setAdapter(adapterItem);
            }, 3000);   //3 seconds waiting

    return rootView;
}
碎片页雷达:

    public Adapter_programmes(FragmentManager fm, Context context) {
    super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
    mContext = context;
    fragment_some = new Fragment_some();
}

@Override public int getCount() {
    return PAGE_COUNT;

}

@Override public Fragment getItem(int position) {


    return fragment_some.newInstance(position + 1);
}

@Override public CharSequence getPageTitle(int position) {
    return tabTitles[position];
}

public void updateTitleData(String[] titles) {
    ...
    notifyDataSetChanged();
}
主要活动:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    adapter = new Adapter_programmes(getSupportFragmentManager(), MainActivity.this);

    ViewPager viewPager = findViewById(R.id.viewpager);
    viewPager.setAdapter(adapter);

    TabLayout tabLayout = findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);

    loaderFromURL(); //getting tab titles via retrofit

    tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            Log.d(TAG, "onTabSelected");

            String mCID = listm3u.get(tab.getPosition()).getItemCID();
            AppPreferences.setCurrentCID(MainActivity.this, mCID);

            String iconURL = listm3u.get(tab.getPosition()).getItemIcon();
            ImageView IVChanelLogo = findViewById(R.id.IVChanelLogo);
            Picasso.with(MainActivity.this).load(iconURL).into(IVChanelLogo);

        }
    });
}

由于您正在片段的
onCreateView
中填充recyclerview,因此更改为
行为\u恢复\u仅\u当前\u片段
不会产生任何影响

BEHAVIOR\u RESUME\u ONLY\u CURRENT\u FRAGMENT
不将当前片段+/-OffscreenPageLimit(默认为1)置于“恢复”状态,而是在片段生命周期中仅将当前片段置于“恢复”状态,将任何其他片段置于“启动”状态

由于“Started”已过创建视图时
onCreateView
您的recyclerviews填充得太早

解决方案是在片段的
onCreateView
中创建没有数据的recyclerview适配器,找到recyclerview,设置其布局管理器和适配器,等等

然后在片段的
onResume
方法中,获取recyclerView的数据,并使用此新数据更新recyclerView适配器,然后通知recyclerView其数据已更改

然后,您可以删除
内容

没有足够的示例代码来给出一个工作示例,但下面是一个示例片段,显示了当“恢复”时,
textview2
的更新时间与
textview1
的更新时间,而
textview1
是在其进入“启动”状态时设置的(您可以使用
BEHAVIOR\u RESUME\u ONLY\u CURRENT\u Fragment
set在Viewpager中创建此片段的3个副本)

package com.test.viewpager;
导入android.content.Context;
导入android.os.Bundle;
导入androidx.annotation.NonNull;
导入androidx.annotation.Nullable;
导入androidx.fragment.app.fragment;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.TextView;
导入java.text.DateFormat;
导入java.text.simpleDataFormat;
导入java.util.Calendar;
导入java.util.Locale;
公共类TextFragment扩展了片段{
//片段初始化参数,例如ARG_ITEM_NUMBER
私有静态最终字符串ARG_PARAM1=“PARAM1”;
私人国际机场1号;
私人视野;
公共文本片段(){
//必需的空公共构造函数
}
公共静态TextFragment newInstance(int参数1){
TextFragment=新的TextFragment();
Bundle args=新Bundle();
args.putInt(ARG_PARAM1,PARAM1);
fragment.setArguments(args);
Log.d(“Frag”、“newInstance”);
返回片段;
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
如果(getArguments()!=null){
mParam1=getArguments().getInt(ARG_PARAM1);
}
Log.d(“Frag”、“onCreate”);
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
Log.d(“Frag”,“onCreateView:+mParam1”);
视图=充气机。充气(R.layout.fragment_文本,容器,false);
返回视图;
}
@凌驾
已创建公用void onview(@NonNull视图,@Nullable Bundle savedInstanceState){
Log.d(“Frag”、“onViewCreated:+mParam1”);
Bundle args=getArguments();
TextView textView1=view.findViewById(R.id.textView1);
DateFormat df=新的简化格式(“yyyy-MM-dd'T'HH-MM-ss.sss”,Locale.US);
字符串dt=df.format(Calendar.getInstance().getTime());
textView1.setText(dt);
}
public void updateView(){
Log.d(“Frag”、“updateView”);
TextView textView2=view.findViewById(R.id.textView2);
DateFormat df=新的简化格式(“yyyy-MM-dd'T'HH-MM-ss.sss”,Locale.US);
字符串dt=df.format(Calendar.getInstance().getTime());
textView2.setText(dt);
}
@凌驾
公共void-onAttach(上下文){
super.onAttach(上下文);
日志d(“Frag”,“onAttach:+mParam1”);
}
@凌驾
公共无效连接(){
super.onDetach();
日志d(“Frag”,“onDetach:+mParam1”);
}
@凌驾
恢复时公开作废(){
super.onResume();
日志d(“Frag”、“onResume:+mParam1”);
updateView();
}
@凌驾
公共无效暂停(){
super.onPause();
Log.d(“Frag”,“onPause:+mParam1”);
}
}

显示更多代码,举例说明每个片段如何加载其数据,因为仅更改该标志可能不会为您提供更改片段代码所需的行为。还要指定您使用的Viewpager版本。使用我的代码编辑帖子