Java 如果在数组字符串上,则RecyclerView数组为null
我正在研究Android回收视图,我发现了这个例子 回收适配器Java 如果在数组字符串上,则RecyclerView数组为null,java,android,arrays,android-recyclerview,Java,Android,Arrays,Android Recyclerview,我正在研究Android回收视图,我发现了这个例子 回收适配器 public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> { private String[] titles = {"Capter One", "Chapter Two", "Chapter Three", "Chapter Four",
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
private String[] titles = {"Capter One",
"Chapter Two",
"Chapter Three",
"Chapter Four",
"Chapter Five",
"Chapter Six"
};
private String[] details = {"Det..One","Det..Two","Det.. Three","Det...Four","Det.. Five","Det..Six"};
private int[] images = {R.drawable.android_image_1,
R.drawable.android_image_2,
R.drawable.android_image_3,
R.drawable.android_image_4,
R.drawable.android_image_5,
R.drawable.android_image_6
};
@Override
public ViewHolder onCreateViewHolder( ViewGroup viewGroup, int i ){
View v = LayoutInflater.from (viewGroup.getContext ()).inflate (R.layout.card_layout, viewGroup,false);
ViewHolder viewHolder = new ViewHolder (v);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
viewHolder.itemTitle.setText(titles[i]);
viewHolder.itemDetail.setText(details[i]);
viewHolder.itemImage.setImageResource(images[i]);
}
@Override
public int getItemCount() {
return titles.length;
}
class ViewHolder extends RecyclerView.ViewHolder /*implements Inter*/{
ImageView itemImage;
TextView itemTitle;
TextView itemDetail;
ViewHolder( View itemView ){
super(itemView);
itemImage = itemView.findViewById (R.id.item_image);
itemTitle = itemView.findViewById (R.id.item_title);
itemDetail = itemView.findViewById (R.id.item_detail);
itemView.setOnClickListener (new View.OnClickListener () {
@Override
public void onClick ( View v ) {
int position = getAdapterPosition ();
position +=1;
Snackbar.make (v,"click on position" + titles[position],Snackbar.LENGTH_SHORT).setAction ("Action", null).show ();
}
});
}
}
}
没什么特别的,而且效果很好。
我只是做了一点“最佳实践”的改变我想从资源文件中获取标题数组,如下所示:
<resources>
<string-array name="titles">
<item>Chap 1</item>
<item>Chap 2</item>
<item>Chap 3</item>
<item>Chap 4</item>
<item>Chap 5</item>
<item>Chap 6</item>
<item>Chap 7</item>
<item>Chap 8</item>
</string-array>
</resources>
但当我运行应用程序时,我得到java.lang.NullPointerException:尝试获取空数组的长度
在com.example.evenbook.RecyclerAdapter.getItemCount(RecyclerAdapter.java:55)上
数组在中为空
public int getItemCount() {
return titles.length;
}
如果我尝试使用return 5,就可以了(它只显示5个卡片项目)
我还认为getItemCount方法是在onCreateViewHolder之前启动的,但我认为这是不可能的。
发生了什么?
提前感谢尝试以下更改:
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
private String[] titles;
private String[] details;
private int[] images;
public RecyclerAdapter() {
this.titles = = {"Capter One",
"Chapter Two",
"Chapter Three",
"Chapter Four",
"Chapter Five",
"Chapter Six"
};
this.details = = {"Det..One","Det..Two","Det.. Three","Det...Four","Det.. Five","Det..Six"};
this.images = = {R.drawable.android_image_1,
R.drawable.android_image_2,
R.drawable.android_image_3,
R.drawable.android_image_4,
R.drawable.android_image_5,
R.drawable.android_image_6
};
}
@Override
public ViewHolder onCreateViewHolder( ViewGroup viewGroup, int i ){
View v = LayoutInflater.from (viewGroup.getContext ()).inflate (R.layout.card_layout, viewGroup,false);
ViewHolder viewHolder = new ViewHolder (v);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
viewHolder.itemTitle.setText(titles[i]);
viewHolder.itemDetail.setText(details[i]);
viewHolder.itemImage.setImageResource(images[i]);
}
@Override
public int getItemCount() {
return titles.length;
}
class ViewHolder extends RecyclerView.ViewHolder /*implements Inter*/{
ImageView itemImage;
TextView itemTitle;
TextView itemDetail;
ViewHolder( View itemView ){
super(itemView);
itemImage = itemView.findViewById (R.id.item_image);
itemTitle = itemView.findViewById (R.id.item_title);
itemDetail = itemView.findViewById (R.id.item_detail);
itemView.setOnClickListener (new View.OnClickListener () {
@Override
public void onClick ( View v ) {
int position = getAdapterPosition ();
position +=1;
Snackbar.make (v,"click on position" + titles[position],Snackbar.LENGTH_SHORT).setAction ("Action", null).show ();
}
});
}
}
}
公共类RecyclerAdapter扩展了RecyclerView.Adapter{
私有字符串[]标题;
私有字符串[]详细信息;
私有int[]图像;
公共回收设备适配器(){
this.titles=={“捕获者一号”,
“第二章”,
“第三章”,
“第四章”,
“第五章”,
“第六章”
};
这个.细节={“一号”、“二号”、“三号”、“四号”、“五号”、“六号”};
this.images=={R.drawable.android_image_1,
R.drawable.android_image_2,
R.drawable.android_image_3,
R.drawable.android_image_4,
R.drawable.android_image_5,
R.drawable.android_image_6
};
}
@凌驾
公共视图持有者onCreateViewHolder(视图组视图组,int i){
视图v=LayoutInflater.from(viewGroup.getContext()).flate(R.layout.card\u布局,viewGroup,false);
视窗夹持器视窗夹持器=新视窗夹持器(v);
返回视图持有者;
}
@凌驾
公共无效onBindViewHolder(ViewHolder ViewHolder,int i){
viewHolder.itemTitle.setText(titles[i]);
viewHolder.itemdail.setText(细节[i]);
viewHolder.itemImage.setImageResource(images[i]);
}
@凌驾
public int getItemCount(){
返回标题。长度;
}
类ViewHolder扩展了RecyclerView.ViewHolder/*实现了*/{
图像查看项目图像;
文本视图项目标题;
文本视图项目详细信息;
ViewHolder(视图项视图){
超级(项目视图);
itemImage=itemView.findViewById(R.id.item\u图像);
itemTitle=itemView.findViewById(R.id.item\u title);
itemDetail=itemView.findViewById(R.id.item\u详细信息);
itemView.setOnClickListener(新的View.OnClickListener(){
@凌驾
公共void onClick(视图v){
int position=getAdapterPosition();
位置+=1;
Snackbar.make(v,“点击位置”+标题[position],Snackbar.LENGTH\u SHORT).setAction(“Action”,null).show();
}
});
}
}
}
您可以使用
getResources().getStringArray
String[] array = getResources().getStringArray(R.array.titles);
然后可以更改适配器构造函数以接受字符串数组String[]
RecyclerAdapter adapter = new RecyclerAdapter(array);
公共类RecyclerAdapter扩展了RecyclerView.Adapter{
私有字符串[]标题;
RecyclerAdapter(字符串[]标题){
this.titles=标题;
}
//…其他同学
}
有效,谢谢!!如果我想在RecycleAdapter类中获取数组,怎么可能?
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
private String[] titles;
private String[] details;
private int[] images;
public RecyclerAdapter() {
this.titles = = {"Capter One",
"Chapter Two",
"Chapter Three",
"Chapter Four",
"Chapter Five",
"Chapter Six"
};
this.details = = {"Det..One","Det..Two","Det.. Three","Det...Four","Det.. Five","Det..Six"};
this.images = = {R.drawable.android_image_1,
R.drawable.android_image_2,
R.drawable.android_image_3,
R.drawable.android_image_4,
R.drawable.android_image_5,
R.drawable.android_image_6
};
}
@Override
public ViewHolder onCreateViewHolder( ViewGroup viewGroup, int i ){
View v = LayoutInflater.from (viewGroup.getContext ()).inflate (R.layout.card_layout, viewGroup,false);
ViewHolder viewHolder = new ViewHolder (v);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
viewHolder.itemTitle.setText(titles[i]);
viewHolder.itemDetail.setText(details[i]);
viewHolder.itemImage.setImageResource(images[i]);
}
@Override
public int getItemCount() {
return titles.length;
}
class ViewHolder extends RecyclerView.ViewHolder /*implements Inter*/{
ImageView itemImage;
TextView itemTitle;
TextView itemDetail;
ViewHolder( View itemView ){
super(itemView);
itemImage = itemView.findViewById (R.id.item_image);
itemTitle = itemView.findViewById (R.id.item_title);
itemDetail = itemView.findViewById (R.id.item_detail);
itemView.setOnClickListener (new View.OnClickListener () {
@Override
public void onClick ( View v ) {
int position = getAdapterPosition ();
position +=1;
Snackbar.make (v,"click on position" + titles[position],Snackbar.LENGTH_SHORT).setAction ("Action", null).show ();
}
});
}
}
}
String[] array = getResources().getStringArray(R.array.titles);
RecyclerAdapter adapter = new RecyclerAdapter(array);
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
private String[] titles;
RecyclerAdapter(String[] titles) {
this.titles = titles;
}
// ... rest of class
}