Получение NullPointerException при использовании findViewById для recyclerView во фрагменте - PullRequest
0 голосов
/ 15 апреля 2019

Попытка собрать приложение из 5 фрагментов. Первый содержит recyclerView, когда я переключаю вкладки, представления отбрасываются, и каждый раз, когда я возвращаюсь, когда инфлятор надувает представление, в то же время приложение пытается получить идентификатор recyclerView, который возвращает исключение нулевого указателя. И эта проблема только усложняется, я не думаю, что использование правильного способа сделать это, поскольку я получаю ошибки, также будет зависеть от контекста.

Если у вас есть простые примеры приложений с фрагментами, которые имеют recyclerViews, перейдите по ссылке ниже, заранее спасибо

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

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());
}
}

Ошибка, которую я получаю Я получаю следующую ошибку:

2019-04-15 13: 00: 28.449 18359-18359 / com.example.recyclerview2 E / AndroidRuntime: ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: main

Процесс: com.example.recyclerview2, PID: 18359

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: ОСНОВНОЕ ИСКЛЮЧЕНИЕ: основное Процесс: com.example.recyclerview2, PID: 5508 java.lang.RuntimeException: невозможно запустить действие ComponentInfo {com.example.recyclerview2 / com.example.recyclerview2.MainActivity}: java.lang.NullPointerException: попытка вызвать виртуальный метод '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.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:108) на android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:68) на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1808) на android.os.Handler.dispatchMessage (Handler.java:106) на android.os.Looper.loop (Looper.java:193) на android.app.ActivityThread.main (ActivityThread.java:6669) в java.lang.reflect.Method.invoke (родной метод) в com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:493) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:858) Вызвано: 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 (MainActivity.java:44) на android.app.Activity.performCreate (Activity.java:7136) на android.app.Activity.performCreate (Activity.java:7127) на android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1271) на android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2893) на android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3048) на android.app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem.java:78) на android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:108) на android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:68) на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1808) на android.os.Handler.dispatchMessage (Handler.java:106) на android.os.Looper.loop (Looper.java:193)atroid.app.ActivityThread.main (ActivityThread.java:6669)

Извините, первое сообщение в стеке, я не знаю, как правильно отформатировать код.

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Проблема в вашем коде в том, что вы вызываете метод fragmentHome.initRecyclerView(); в onCreate() в MainActivity .Фрагмент вида на данный момент еще не создан.Вот почему вы получаете NullPointerException Удалить эту строку из MainActivity.

0 голосов
/ 15 апреля 2019

Кажется, есть проблема в строке ниже initRecyclerView

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

Во время выполнения строки кажется, что inflatingView является нулем.Но я не могу понять почему.Пожалуйста, попробуйте переместить указанную выше строку внутрь onCreateView().Надеюсь, что это решит проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...