【问题标题】:Do retrofit GET in FragmentPagerAdapter在 FragmentPagerAdapter 中改造 GET
【发布时间】: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 我已经写了这个逻辑 - 我有 namesnames.size() - 这是一个新的标签计数,我应该在我的代码中应用这个逻辑吗?

标签: android android-fragments android-viewpager adapter


【解决方案1】:

注意细节……

我为此浪费了 2 天时间。

解决方案很简单,您只需在适配器中创建更新方法并从您需要的地方调用它 - 活动、片段等。

【讨论】:

    猜你喜欢
    • 2015-11-04
    • 2016-12-22
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 2020-01-07
    • 2016-06-16
    • 2020-06-21
    相关资源
    最近更新 更多