Gne*_*ock 2 java android compiler-errors recycler-adapter android-recyclerview
我一直试图在过去两天内设置一个RecyclerView,其中大部分似乎按预期工作.但是,每当我尝试运行我的应用程序时,它都会发生致命的异常崩溃:
E/AndroidRuntime:FATAL EXCEPTION:main进程:com.mad.exercise5,PID:16634 android.content.res.Resources $ NotFoundException:android.content.res.Resources.getText中的字符串资源ID#0x1(Resources.java:342 )在android.widget.TextView.setText(TextView.java:4244)的android.support.v7.widget.ResourcesWrapper.getText(ResourcesWrapper.java:52)at (...)
我一直在关注YouTube的幻灯片教程,第1-4部分.在教程的上下文中,RecyclerView正在一个片段中设置,我还没有进入.为了防止错误来自在主活动中创建RecyclerView,我也尝试在StackTips上学习教程.
尽我所能,我已经能够通过注释掉设置布局管理器(mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
)的行来停止错误,但错误似乎来自于onBindViewHolder
.具体来说,将文本设置为我的ViewHolder TextViews.
谷歌搜索错误,并进行一些研究,我发现很多情况下,其他问题和问题突然出现此错误.但是,问题似乎总是用户正在调用资源,而是直接将其作为id引用.也就是说,他们会使用' String string = R.string.string
'代替' String string = getString(R.string.string)
'.我已经三次检查我的标准资源实现,并且我相信我没有错过任何东西.至于教程让我相信,我正确地实例化我的TextViews,正确的实现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;
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
pra*_*iya 12
首先阅读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()));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1511 次 |
最近记录: |