【问题标题】:viewpager2 get adapter of current fragment cause NullPointerExceptionviewpager2 获取当前片段的适配器导致 NullPointerException
【发布时间】:2022-01-12 07:27:46
【问题描述】:

我使用 mAdapter.getTotalPriceInRecyclerView() 在 vi​​ewpage2+Tablayout 中获取当前所选页面的总价。

但是会导致NullPointerException,因为mAdapter是在onCreateView方法中创建的。

如何确保 mAdapter 已初始化?

我使用 viewpage2 创建新的 Fragment (TheFragmentClass.newInstance()) 而不是 beginTransaction().commit

private boolean createFragment(int tabLimited) {
    if (mVp2Adapter.getItemCount() >= tabLimited) {
        return false;
    }
    String tabText = getTimeOfHMS();
    SettlementProductItemFragment fragment = SettlementProductItemFragment.newInstance(); // new intance
    mVp2Adapter.addFragment(tabText, fragment); // add to viewpage2's adapter
    mTabSettlementProduct.selectTab(mTabSettlementProduct.getTabAt(
            mVp2Adapter.getItemCount() - 1));
    return true;
}

public void addFragment(String title, Fragment fragment) {
    if (mFragmentTitles.contains(title)) {
        Log.e(TAG, "addFragment failed: mFragmentTitles.contains(" + title + ")");
        return;
    }
    mFragments.put(title, fragment);
    mFragmentTitles.add(title);
    updateHashMap();
    notifyItemInserted(mFragmentTitles.size() - 1);
}

这是我的 SettlementProductItemFragment 类。

public class SettlementProductItemFragment extends Fragment {

private RecyclerView mRvProductInFragment;

public SettlementProductItemFragment() {
}


public static SettlementProductItemFragment newInstance() {
    SettlementProductItemFragment fragment = new SettlementProductItemFragment();
    Bundle args = new Bundle();
    fragment.setArguments(args);
    return fragment;
}

private SettlementProductItemRecyclerViewAdapter mAdapter;

public double getTotalPriceInFragment() {
    if (mAdapter == null) {
        throw new NullPointerException("mAdapter(SettlementProductItemRecyclerViewAdapter) CAN NOT BE NULL");
    }
    return mAdapter.getTotalPriceInRecyclerView();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_settlement_product_item_list, container, false);
    Log.e("getTotalPriceInFragment", "onCreateView: " + view.getClass().toString());
    // Set the adapter
    if (view instanceof RecyclerView) {
        Context context = view.getContext();
        mAdapter = new SettlementProductItemRecyclerViewAdapter(context, getProducts());
        mRvProductInFragment = (RecyclerView) view;
        mRvProductInFragment.setLayoutManager(new LinearLayoutManager(context));
        mRvProductInFragment.setAdapter(mAdapter);
    }
    return view;
}

}

【问题讨论】:

    标签: android android-fragments android-viewpager android-tablayout android-viewpager2


    【解决方案1】:

    由于您使用 ViewPager2,因此您有 setOffscreenPageLimit 方法(Kotlin 中的 offscreenPageLimit 属性),它会在您初始化 ViewPager2 时保留(并且还预创建)您的片段。

    我在您的代码中看到的问题是您修改了 ViewPager 适配器中的项目。使用 viewPager2 + tabs 不是默认的 sn-p,所以请确保你做得好,检查ViewPager2 samples by Google

    或者,您可以在 SettlementProductItemFragment 中创建属性,例如 isInitialized 并在您的主机片段中观察它。这样我想你必须使用架构组件,比如ViewModel + Livedata

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-15
      • 2017-09-10
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多