简体   繁体   English

在片段中的recyclerView上使用findViewById时获取NullPointerException

[英]Getting NullPointerException when using findViewById on a recyclerView in a Fragment

Trying to build an app with 5 fragments. 尝试用5个片段构建一个应用程序。 The first one contains the recyclerView, whenever I switch tabs the Views get discarded and every time I come back when the inflator is inflating the view, at the same time the app tries to get the id of the recyclerView which returns a null pointer exception. 第一个包含recyclerView,每当我切换选项卡时,视图都会被丢弃,并且每次当充气机对视图充气时,我都会回来,同时应用程序尝试获取recyclerView的ID,该ID返回空指针异常。 And this problem is only getting more complicated, I don't think in using the correct way to do this as I am getting errors will context as well. 而且这个问题只会变得越来越复杂,我不认为使用正确的方法来执行此操作,因为我也会遇到错误。

If you have any simple examples of apps with fragments having recyclerViews please drop the link below, thank you in advance 如果您有片段带有recyclerViews的应用程序的任何简单示例,请删除以下链接,在此先感谢您

MainActivity.java MainActivity.java

class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";

private FragmentHome fragmentHome = new FragmentHome(this);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    fragmentHome.initGetData();
    BottomNavigationView bottomNavigationView = findViewById(R.id.bottomNavBar);
    getSupportFragmentManager().beginTransaction().replace(R.id.container, fragmentHome).commit();
    fragmentHome.initRecyclerView();
    bottomNavigationView.setOnNavigationItemSelectedListener(navListener);
    bottomNavigationView.setOnNavigationItemReselectedListener(new BottomNavigationView.OnNavigationItemReselectedListener() {
        @Override
        public void onNavigationItemReselected(@NonNull MenuItem menuItem) {

        }
    });

}

private BottomNavigationView.OnNavigationItemSelectedListener navListener = new BottomNavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {

        switch (menuItem.getItemId()) {
            case R.id.home: {
                getSupportFragmentManager().beginTransaction().replace(R.id.container, fragmentHome).commit();
                fragmentHome.initRecyclerView();
                break;
            }
        }
        return true;
    }
};
}

FragmentHome.java FragmentHome.java

public class FragmentHome extends Fragment {

private String BASE_URL = "https://www.reddit.com";

// INIT RETROFIT AND CALL ONCE AND FOR ALL
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .build();

RedditAPI redditAPI = retrofit.create(RedditAPI.class);


private static final String TAG = "FragmentHome";
private RecyclerView feedRecyclerView;
private List<ChildrenData> childrenData;
private String after;
private String previousAfter = "";
private Boolean isScrolling = false;
private int currentItems;
private int totalItems;
private int scrolledOutItems;
private Context context;
private View inflatingView;


public FragmentHome() {
}

public FragmentHome(Context context) {
    this.context = context; //I also get some attribute warning 
                               here not important right now though.
}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    inflatingView =  inflater.inflate(R.layout.fragment_home, container, false);
    initRecyclerView();
    return inflatingView;
}


public void initGetData() {
    Call<FeedData> feedDataCall = redditAPI.getFeed();
    feedDataCall.enqueue(new Callback<FeedData>() {
        @Override
        public void onResponse(Call<FeedData> call, final Response<FeedData> response) {
         /*   Log.d(TAG, "onResponse: " + response.body().getData().getChildren().get(0).getDataModel().getTitle());
            Log.d(TAG, "onResponse: " + response.body().getData().getChildren());*/
            childrenData = response.body().getData().getChildren();
            Log.d(TAG, "onResponse:  " + childrenData);
            after = response.body().getData().getAfter();
            Log.d(TAG, "onResponse: " + after);
        }

        @Override
        public void onFailure(Call<FeedData> call, Throwable t) {
            Log.d(TAG, "onFailure: " + t.getMessage());
        }
    });
}

public void initRecyclerView() {

    feedRecyclerView = inflatingView.findViewById(R.id.recyclerView);

    final FeedRecyclerViewAdapter feedRecyclerViewAdapter = new FeedRecyclerViewAdapter(childrenData, context);
    feedRecyclerView.setAdapter(feedRecyclerViewAdapter);
    final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context);
    feedRecyclerView.setLayoutManager(linearLayoutManager);

    feedRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
            isScrolling = true;
        }

        @Override
        public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            currentItems = linearLayoutManager.getChildCount();
            totalItems = linearLayoutManager.getItemCount();
            scrolledOutItems = linearLayoutManager.findFirstVisibleItemPosition();

            if (isScrolling && (totalItems - 1 == currentItems + scrolledOutItems) && (!previousAfter.equals(after))) {
                isScrolling = false;
                fetchNewData(after, feedRecyclerViewAdapter);
            }
        }
    });

    }


public void fetchNewData(final String after_use, final FeedRecyclerViewAdapter feedRecyclerViewAdapter) {
    Call<FeedData> feedDataCall_withAfter = redditAPI.getFeed_withAfter(after_use);
    previousAfter = after_use;
    feedDataCall_withAfter.clone().enqueue(new Callback<FeedData>() {
        @Override
        public void onResponse(Call<FeedData> call, Response<FeedData> response) {
            Log.d(TAG, "onResponse: " + response.body().toString());
            childrenData.addAll(response.body().getData().getChildren());
            after = response.body().getData().getAfter();
            feedRecyclerViewAdapter.notifyDataSetChanged();
        }

        @Override
        public void onFailure(Call<FeedData> call, Throwable t) {

        }
    });

    Log.d(TAG, "fetchNewData: " + childrenData.size());
}
}

