Сделайте дооснащение GET в FragmentPagerAdapter - PullRequest
1 голос
/ 16 апреля 2020

У меня есть 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;
}

1 Ответ

0 голосов
/ 17 апреля 2020

обратите внимание на детали ...

Я трачу на это 2 дня.

Решение простое, вам просто нужно создать метод обновления в адаптере и вызвать его из где вам нужно - активность, фрагмент et c.

...