gpt4 book ai didi

android - RecyclerView.Adapter 使用 viewPager 在 Fragment 中返回空对象引用

转载 作者:行者123 更新时间:2023-11-29 23:18:21 25 4
gpt4 key购买 nike

我正在尝试使用 mvvm 架构创建具有查看寻呼机的页面。

所以我尝试做的是使用可观察方法在第一个选项卡的 fragment 内显示 Recycler View 。

但是当我尝试设置内容是我的 fragment 中的适配器时,我得到了

java.lang.NullPointerException: Attempt to invoke virtual method 'void com.xxxx.view.adapter.FoodListAdapter.setFoodList(java.util.List)' on a null object reference 

我的 FragmentStatePagerAdapter 适配器

@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
Log.d("Food Pager", "get Item");
FoodListFragment foodListFragment = new FoodListFragment();
return foodListFragment;
case 1:
RestaurantListFragment restaurantListFragment2 = new RestaurantListFragment();
return restaurantListFragment2;
case 2:
RestaurantListFragment restaurantListFragment3 = new RestaurantListFragment();
return restaurantListFragment3;
default:
return null;
}
}

我的 Activity

private void observeViewModel(final CategoryViewModel categoryViewModel) {
// Observe Category Data
categoryViewModel.getCategory().observe(this, new Observer<Category>() {
@Override
public void onChanged(@Nullable Category category) {
// Update UI
if (category != null) {
if (category.foods != null) {
startFoodListFragment(category.foods);
}
} else {
Log.e(TAG, "Category Data is Null");
}
}
});
}

private void startFoodListFragment(List<CategoryQuery.Food> foodList) {
Log.d("startFoodListFragment", "yolo");
FoodListFragment foodListFragment = new FoodListFragment();
foodListFragment.setFoodList(foodList);
}

所以在我的 fragment 中

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

Log.d("Food LIst", "On create VIew");
View rootView = inflater.inflate(R.layout.fragment_food_list, container, false);

mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerview_food_list);
// mLoadingIndicator = (ProgressBar) rootView.findViewById(R.id.food_list_loading_indicator);

Integer gridColumns = 2;

Float width = getScreenSize().get("width");

if (width > 600) {
gridColumns = 3;
}

// Create Pinterest Style RecyclerView
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(gridColumns, StaggeredGridLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(layoutManager);

// Cool. it's Very easy ,but margin on my LinearLayout didn’t seem to work. So here’s a quick fix.
SpacesItemDecoration decoration = new SpacesItemDecoration(8);
mRecyclerView.addItemDecoration(decoration);

mFoodListAdapter = new FoodListAdapter(foodListAdapterOnClickHandler);
mRecyclerView.setAdapter(mFoodListAdapter);

return rootView;
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (mFoodList != null) {
mFoodListAdapter.setFoodList(mFoodList);
}
}

public void setFoodList(List<CategoryQuery.Food> foodList) {
Log.d(TAG, "setFoodlist");
if (foodList != null) {
mFoodList = foodList;
mFoodListAdapter.setFoodList(mFoodList);
// mFoodListAdapter.notifyDataSetChanged();
}
}

这是我的适配器的一部分

public void setFoodList(final List<? extends CategoryQuery.Food> foodList) {
if (this.foodList == null) {
this.foodList = foodList;
notifyItemRangeInserted(0, foodList.size());
}
}

这是我得到的相关Log

D/Food Pager: get Item
D/Food LIst: On create VIew
D/startFoodListFragment: yolo
D/Food List Fragment: setFoodlist
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main

然后报错

java.lang.NullPointerException: Attempt to invoke virtual method 'void com.xxx.view.adapter.FoodListAdapter.setFoodList(java.util.List)' on a null object reference

所以有人知道为什么我在 onCreateView 中初始化之后调用 FoodListAdapter 时得到 null 吗?

感谢您的帮助!

最佳答案

日志告诉我们什么?

D/Food Pager: get Item

FragmentStatePagerAdapter.getItem(int position) 被调用以显示 FoodListFragment。这通常意味着 Fragment 将被添加到屏幕上,因此接下来应该调用它的 onCreateView()。实际情况是这样的:

D/Food LIst: On create VIew

另一方面,我们有一个Observer 来监听数据变化。每次触发时,都会调用 startFoodListFragment():

D/startFoodListFragment: yolo

在此方法中,FoodListFragment 的新实例将被创建。您尝试通过调用 setFoodList()

将新数据传递给它

D/Food List Fragment: setFoodlist

但是由于这个新实例不会被附加到屏幕上,所以它的 onCreateView() 还没有被调用。所以它的适配器还没有被实例化。这就是应用程序崩溃的原因:

D/AndroidRuntime: Shutting down VM E/AndroidRuntime: FATAL EXCEPTION: main

你能做什么?

您应该将数据传递到 FoodListFragment 的正确实例中。或者简单地在 FoodListFragment 中注册 ObserverFragment 就像 Activity 一样是生命周期所有者,因此我认为这种方法最适合您。

关于android - RecyclerView.Adapter 使用 viewPager 在 Fragment 中返回空对象引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54873096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com