提问者:小点点

如果RecycerView数组位于数组字符串上,则为null


我正在研究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 ();


                }
            });
            }
    }
}

Mainactivity.java:

public class MainActivity extends AppCompatActivity {
    RecyclerView recycledView;
    RecyclerView.LayoutManager layoutManager;
    RecyclerView.Adapter adapter;

    @Override
    protected void onCreate ( Bundle savedInstanceState ) {
        super.onCreate (savedInstanceState);
        setContentView (R.layout.activity_main);
        Toolbar toolbar = findViewById (R.id.toolbar);
        setSupportActionBar (toolbar);

        recycledView = findViewById (R.id.recycle_View);
    layoutManager = new LinearLayoutManager (this);

    recycledView.setLayoutManager (layoutManager);
    adapter = new RecyclerAdapter ();
    recycledView.setAdapter (adapter);

    }

没什么特别的,而且效果很好。 我只是做了一点“最佳实践”的改动。 我想从这样的资源文件中获取标题数组:

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

所以我做了一些代码调整。。。 声明标题数组

public class RecyclerAdapter  extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {

    **private String[] titles;**

我在onCreateViewHolder方法中链接资源

View v = LayoutInflater.from (viewGroup.getContext ()).inflate (R.layout.index_layout, viewGroup,false);
        ViewHolder viewHolder = new ViewHolder (v);
        **Resources res = v.getResources ();
        titles=res.getStringArray (R.array.chapters);**

        return viewHolder;

但是当我运行应用程序时,我得到java.lang.NullPointerException:尝试在com.example.evenbook.recycleradapter.getItemCount(recycleradapter.java:55)中得到空数组的长度

中的数组为null

public int getItemCount() {
        return titles.length;
    }

如果我尝试返回5,它是可以的(它只显示5卡项目)。

我还认为getItemCount方法在onCreateViewHolder之前就开始了,但我认为这是不可能的。 怎么了? 提前致谢


共2个答案

匿名用户

尝试以下更改:

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 ();


                }
            });
        }
    }
}

匿名用户

您可以使用getResources().getStringArray从资源中获取数组

    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
}