【问题标题】:Resources$NotFoundException trying to set up a RecyclerView in Android StudioResources$NotFoundException 试图在 Android Studio 中设置 RecyclerView
【发布时间】:2016-09-03 03:59:36
【问题描述】:

过去两天我一直在尝试设置 RecyclerView,其中大部分似乎都按预期工作。但是,每当我尝试运行我的应用程序时,它都会因致命异常而崩溃:

E/AndroidRuntime: 致命异常: main 进程:com.mad.exercise5,PID:16634 android.content.res.Resources$NotFoundException:字符串资源 ID #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,第 1-4 部分。在教程的上下文中,RecyclerView 被设置在一个片段中,我还没有进入。以防错误来自在主要活动中创建 RecyclerView,我还尝试关注a tutorial at StackTips

尽我所能,我已经能够通过注释掉设置布局管理器 (mRecyclerView.setLayoutManager(new LinearLayoutManager(this));) 的行来阻止错误,但错误似乎源自 onBindViewHolder。具体来说,将文本设置为我的 ViewHolder TextViews。

通过谷歌搜索错误并进行一些研究,我发现很多其他问题和问题中都会出现此错误的情况。但是,问题似乎总是用户正在调用资源,但直接将其作为 id 引用。也就是说,他们将使用“String string = R.string.string”而不是“String string = getString(R.string.string)”。我已经三次检查了我的标准资源实现,并且确信我没有错过任何东西。就教程让我相信,我正确地实例化了我的 TextView,并正确实现了 findViewById。主要活动上下文在初始化时传递,因此查找相关 ID 应该没有问题。

为什么在我的 RecyclerView 示例活动中收到 Resources$NotFoundException两个相关的 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);
        }
    }
}

【问题讨论】:

    标签: java android compiler-errors android-recyclerview


    【解决方案1】:

    TextView的第一次阅读文档。

    您的到达时间是int 和TextView 有两种setText 方法 第一个是TextView.setText(String text); 和 第二个是TextView.setText(int resource);

    当您编写viewHolder.arrivalTimeText.setText(currentTrain.GetArrivalTime()); 时,您将调用第二种方法。在这种情况下,您有四个值 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()));
    

    【讨论】:

    • 非常感谢你!我终于明白了,只是因为你。点赞
    • 好收获。我就像什么?我的天啊。 +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    相关资源
    最近更新 更多