Android 仅更新当前的viewpager片段
我有200多个标签页的ViewPager。每个选项卡都包括recyclerview,可通过2动态加载数据。每次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
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版本。使用我的代码编辑帖子