当前位置: 首页 > 知识库问答 >
问题:

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

尤俊誉
2023-03-14

我正在研究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个答案

汤英豪
2023-03-14

您可以使用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
}


陈嘉荣
2023-03-14

尝试以下更改:

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


                }
            });
        }
    }
}
 类似资料:
  • 我正在尝试用python、ecrypt数据记录音频原始数据并将其发送到。NET服务器,我在其中解密接收到的数据并转换为字节数组。当我将接收到的数据转换为字节数组时,就像这样的编码。ASCII码。GetBytes(decryptedData)一切都很正常。但最大字节值为63,发送数据的最大字节值为255。发送和接收数据的示例: 发送数据 3, 0, 3, 0, 3, 0, 4, 0, 4, 0, 2

  • 问题内容: 我正在查询PostgreSQL数据库中的表。结果集使用表名查找所有列名,类型以及它是否可为空(主键“ id”除外)。这是正在使用的查询: 对于每个结果,我都有一个字符串数组,并且我尝试使用ResultSet方法来避免循环遍历结果。我想将返回的数组存储在字符串数组中,但出现类型不匹配错误 有没有一种方法可以将SQL Array对象转换或转换为String []? 相关代码: 问题答案:

  • 我正在查询<code>information_schema。我的PostgreSQL数据库中的columns</code>表。结果集使用表名查找所有列名、类型以及是否可以为空(主键“id”除外)。这是正在使用的查询: 我为每个结果都有一个字符串数组,我正尝试使用ResultSet方法来避免结果循环。我想将返回的数组存储在字符串数组中,但出现类型不匹配错误 是否有方法将SQL Array对象转换或类

  • 问题内容: 因此基本上,用户是从扫描仪输入中输入序列。 等等。 它可以是任意长度,并且必须是整数。 我想将输入的字符串转换为整数数组。 所以会,就等 有什么提示和想法吗?我正在考虑实现获取先前的编号并将它们解析在一起,并将其应用于数组中的当前可用插槽。但是我不太确定如何编写代码。 问题答案: 您可以从扫描仪中读取整个输入行,然后将其分开,然后得到一个,将每个数字解析为与索引一对一匹配的…(假设输入

  • 问题内容: 我有一个一维String数组,我想将其转换为一维字节数组。我该怎么做呢?这需要ByteBuffer吗?我怎样才能做到这一点?(字符串可以是任意长度,只想知道如何执行这样的操作。将其转换为字节数组后,如何将其转换回String数组? -担 问题答案: 数组到数组 ,应该 手动 将其转换为两边,但是如果只有一个String,则可以和; 像这样 对于string []中的一个字节[],您必须

  • 问题内容: 我需要将结果集转换为字符串数组。我正在从数据库中读取电子邮件地址,我需要能够像这样发送它们: 这是我的阅读电子邮件地址的代码: MyOutput是: 我需要这样: 我正在使用Oracle 11g。 问题答案: 获得所需的输出: 替换这些行 通过

  • 问题内容: 我正在尝试找到一种将String拆分为String数组的方法,并且每当遇到白色香料时就需要对其进行拆分,例如 “嗨,我是保罗” 进入” “嗨”“我”“保罗” 如何使用RegularExpression在split()方法中表示空格? 问题答案: 您需要一个正则表达式,例如,这意味着: 每当遇到至少一个空格时就进行拆分 。完整的Java代码是:

  • 问题内容: 我正在使用Swift 3,并且需要与C API进行交互,例如,C API接受以NULL终止的字符串列表 在Swift中,API的导入方式如下 在尝试使用类型转换数百次后,我还是无法完成这项工作。即使我传递通过编译的有效指针,它也会在运行时崩溃,提示无效的内存访问(在strlen函数中)。还是关于ARC的东西? 问题答案: 您可以像如何通过使用char **参数将Swift字符串数组传递