【发布时间】:2020-04-16 15:23:37
【问题描述】:
我有 TabLayout 和 ViewPager。
所以我创建了扩展 FragmentPagerAdapter 的片段和适配器。
在适配器中,我试图在我的服务器上发送改造查询,获取数据并将其用于创建选项卡。
我尝试在所有覆盖方法中执行此操作,但没有得到结果 - 选项卡标题使用声明中的默认值创建。
在@Override public CharSequence getPageTitle(int position) 中执行会给我三个重复names 列表的项目,因为页数的默认值为3。
return tabTitles[position]; 和 PAGE_COUNT 在执行任何代码之前定义。
我应该如何/在哪里放置我的异步任务进行改造?
更新 17.04: 有什么想法吗?
我的片段:
public class Fragment_items extends Fragment {
private Context mContext;
private static final String ARG_PAGE = "ARG_PAGE";
private int mPage;
String TAG = "Fragment_items";
public Fragment_items(){
//empty constructor
}
public static Fragment_items newInstance(int page) {
Bundle args = new Bundle();
args.putInt(ARG_PAGE, page);
Fragment_items fragment = new Fragment_items();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mPage = getArguments().getInt(ARG_PAGE);
}
}
@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) {
//creating fragment
View rootView = inflater.inflate(R.layout.content_list, container, false);
RecyclerView RV = rootView.findViewById(R.id.recycler_view);
return rootView;
}
}
我的适配器:
public class Adapter_p extends FragmentPagerAdapter {
int PAGE_COUNT = 3;
private String tabTitles[] = new String[] { "Tab1", "Tab2", "Tab3" };
private Context mContext;
List<String> names;
String TAG = "TAG";
public Adapter_p(FragmentManager fm, Context context) {
super(fm);
mContext = context;
}
@Override public int getCount() {
return PAGE_COUNT;
}
@Override public Fragment getItem(int position) {
return Fragment_items.newInstance(position + 1);
}
@Override public CharSequence getPageTitle(int position) {
Handler handler = new Handler();
handler.postDelayed(() -> {
new loadC().execute();
// new loadC().execute().get();
// loaderFromURL();
}, 2000); //2 seconds waiting
names = new ArrayList<>();
PAGE_COUNT = names.size();
notifyDataSetChanged();
Log.d(TAG, "just simple task");
return tabTitles[position];
}
private void loaderFromURL() {
String BASE_URL = AppPreferences.getAPIUrl(mContext);
InterfaceClass object;
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
object = retrofit.create(InterfaceClass.class);
Call<POJOAll> call = objectProstoTVAPI.getAllFromServer();
call.enqueue(new Callback<POJOAll>() {
@Override
public void onResponse(@NotNull Call<POJOAll> call, @NotNull Response<POJOAll> response) {
if (response.code() == 200 && response.body()!=null) {
// getting "names" - everything is ok with response from server
tabTitles = names.toArray(tabTitles);
notifyDataSetChanged();
}
}
@Override
public void onFailure(@NotNull Call <POJOAll> call, @NotNull Throwable t) {
Log.d(TAG, "response.code(): " + t);
Toast.makeText(mContext, R.string.errorloaddata, Toast.LENGTH_LONG).show();
}
});
}
public class loadC extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute(){
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params){
loaderFromURL();
return null;
}
@Override
protected void onPostExecute(Void result){
super.onPostExecute(result);
}
}
}
然后在 Fragment 中设置 ViewPager:
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//creating fragment
View rootView = inflater.inflate(R.layout.app_bar_main, container, false);
Adapter_p adapter = new Adapter_p(getActivity().getSupportFragmentManager(), mContext);
ViewPager viewPager = rootView.findViewById(R.id.viewpager);
viewPager.setAdapter(adapter);
TabLayout tabLayout = rootView.findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
return rootView;
}
【问题讨论】:
-
getCount()始终返回 3。如果您想要不同数量的选项卡,则必须编写逻辑以返回不同的数字。 -
@Code-Apprentice 我已经写了这个逻辑 - 我有
names和names.size()- 这是一个新的标签计数,我应该在我的代码中应用这个逻辑吗?
标签: android android-fragments android-viewpager adapter