Почему я получаю ошибку нулевой ссылки, используя RecyclerView с фрагментами - PullRequest
0 голосов
/ 04 марта 2019

Я использую фрагменты для моего приложения.Я также использую ящик для нагибации, который открывает фрагменты с помощью кнопок в ящике.

Я пытаюсь отобразить некоторые базовые изображения и тексты для моего маклера с помощью его адаптера и массива.

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

Ниже приведен код моей активности:

public class secondActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

private DrawerLayout drawer;
private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);

    ArrayList<exampleItemBooks> exampleList = new ArrayList<>();
    exampleList.add(new exampleItemBooks(R.drawable.artofwar, "Line 1", "Line 
    2"));
    exampleList.add(new exampleItemBooks(R.drawable.aristotle, "Line 3", 
    "Line 4"));
    exampleList.add(new exampleItemBooks(R.drawable.caesarbook, "Line 5", 
    "Line 6"));
    exampleList.add(new exampleItemBooks(R.drawable.platorepublic, "Line 7", 
    "Line 8"));
    exampleList.add(new exampleItemBooks(R.drawable.senecaletters, "Line 9", 
    "Line 10"));
    exampleList.add(new exampleItemBooks(R.drawable.thehistoryofmypeople, 
    "Line 11", "Line 12"));
    exampleList.add(new exampleItemBooks(R.drawable.theprince, "Line 13", 
    "Line 14"));
    exampleList.add(new exampleItemBooks(R.drawable.thritysixstrategems, 
    "Line 15", "Line 16"));
    exampleList.add(new exampleItemBooks(R.drawable.medidations, "Line 17", 
    "Line 18"));

    mRecyclerView = findViewById(R.id.recyclerViewBooks);
    mRecyclerView.setHasFixedSize(false);
    mLayoutManager = new LinearLayoutManager(this);
    mAdapter = new exampleBooksAdapter(exampleList);

    mRecyclerView.setLayoutManager(mLayoutManager);
    mRecyclerView.setAdapter(mAdapter);

    Toolbar toolbar = findViewById(R.id.toolbarMain);
    setSupportActionBar(toolbar);

    drawer = findViewById(R.id.drawer_layout);
    NavigationView navigationView = findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, 
    toolbar, R.string.navigation_open_drawer, 
    R.string.navigation_close_drawer);
    drawer.addDrawerListener(toggle);
    toggle.syncState();

    if (savedInstanceState == null) {

      getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new HomeFragment()).commit();
        //Set the button as checked.
        navigationView.setCheckedItem(R.id.nav_home);

    }
}

Ниже приведен код класса моего фрагмента, который отвечает за мой фрагмент, который я использую для повторного просмотра:

 import android.os.Bundle;
   import android.support.annotation.NonNull;
   import android.support.annotation.Nullable;
   import android.support.v4.app.Fragment;
   import android.view.LayoutInflater;
   import android.view.View;
   import android.view.ViewGroup;

    public class BooksFragment extends Fragment {

    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_books, container, false);

        View view = inflater.inflate(R.layout.fragment_books, container, false);

        RecyclerView recyclerView = view.findViewById(R.id.recyclerViewBooks);
        //mRecyclerView = findViewById(R.id.recyclerViewBooks);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        return view;

    }
}

Ниже мой адаптер для recyclerView:

   public class exampleBooksAdapter extends RecyclerView.Adapter<exampleBooksAdapter.ExampleViewHolder> {

    private ArrayList<exampleItemBooks> mExampleList;

    public static class ExampleViewHolder extends RecyclerView.ViewHolder {

        public ImageView mImageView;
        public TextView mTextView1;
        public TextView mTextView2;

        public ExampleViewHolder(View itemView) {
            super(itemView);

            mImageView = itemView.findViewById(R.id.imageViewCards);
            mTextView1 = itemView.findViewById(R.id.textViewCard1);
            mTextView1 = itemView.findViewById(R.id.textViewCard2);
        }
    }

    public exampleBooksAdapter(ArrayList<exampleItemBooks> exampleItemBooks) {

        mExampleList = exampleItemBooks;

    }

    @Override
    public ExampleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.example_item_books, parent, false);
        ExampleViewHolder evh = new ExampleViewHolder(v);
        return evh;
    }

    @Override
    public void onBindViewHolder(@NonNull ExampleViewHolder holder, int position) {

        exampleItemBooks currentItem = mExampleList.get(position);

        holder.mImageView.setImageResource(currentItem.getImageResource());
        holder.mTextView1.setText(currentItem.getText1());
        holder.mTextView2.setText(currentItem.getText2());
    }

    @Override
    public int getItemCount() {

        return mExampleList.size();
    }
}

Ниже мой класс arraylist:

 public class exampleItemBooks {

    private int mImageResource;
    private String mText1;
    private String mText2;

    public exampleItemBooks(int imageResource, String text1, String text2) {

        mImageResource = imageResource;
        mText1 = text1;
        mText2 = text2;

    }

    public int getImageResource() {

        return mImageResource;

    }

    public String getText1() {

        return mText1;
    }

    public String getText2() {

        return mText2;
    }

}

И ошибка, которую я продолжаю получать, такова:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.warstories, PID: 5753
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.warstories/com.example.warstories.secondActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setHasFixedSize(boolean)' on a null object reference
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
    at android.app.ActivityThread.-wrap11(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
    at android.os.Handler.dispatchMessage(Handler.java:105)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6541)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setHasFixedSize(boolean)' on a null object reference
    at com.example.warstories.secondActivity.onCreate(secondActivity.java:42)
    at android.app.Activity.performCreate(Activity.java:6975)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) 
    at android.app.ActivityThread.-wrap11(Unknown Source:0) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) 
    at android.os.Handler.dispatchMessage(Handler.java:105) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6541) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 

Ошибка ключа desc:

Unable to start activity ComponentInfo{com.example.warstories/com.example.warstories.secondActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)' on a null object reference

Причина: java.lang.NullPointerException: попытка вызвать виртуальный метод void android.support.v7.widget.RecyclerView.setLayoutManager (android.support.v7.widget.RecyclerView$ LayoutManager) 'для пустой ссылки на объект.

Любая помощь?

1 Ответ

0 голосов
/ 04 марта 2019

Ваш код не выполняется, поскольку ваша активность пытается получить доступ к RecyclerView, который является частью макета фрагмента, а макет вашего фрагмента недоступен сразу после вызова setContentView() (даже после операции replace() ондоступно только асинхронно, поскольку вы используете commit() вместо commitNow()).

Фрагменты должны быть (в максимально возможной степени) автономными .Это означает, что если вашему Фрагменту принадлежит RecyclerView, он должен нести ответственность за загрузку в него данных, а не вашей Деятельности.

Вы должны переместить весь код в вашей Деятельности, касающийся RecyclerViewк фрагменту - в идеале, в метод, такой как onViewCreated(), который дает вам доступ к просмотру, который вы надули в onCreateView(), и является подходящим местом для вызова findViewById() и получения вашего RecyclerView.

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