Error I am getting I am getting the following error: 错误,我得到以下错误:

2019-04-15 13:00:28.449 18359-18359/com.example.recyclerview2 E/AndroidRuntime: FATAL EXCEPTION: main 2019-04-15 13:00:28.449 18359-18359 / com.example.recyclerview2 E / Android运行时:致命异常:主要

Process: com.example.recyclerview2, PID: 18359 流程:com.example.recyclerview2,PID:18359

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.recyclerview2/com.example.recyclerview2.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method android.view.View android.view.View.findViewById(int) on a null object reference java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.recyclerview2 / com.example.recyclerview2.MainActivity}:java.lang.NullPointerException:尝试调用虚拟方法android.view.View android.view.View.findViewById空对象引用上的(int)

StackTrace 2019-04-15 13:57:00.234 5508-5508/com.example.recyclerview2 E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.recyclerview2, PID: 5508 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.recyclerview2/com.example.recyclerview2.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) at android.os.Handler.dispatchMessage(Handler.java:106) StackTrace 2019-04-15 13:57:00.234 5508-5508 / com.example.recyclerview2 E / AndroidRuntime:致命例外:主进程:com.example.recyclerview2,PID:5508 java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.recyclerview2 / com.example.recyclerview2.MainActivity}:java.lang.NullPointerException:尝试在null对象引用上调用虚拟方法“ android.view.View android.view.View.findViewById(int)” android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)在android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)在android.app android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68:android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1808)上的.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)在android。 os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6669) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference at com.example.recyclerview2.Fragments.FragmentHome.initRecyclerView(FragmentHome.java:92) at com.example.recyclerview2.MainActivity.onCreate(MainActivity.java:44) at android.app.Activity.performCreate(Activity.java:7136) at android.app.Activity.performCreate(Activity.java:7127) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048) at android.app.servertr 在android.os.Looper.loop(Looper.java:193)在android.app.ActivityThread.main(ActivityThread.java:6669)在com.android.internal的java.lang.reflect.Method.invoke(本机方法) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)上的.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:493)原因:java.lang.NullPointerException:尝试调用虚拟方法'android .view.View android.view.View.findViewById(int)',位于com.example.recyclerview2.Fragments.FragmentHome.initRecyclerView(FragmentHome.java:92)上的com.example.recyclerview2.MainActivity.onCreate( android.app.Activity.performCreate(Activity.java:7136)上的MainActivity.java:44)android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)上android.app.Activity.performCreate(Activity.java:7127)上的)在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)在android.app.servertr ansaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6669) android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)位于android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)具有ansaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) android.os.Handler.dispatchMessage(Handler.java:106)上的.ActivityThread $ H.handleMessage(ActivityThread.java:1808)android.os.Looper.loop(Looper.java:193)上的android.app.ActivityThread。主要(ActivityThread.java:6669)

Sorry, first post on stack, I don't know how to format code correctly. 抱歉,第一篇文章是关于堆栈的,我不知道如何正确格式化代码。

Problem in your code is that you are calling fragmentHome.initRecyclerView(); 代码中的问题是您正在调用fragmentHome.initRecyclerView(); in onCreate() method in MainActivity . MainActivity的 onCreate()方法中。 Fragment view at that point is not created yet. 此时尚未创建片段视图。 That's why you get NullPointerException Remove this line from MainActivity. 这就是为什么您会得到NullPointerException从MainActivity删除此行的原因。

It seems there is problem in below line of initRecyclerView 看来initRecyclerView行有问题

feedRecyclerView = inflatingView.findViewById(R.id.recyclerView);

While the line is executing it seems inflatingView is null. 在执行该行时,似乎inflatingView为null。 But I can't understand why. 但是我不明白为什么。 Please try moving the above line inside onCreateView() . 请尝试将上述行移动到onCreateView() Hope this might solve the problem. 希望这可以解决问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 片段上findViewById的NullPointerException - NullPointerException on findViewById from Fragment 使用findFragmentByTag()访问片段时获取NullPointerException - Getting a NullPointerException when accessing a Fragment using findFragmentByTag() findViewById时的Android NullPointerException - Android NullPointerException when findViewById RecyclerView 在 Fragment 中因 NullPointerException 而崩溃 - RecyclerView crashes with NullPointerException in Fragment 尝试查找ViewById时抛出NullpointerException - Nullpointerexception thrown when trying to findViewById 无法解析 Fragment RecyclerView 中的“findViewById”方法 - Cannot resolve 'findViewById' method in Fragment RecyclerView 在 Fragment 内使用 Kotlin ViewBinding 时出现 NullPointerException - NullPointerException when using Kotlin ViewBinding inside Fragment 在片段中声明 findViewById 后的 java.lang.NullpointerException - java.lang.NullpointerException after declaring findViewById in fragment 父活动片段中的EditText的NullPointerException findViewByID - NullPointerException findViewByID of a EditText inside a fragment from his parent activity 如何在Android父片段中查找ViewById()(获取ClassCastException)? - How to findViewById() in Android parent fragment (getting a ClassCastException)?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM