【问题标题】:Can we get two return types from getItemCount() in RecyclerView?我们可以从 RecyclerView 中的 getItemCount() 获得两种返回类型吗?
【发布时间】:2018-08-03 22:50:56
【问题描述】:

这是我的代码。当我说返回 data1();它运行良好,但是当我尝试返回 data1() + data3();它给了我 indexOutofBound 异常,我不知道原因。有人可以帮我找出这个错误的原因吗?
这是我的 MainActivity 类代码

 String[] data={"ok","this"};
int []images_id = new int[2];
    for(int i=0; i<2; i++){
        images_id[i] = getResources().getIdentifier("drawable/"+"candy_"+i, null, getPackageName());
    }
    ArrayList ok=new ArrayList();
    for (int y=0;y<data.length;y++)
    {
         ok.add(data[y]);
    }
    recyclerView.setLayoutManager(new LinearLayoutManager(getParent()));
    RecyclerWorkclass recyclerWorkclass=new RecyclerWorkclass(this,data,images_id);
    recyclerView.setAdapter(recyclerWorkclass);

现在这是我的 RecyclerView 类代码

   ArrayList data1,data3;
Context context;
LayoutInflater inflater;
public RecyclerWorkclass(Context context,String[] dataoftext,int[] data2)
{
    inflater= LayoutInflater.from(context);
    this.context=context;
    data1=new ArrayList();
    data3=new ArrayList();
    for (int y=0;y<data2.length;y++)
    {
        this.data3.add(data2[y]);
    }
    for (int i=0;i<dataoftext.length;i++)
    {
        data1.add(dataoftext[i]);
    }
    Toast.makeText(context,"size is"+data3.size(),Toast.LENGTH_LONG).show();
}
@Override
public MyAdapter onCreateViewHolder(ViewGroup parent, int viewType) {
    View view=inflater.inflate(R.layout.recyclerwork_txt,parent,false);
    MyAdapter myAdapter=new MyAdapter(view);
    Toast.makeText(context,"view is "+viewType,Toast.LENGTH_LONG).show();
    return myAdapter;
}
@Override
public void onBindViewHolder(MyAdapter holder, int position) {
    holder.imageView.setImageResource((Integer) data3.get(position));
    holder.textView.setText((String)data1.get(position));
}
@Override
public int getItemCount() {
    return data1.size();
}
public class MyAdapter extends RecyclerView.ViewHolder {
    TextView textView;
    ImageView imageView;
    public MyAdapter(View itemView) {
        super(itemView);
        textView=itemView.findViewById(R.id.textview_phonecompany);
        imageView=itemView.findViewById(R.id.imageView2);}}
}

这段代码工作正常,但是当我说

return data1.size() + data3.size();

它显示索引超出范围错误。这是为什么呢?

【问题讨论】:

    标签: java android android-studio android-recyclerview


    【解决方案1】:

    是因为当您将data1.size() + data3.size() 放入getItemCount() 时,您与您的onBindViewHolder() 不相关,并且可以随时调用RecyclerView.Adapter Doc。

    当你的adapter 调用onBindViewHolder() 他抛出这个异常,因为这必须调用getItemCount() 方法并且你的两个列表不是getItemCount() 中声明的大小。

    说明

    @Override
    public void onBindViewHolder(MyAdapter holder, int position) {
       holder.imageView.setImageResource((Integer) data3.get(position));
       holder.textView.setText((String)data1.get(position));
    }
    

    在此position 将超过您的列表,因为您将大小加倍。所以当他尝试做data3.get(position)这个异常时追加。

    【讨论】:

    • 我很欣赏你的回答,但你能解释一下这个 getitemcount() 实际上如何帮助 recyclerview 建立一个视图。我的意思是你能解释一下 recyclerview getItemCount() 方法的生命周期
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-26
    相关资源
    最近更新 更多