Timelord64 - 11 months ago 61
Android Question

# Resources$NotFoundException trying to set up a RecyclerView in Android Studio I've been trying to set up a RecyclerView for the past two days, and most of it appears to work as intended. However, whenever I attempt to run my app, it crashes with a fatal exception: E/AndroidRuntime: FATAL EXCEPTION: main Process: com.mad.exercise5, PID: 16634 android.content.res.Resources$NotFoundException: String resource ID #0x1
at android.content.res.Resources.getText(Resources.java:342)
at android.support.v7.widget.ResourcesWrapper.getText(ResourcesWrapper.java:52)
at android.widget.TextView.setText(TextView.java:4244)
at (...)

I have been following the slideview tutorials from YouTube, parts 1-4. In the context of the tutorials, the RecyclerView is being set up in a fragment, which I have not gone in to yet. Just in case the error came from creating the RecyclerView in the main activity, I also tried following a tutorial at StackTips.

To the best of my ability, I have been able to stop the error by commenting out the line that sets the Layout Manager (
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
), but the error appears to originate from the
onBindViewHolder
. Specifically, setting text to my ViewHolder TextViews.

Googling the error, and doing some research, I found lots of cases where this error popped up in other questions and issues. However, the problem always seems to be that the user is calling for a resource, but directly referencing it as an id. That is, they would use '
String string = R.string.string
Why am I receiving a Resources$NotFoundException, in my RecyclerView example activity? The two relevant java classes are as follows: MainActivity.java public class MainActivity extends AppCompatActivity { private ArrayList<Train> mTrains; private TrainAdapter mTrainAdapter; private RecyclerView mRecyclerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Create the Recycler View mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view); mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); mTrains = FillTrainData(); mTrainAdapter = new TrainAdapter(this, mTrains); mRecyclerView.setAdapter(mTrainAdapter); } private ArrayList<Train> FillTrainData() { ArrayList<Train> mTempTrainData = new ArrayList<>(); String[] mPlatform = new String[]{"platA", "platB", "platC", "platD"}; String[] mStatus = new String[]{"arrive", "notarrive"}; String[] mDestination = new String[]{"destA", "destB", "destC", "destD"}; String[] mDestinationTime = new String[]{"destA", "destB", "destC", "destD"}; int[] mArrivalTime = new int[]{1,2,3,4}; for(int i = 0; i < 4; i ++) { Train mTrain = new Train(mPlatform[i], mArrivalTime[i], mStatus[i%2], mDestination[i], mDestinationTime[i]); mTempTrainData.add(mTrain); } return mTempTrainData; } } TranAdapter.java public class TrainAdapter extends RecyclerView.Adapter<TrainAdapter.CustomViewHolder> { private Context mContext; private ArrayList<Train> mTrains; public TrainAdapter(Context context, ArrayList<Train> trains) { mContext = context; mTrains = trains; } @Override public CustomViewHolder onCreateViewHolder(ViewGroup parent, int index) { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.train_item, null); CustomViewHolder viewHolder = new CustomViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(CustomViewHolder viewHolder, int position) { Train currentTrain = mTrains.get(position); viewHolder.platformText.setText(currentTrain.GetPlatform()); viewHolder.arrivalTimeText.setText(currentTrain.GetArrivalTime()); viewHolder.statusText.setText(currentTrain.GetStatus()); viewHolder.destinationText.setText(currentTrain.GetDestination()); viewHolder.destinationTimeText.setText(currentTrain.GetDestinationTime()); } @Override public int getItemCount() { return (mTrains != null ? mTrains.size() : 0); } class CustomViewHolder extends RecyclerView.ViewHolder { TextView platformText; TextView arrivalTimeText; TextView statusText; TextView destinationText; TextView destinationTimeText; public CustomViewHolder(View itemView) { super(itemView); platformText = (TextView)itemView.findViewById(R.id.train_item_platform_text); arrivalTimeText = (TextView)itemView.findViewById(R.id.train_item_arrival_time_text); statusText = (TextView)itemView.findViewById(R.id.train_item_status_text); destinationText = (TextView)itemView.findViewById(R.id.train_item_destination_text); destinationTimeText = (TextView)itemView.findViewById(R.id.train_item_destination_time_text); } } } Answer Source First Read Document of TextView. your arrival time is int and TextView have two type of setText method first is TextView.setText(String text); and second is TextView.setText(int resource); when you write viewHolder.arrivalTimeText.setText(currentTrain.GetArrivalTime()); then you second type of method will call. int that case you have four value 1,2,3,4 means it's like viewHolder.arrivalTimeText.setText(1); at this time R.java may not have resource of value "1"; that's why you got android.content.res.Resources$NotFoundException: String resource ID #0x1