Java 如果在数组字符串上,则RecyclerView数组为null

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",

我正在研究Android回收视图,我发现了这个例子

回收适配器

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
}