Android:使用2个不同的单元格滚动列表视图时应用程序崩溃

时间:2017-02-16 14:26:34

标签: android listview

我想在我的应用程序中实现两个单元格类型图像和文本,所以我只是测试它,我的应用程序工作正常并加载完美但是当我开始滚动时出现以下错误

java.lang.ArrayIndexOutOfBoundsException: length=2; index=2130968624

这是我的适配器

  public class myadapter extends ArrayAdapter<myobject> {

    Context context;
    List<myobject> objectlist;


    public myadapter(Context context, int resource, List<myobject> objects) {
        super(context, resource, objects);
        this.context = context;
        this.objectlist = objects;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder2 tvholder;
        ViewHolder ivholder;

        LayoutInflater inflater =(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if (getItemViewType(position) == R.layout.textcell){

            if(convertView==null){
                convertView= inflater.inflate(getItemViewType(position),parent,false);
                tvholder= new ViewHolder2(convertView);
                convertView.setTag(tvholder);
            }else{
                tvholder = (ViewHolder2)convertView.getTag();
            }
            tvholder.TV.setText(objectlist.get(position).getText());
        }else{
            if(convertView==null){
                convertView= inflater.inflate(getItemViewType(position),parent,false);
                ivholder = new ViewHolder(convertView);
                convertView.setTag(ivholder);
            }else{
               ivholder=(ViewHolder) convertView.getTag();
            }
            ivholder.IV.setImageResource(objectlist.get(position).getImage());
        }
        return convertView;
    }

    @Override
    public int getViewTypeCount() {
        return 2;
    }

    @Override
    public int getItemViewType(int position) {
        if(objectlist.get(position).getType()==1){
            return R.layout.textcell;

        }else{
            return R.layout.imagecell;
        }
    }

}
class ViewHolder{
    ImageView IV;

    public ViewHolder(View view){
        IV = (ImageView)view.findViewById(R.id.IV);


    }

}
class ViewHolder2{

    TextView TV;
    public ViewHolder2(View view){

        TV = (TextView)view.findViewById(R.id.TV);

    }

}

我的对象:

public class myobject {

    int type;
    String Text;
    int Image;
    public myobject(){
        this.type = 0;
        this.Text = null;
        this.Image = 0;
    }
    public myobject(int type,String Text,int Image){
        this.type=type;
        this.Image = Image;
        this.Text = Text;
    }
    public int getType(){ return type;}
    public String getText (){return Text;}
    public int getImage (){return Image;}
}

在主要活动中使用:

public class MainActivity extends AppCompatActivity {

ListView LV;
List<myobject> myobjectList = new ArrayList<>();
myadapter myadapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    LV = (ListView) findViewById(R.id.LV);
    myobject myobject1 = new myobject(1,"teeeeeexxxxt",0);
    myobject myobject2 = new myobject(2,null,R.mipmap.ic_launcher);
    myobject myobject3 = new myobject(1,"teeeeeexxxxt",0);
    myobject myobject4 = new myobject(1,"teeeeeexxxxt",0);
    myobject myobject5 = new myobject(2,null,R.mipmap.ic_launcher);
    myobject myobject6 = new myobject(2,null,R.mipmap.ic_launcher);
    myobject myobject7 = new myobject(2,null,R.mipmap.ic_launcher);
    myobject myobject8 = new myobject(1,"teeeeeexxxxt",0);
    myobject myobject9 = new myobject(1,"teeeeeexxxxt",0);
    myobjectList.add(myobject1);
    myobjectList.add(myobject2);
    myobjectList.add(myobject3);
    myobjectList.add(myobject4);
    myobjectList.add(myobject5);
    myobjectList.add(myobject6);
    myobjectList.add(myobject7);
    myobjectList.add(myobject8);
    myobjectList.add(myobject9);
    myadapter = new myadapter(this,0,myobjectList);
    LV.setAdapter(myadapter);
}

我真的不知道导致这个致命错误的原因是什么?我的实现是否被认为是2种不同细胞类型的最优化方法?

任何想法都会非常感激

1 个答案:

答案 0 :(得分:1)

在解决你的问题之前,我想先澄清一下。使用ArrayAdapter时,您不必存储对象列表或上下文,因为在创建适配器时会为您完成。话虽如此,objectlist.get(position)之类的每个电话都会像getItem(position)一样,为了获得上下文,您只需拨打getContext

现在让我们来探讨这个问题。根据{{​​1}}类documentationAdapter方法必须返回getItemViewType(int position)0之间的值。

  

表示View类型的整数。如果可以在getView(int,View,ViewGroup)中将一个视图转换为另一个视图,则两个视图应共享相同的类型。注意:整数必须在0到getViewTypeCount()的范围内 - 1.还可以返回IGNORE_ITEM_VIEW_TYPE。

您的代码中的问题是您返回布局文件的getViewTypeCount() - 1,这通常是一个非常大的数字,因此抛出id。 一个可能的解决方案是返回IndexOutOfBounds而不是您当前返回的内容。在此之后,可以更改getItem(position).getType() - 1方法以匹配不同的布局和视图持有者。

getView