1

私は過去2日間にRecyclerViewを設定しようとしていましたが、そのほとんどは意図したとおりに動作するようです。

E/AndroidRuntime:致命的な例外:メイン プロセス:com.mad.exercise5、PID:16634 android.content.res私は私のアプリを実行しようとするたびにしかし、それは致命的な例外でクラッシュ。リソース$ NotFoundException:StringリソースID#0x1 android.content.res.Resources.getText(Resources.java:342) android.support.v7.widget.ResourcesWrapper.getText(ResourcesWrapper.java:52) at android .widget.TextView.setText(TextView.java:4244) at (...)

私は、the slideview tutorials from YouTube、パート1〜4に従っています。チュートリアルの文脈では、RecyclerViewは断片に設定されていますが、これについてはまだ説明していません。メインアクティビティでRecyclerViewを作成したときにエラーが発生した場合は、a tutorial at StackTipsにも従ってみました。

レイアウトマネージャ(mRecyclerView.setLayoutManager(new LinearLayoutManager(this));)を設定する行をコメントアウトすることでエラーを止めることができましたが、エラーはonBindViewHolderから発生しているようです。具体的には、テキストをViewHolder TextViewsに設定します。

グーグルでエラーを調査していくつかの調査を行ったところ、他の質問や問題でこのエラーが発生したケースが多数見つかりました。しかし、問題は常に、ユーザーがリソースを呼び出すが、IDとして直接参照しているように見える。つまり、「String string = getString(R.string.string)」の代わりに「String string = R.string.string」を使用します。私は標準リソースの実装を三重にチェックして、何も見逃していないと確信しています。チュートリアルが私に信じさせた限り、私は正確にfindViewByIdの実装でTextViewsを正しくインスタンス化しています。主なアクティビティのコンテキストは初期化時に渡されるため、関連するIDを見つけるのに問題はありません。

RecyclerViewのサンプルアクティビティで、リソース$ NotFoundExceptionを受け取ったのはなぜですか?次のように 2つの関連するJavaクラスは次のとおりです。

MainActivity.java TextView

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

android.content.res.Resources$NotFoundException: String resource ID #0x1

変更viewHolder.arrivalTimeText.setText(currentTrain.GetArrivalTime());ラインを得た理由です 。かなり長かったので、最初の数行で十分な詳細が得られ、大量のエラーコードで質問にあふれてしまいました。 – Gnemlock

答えて

6

まず読み取った原稿。

ご到着時間がintで、TextViewには、最初のsetTextメソッド の2種類がTextView.setText(String text);で持っている、あなたは、あなたがこの方法の第二のタイプ呼ぶviewHolder.arrivalTimeText.setText(currentTrain.GetArrivalTime());を書くとき 目はTextView.setText(int resource);

です。この場合、4つの値を持つ1,2,3,4

は、この時点ではviewHolder.arrivalTimeText.setText(1);のようになります。javaは値 "1"のリソースを持たないかもしれません。あなたはそれが助け場合、私は、完全なエラー・コードを提供して幸せ

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

あなたは完全な伝説です。私はよく知っていたはずですが、私はその場合にintを使うべきかどうかを決定していますが、それを別のインデックスとして解釈するとは考えていませんでした。私はarrivalTimeの部分をコメントアウトし、それは100%動作します。大変ありがとうございました:) – Gnemlock

+0

ありがとう、あまりにも男!私はついにそれをあなたのことを知った。アップワード<3 –

関連する問題