У меня есть TabLayout и ViewPager.
Итак, я создал фрагмент и адаптер, который расширяет FragmentPagerAdapter.
В адаптере я пытаюсь отправить запрос на модификацию на моем сервере, получить данные и использовать это для создания вкладок.
Я пытался сделать это во всех методах переопределения, но не получил результата - заголовки вкладок создаются со значениями по умолчанию из объявления.
Выполнение в @Override public CharSequence getPageTitle(int position)
дает мне элементы TRIPLE, дублирующие список names
, потому что значение счетчика страниц по умолчанию равно 3.
return tabTitles[position];
и PAGE_COUNT
определяет перед выполнением любого кода.
Как / Где я должен разместить свою асинхронную работу с модификацией?
upd 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;
}