1

Я пытаюсь настроить RecyclerView в течение последних двух дней, и большинство из них работает так, как планировалось. Тем не менее, всякий раз, когда я пытаюсь запустить мое приложение, он выходит из строя со смертельным исключением:

E/AndroidRuntime: FATAL ИСКЛЮЧЕНИЕ: главный процесса: com.mad.exercise5, PID: 16634 android.content.res. Ресурсы $ NotFoundException: Идентификатор ресурса строки # 0x1 на android.content.res.Resources.getText (Resources.java:342) на android.support.v7.widget.ResourcesWrapper.getText (ResourcesWrapper.java:52) на android .widget.TextView.setText (TextView.java:4244) по адресу (...)

Я следующие the slideview tutorials from YouTube, parts 1-4. В контексте учебников RecyclerView настраивается в фрагменте, к которому я еще не вошел. На всякий случай, возникла ошибка при создании RecyclerView в основном действии, я также пробовал следовать a tutorial at StackTips.

В меру моих возможностей, я смог остановить ошибку, закомментировав строку, которая устанавливает диспетчер компоновки (mRecyclerView.setLayoutManager(new LinearLayoutManager(this));), но ошибка возникает из onBindViewHolder. В частности, установка текста в TextViews ViewHolder.

Ошибка при запуске и некоторые исследования, я обнаружил множество случаев, когда эта ошибка возникла в других вопросах и проблемах. Однако проблема всегда заключается в том, что пользователь вызывает ресурс, но напрямую ссылается на него как на идентификатор. То есть, они будут использовать 'String string = R.string.string' вместо 'String string = getString(R.string.string)'. Я трижды проверил стандартную реализацию ресурсов, и я уверен, что ничего не пропустил. Что касается учебников, которые привели меня к мысли, я правильно создаю свой TextViews с правильной реализацией findViewById. Контекст основной активности передается при инициализации, поэтому не должно возникать проблем с поиском соответствующих идентификаторов.

Почему я получаю Ресурсы $ NotFoundException, в моем примере приложения RecyclerView? двух соответствующих классов Java заключаются в следующем:

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); 
     } 
    } 
} 
+0

Я рад предоставить полный код ошибки, если это помогает. Это было значительно долго, поэтому я надеялся, что первые несколько строк предоставят достаточно деталей и избавят меня от наводнения вопросом массивным кодом ошибки. – Gnemlock

ответ

6

сначала прочитать документ TextView.

ваше время прибытия int и TextView имеют два типа метода SetText первый является TextView.setText(String text); и второй является TextView.setText(int resource);

когда вы пишете viewHolder.arrivalTimeText.setText(currentTrain.GetArrivalTime()); то второй тип метода будет вызывать. int в этом случае у вас есть четыре значения 1,2,3,4

означает, что это как viewHolder.arrivalTimeText.setText(1); в это время R.java может не иметь ресурса значения «1»; именно поэтому вы получили android.content.res.Resources$NotFoundException: String resource ID #0x1

изменения viewHolder.arrivalTimeText.setText(currentTrain.GetArrivalTime()); линии с

viewHolder.arrivalTimeText.setText(String.valueOf(currentTrain.GetArrivalTime())); 
+0

OMG вы - полная легенда. Я должен был знать лучше, я некоторое время подхватил решение о том, следует ли мне использовать int в этом случае, но никогда не думал, что это интерпретирует его как другой индекс. Я прокомментировал часть arrivalTime, и она работает на 100%. Спасибо кучке :) – Gnemlock

+0

Спасибо большое! Я, наконец, получил его только из-за вас. Упрощенный <3 –

Смежные вопросы