[英]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.