0

I am sorry if this was asked before but I can not seem to find a solution for this problem.

I am working in Android Studio and following a tutorial from a book about developing an app and working with RecyclerView, and the app is stopping even though it compiles in Android Studio.

The code is the exact code from the book, so I checked and Logcat gives me these types of errors:


FATAL EXCEPTION: main     Process: ndroid.bignerdranch.com, PID: 17436    
    java.lang.NullPointerException: Attempt to invoke virtual method
    'void android.widget.TextView.setText(java.lang.CharSequence)' on a
    null object reference         at
    ndroid.bignerdranch.com.CrimeListFragment$CrimeHolder.bind
    (CrimeListFragment.java:62)
        at ndroid.bignerdranch.com.CrimeListFragment$CrimeAdapter.onBindViewHolder** 
   (CrimeListFragment.java:91)**
        at ndroid.bignerdranch.com.CrimeListFragment$CrimeAdapter.onBindViewHolder** 
   (CrimeListFragment.java:74)**
        at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7056)
        at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7098)
        at 


 androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6010)

Here is the CrimeListFragment class code that seems to have errors:


        package ndroid.bignerdranch.com;

        import android.os.Bundle;

    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    import android.widget.Toast;

    import java.util.List;

    import androidx.fragment.app.Fragment;
    import androidx.recyclerview.widget.LinearLayoutManager;
    import androidx.recyclerview.widget.RecyclerView;
    import ndroid.bignerdranch.com.R;

    public class CrimeListFragment extends Fragment {
        private RecyclerView mCrimeRecyclerView;
        private CrimeAdapter mAdapter;

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_crime_list, container, false);

            mCrimeRecyclerView = (RecyclerView) view
                    .findViewById(R.id.crime_recycler_view);
            mCrimeRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

            updateUI();

            return view;
        }

        private void updateUI() {
            CrimeLab crimeLab = CrimeLab.get(getActivity());
            List crimes = crimeLab.getCrimes();

            mAdapter = new CrimeAdapter(crimes);
            mCrimeRecyclerView.setAdapter(mAdapter);
        }

        private class CrimeHolder extends RecyclerView.ViewHolder
                implements View.OnClickListener {

            private Crime mCrime;

            private TextView mTitleTextView;
            private TextView mDateTextView;

            public CrimeHolder(LayoutInflater inflater, ViewGroup parent) {
                super(inflater.inflate(R.layout.list_item_crime, parent, false));
                itemView.setOnClickListener(this);

                mTitleTextView = (TextView) itemView.findViewById(R.id.crime_title);
                mDateTextView = (TextView) itemView.findViewById(R.id.crime_date);
            }

            public void bind(Crime crime) {
                mCrime = crime;
                mTitleTextView.setText(mCrime.getTitle());
                mDateTextView.setText(mCrime.getDate().toString());
            }

            @Override
            public void onClick(View view) {
                Toast.makeText(getActivity(),
                        mCrime.getTitle() + " clicked!", Toast.LENGTH_SHORT)
                        .show();
            }
        }

        private class CrimeAdapter extends RecyclerView.Adapter {

            private List mCrimes;

            public CrimeAdapter(List crimes) {
                mCrimes = crimes;
            }

            @Override
            public CrimeHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
                return new CrimeHolder(layoutInflater, parent);
            }

            @Override
            public void onBindViewHolder(CrimeHolder holder, int position) {
                Crime crime = mCrimes.get(position);
                holder.bind(crime);
            }

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

 
Muazzam A.
  • 647
  • 5
  • 17
Angela
  • 1

1 Answers1

0

Your mTitleTextView is null, and you try to call a method of null. The variable is assigned at the method above:

mTitleTextView = (TextView) itemView.findViewById(R.id.crime_title);

The findViewById method returns null when it can't find the view with the given id inside the view it is called on (itemView in your case). I can't find in your code where this view comes from but you need to check and make sure that a view with the id crime_title is actually part of it.

Gtomika
  • 845
  • 7
  • 24