当前位置: 首页 > 知识库问答 >
问题:

带有RecycleView+CardView的片段(致命异常)

解晟睿
2023-03-14

我是编程新手,我很难尝试设置这个recycleview。请帮帮我!如果你可以的话。我相信主要的问题出在主要的activity上。

错误原因:java.lang.NullPointerException:尝试对com.example.application.fragments.home.HomeFragment.onCreate(HomeFragment.java:32)上的空对象引用调用虚拟方法“void androidx.recyclerview.widget.recyclerview.setLayoutManager(androidx.recyclerview.widget.recyclerview$LayoutManager)”

这是主要活动

    private BottomNavigationView bottomNavigationView;
    private RecyclerView recyclerView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        bottomNavigationView = findViewById(R.id.bottonNavigationView);

        loadFragment(new HomeFragment());
        setBottomNavigationView();

    }

    private void loadFragment(Fragment fragment) {
        // create a FragmentManager
        FragmentManager fragmentManager = getSupportFragmentManager();
        // create a FragmentTransaction to begin the transaction and replace the Fragment
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        // replace the FrameLayout with new Fragment
        fragmentTransaction.replace(R.id.idMainFrameLayout, fragment);
        fragmentTransaction.commit(); // save the changes
        //crédits abhiandroid
    }

    @SuppressLint("NonConstantResourceId")
    public void setBottomNavigationView() {
        bottomNavigationView.setOnNavigationItemSelectedListener(item -> {

            switch (item.getItemId()) {
                case R.id.btnSearch:
                    loadFragment(new SearchFragment());
                    break;
                case R.id.btnFeed:
                    loadFragment(new FeedFragment());
                    break;
                case R.id.btnShedule:
                    loadFragment(new SheduleFragment());
                    break;
                case R.id.btnProfile:
                    loadFragment(new ProfileFragment());
                    break;
                default:
                    loadFragment(new HomeFragment());
            }
            return true;
        });
    }
}```

AND THE FRAGMENT

```class HomeFragment extends Fragment {

    private RecyclerView recyclerView = getView().findViewById(R.id.recycleViewHome);

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        MyAdapter myAdapter = new MyAdapter(getContext(), getMyList());
        recyclerView.setAdapter(myAdapter);
    }

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

        View view = inflater.inflate(R.layout.fragment_home, container, false);
        RecyclerView recyclerView = getView().findViewById(R.id.recycleViewHome);
        return view;
    }

    private ArrayList<Store> getMyList() {

        Drawable drawable = getResources().getDrawable(R.drawable.ic_google_svg, null);
        ImageView imageView = null;

        TextView mTitle = null, mSubTitle = null;

        imageView.setImageDrawable(drawable);
        mTitle.setText("GOOGLE");
        mSubTitle.setText("Description");

        ArrayList<Store> storeArrayList = new ArrayList<>();

        Store store = new Store();
        store.setPhotoId(imageView);
        store.setmTitle(mTitle);
        store.setSubTitle(mSubTitle);
        storeArrayList.add(store);

        Store store1 = new Store();
        store.setPhotoId(imageView);
        store.setmTitle(mTitle);
        store.setSubTitle(mSubTitle);
        storeArrayList.add(store);

        Store store2 = new Store();
        store.setPhotoId(imageView);
        store.setmTitle(mTitle);
        store.setSubTitle(mSubTitle);
        storeArrayList.add(store);

        Store store3 = new Store();
        store.setPhotoId(imageView);
        store.setmTitle(mTitle);
        store.setSubTitle(mSubTitle);
        storeArrayList.add(store);

        Store store4 = new Store();
        store.setPhotoId(imageView);
        store.setmTitle(mSubTitle);
        store.setSubTitle(mSubTitle);
        storeArrayList.add(store);

        Store store5 = new Store();
        store.setPhotoId(imageView);
        store.setmTitle(mTitle);
        store.setSubTitle(mSubTitle);
        storeArrayList.add(store);

        Store store6 = new Store();
        store.setPhotoId(imageView);
        store.setmTitle(mTitle);
        store.setSubTitle(mSubTitle);
        storeArrayList.add(store);

        Store store7 = new Store();
        store.setPhotoId(imageView);
        store.setmTitle(mTitle);
        store.setSubTitle(mSubTitle);
        storeArrayList.add(store);

        Store store8 = new Store();
        store.setPhotoId(imageView);
        store.setmTitle(mTitle);
        store.setSubTitle(mSubTitle);
        storeArrayList.add(store);

        return storeArrayList;
    }
}```

<<<<<<<<RECYCLEVIEW>>>>>>>>>>>

```class MyHolder extends RecyclerView.ViewHolder {

    private ImageView mImageView;
    private TextView mTitle, mSubTitle;

    public MyHolder(@NonNull View itemView) {
        super(itemView);
        this.mImageView = itemView.findViewById(R.id.btnImageStore);
        this.mTitle = itemView.findViewById(R.id.txtTitleStore);
        this.mSubTitle = itemView.findViewById(R.id.txtsubTitle);
    }

    public ImageView getmImageView() {
        return mImageView;
    }

    public void setmImageView(ImageView mImageView) {
        this.mImageView = mImageView;
    }

    public TextView getmTitle() {
        return mTitle;
    }

    public void setmTitle(TextView mTitle) {
        this.mTitle = mTitle;
    }

    public TextView getmSubTitle() {
        return mSubTitle;
    }

    public void setmSubTitle(TextView mSubTitle) {
        this.mSubTitle = mSubTitle;
    }
}```

```class MyAdapter extends RecyclerView.Adapter<MyHolder> {

    private Context context;
    ArrayList<Store> storeArrayList;

    public MyAdapter(Context context, ArrayList<Store> storeArrayList) {
        this.context = context;
        this.storeArrayList = storeArrayList;
    }

    @NonNull
    @Override
    public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_layout_stores, null, false);
        return new MyHolder(view);

    }

    @Override
    public void onBindViewHolder(@NonNull MyHolder myholder, int position) {

        myholder.setmImageView(storeArrayList.get(position).getPhotoId());
        myholder.setmTitle(storeArrayList.get(position).getmTitle());
        myholder.setmSubTitle(storeArrayList.get(position).getSubTitle());
    }

    @Override
    public int getItemCount() {
        return storeArrayList.size();
    }
}```

共有1个答案

温浩大
2023-03-14

出现此错误是因为onCreateView()方法是在onCreateView()方法之前调用的,因此您尝试在初始化RecyclerView之前设置适配器和LayoutManager,因此需要在onCreateView()方法中添加适配器和LayoutManager。请在此处检查片段生命周期:https://developer.android.com/guide/fragments/lifecycle#states

此外,您还创建了两个RecyclerView实例,一个在片段上,另一个在onCreateView()中,因此您需要将所有代码从onCreateView()移动到片段中的onCreateView()

 类似资料:
  • 顶部碎片 activity_main.xml

  • 如何在CardView中打开onClick中的片段?我在Cardview中有一个列表,当我单击时希望在另一个片段中显示。这是adapter.class 这是layout.xml 我解决了onClick的问题,现在我的问题是我不能打开另一个片段。如何在myActive中调用我的方法?

  • 我有一个,它显示了一个包含的。我正在使用从SQL加载数据,所有数据都显示得很好。 我想知道的是,我的工具栏中有一个搜索图标在中膨胀,当用户单击它并输入数据时,它应该在中的中进行筛选。 我已经在中实现了,还实现了和方法。我只是不知道如何直接使用中的搜索来过滤中的。

  • 现在,我想使用Parse添加服务器拉请求,将列表中的数据添加到适配器,并在用户查看页面后填充recyclerview,这样 1)我是否应该添加setUserVisisbleHint中的所有代码,并只添加0.5秒延迟,以便在调用setContentView后执行它,以确保不出现空指针异常错误或 2)是否有更好的方法/其他功能可以实现相同的功能?

  • 根据谷歌的文档: 现在可以在片段中嵌入片段。这对于各种情况都很有用,在这些情况下,您需要将动态和可重用的UI组件放置到本身是动态和可重用的UI组件中。例如,如果使用ViewPager创建左右滑动并占用大部分屏幕空间的片段,现在可以将片段插入每个片段页面。要嵌套片段,只需对要添加片段的片段调用getChildFragmentManager()。这将返回一个FragmentManager,您可以像通常

  • 我有一个片段,其中我已经在屏幕顶部实现了一个包含cardview的recyclerview,现在我想创建另一个recyclerview,它还将cardview添加到同一片段中的屏幕底部。 我是android studio的新手,所以知道在哪里放置什么对我来说是个问题。 这是片段代码 现在如何添加另一个回收器视图? 这是布局图