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

Android:使用2个不同单元格滚动列表视图时应用程序崩溃,android,listview,Android,Listview,我想在我的应用程序图像和文本中实现两个单元格类型,所以我只是在测试这个,我的应用程序工作正常,加载完美,但是当我开始滚动时,它崩溃了,出现以下错误 java.lang.ArrayIndexOutOfBoundsException: length=2; index=2130968624 这是我的适配器 public class myadapter extends ArrayAdapter<myobject> { Context context; List<

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

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 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);
}
public类MainActivity扩展了AppCompatActivity{
ListView LV;
List myobjectList=new ArrayList();
我的适配器我的适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LV=(ListView)findViewById(R.id.LV);
myobject myobject 1=新的myobject(1,“Teeeeexxxxt”,0);
myobject myobject2=新的myobject(2,null,R.mipmap.ic_启动器);
myobject myobject 3=新的myobject(1,“Teeeeexxxxt”,0);
myobject myobject 4=新的myobject(1,“Teeeeexxxxt”,0);
myobject myobject 5=新的myobject(2,null,R.mipmap.ic_启动器);
myobject myobject6=新的myobject(2,null,R.mipmap.ic_启动器);
myobject myobject 7=新的myobject(2,null,R.mipmap.ic_启动器);
myobject myobject 8=新的myobject(1,“Teeeeexxxxt”,0);
myobject myobject 9=新的myobject(1,“Teeeeexxxxt”,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=新的myadapter(这个,0,myobjectList);
LV.设置适配器(myadapter);
}
我真的不知道是什么导致了这个致命错误+我的实现被认为是2种不同细胞类型的最优化的方法?


在解决您的问题之前,我想首先澄清一些事情。使用
ArrayAdapter
时,您不必存储对象列表或上下文,因为它是在创建适配器时为您完成的。也就是说,像
objectlist.get(位置)这样的每个调用
类似于
getItem(position)
,要获取上下文,只需调用
getContext

现在让我们探讨一下这个问题。根据
Adapter
类,
getItemViewType(int位置)
方法必须返回一个介于
0
getViewTypeCount()-1
之间的值

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

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

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

    ViewHolder2 tvholder;
    ViewHolder ivholder;

    LayoutInflater inflater =(LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        switch (getItemViewType(position)) {
            case 0:
                convertView = inflater.inflate(R.layout.textcell, null);
                tvholder  = new ViewHolder2(convertView);
                tvholder.TV.setText(getItem(position).getText());
                convertView.setTag(tvholder);
                break;
            case 1:
                convertView = inflater.inflate(R.layout.imagecell, null);
                ivholder  = new ViewHolder(convertView);
                ivholder.IV.setImageResource(getItem(position).getImage());
                convertView.setTag(ivholder);
                break;
        }
    } else {
        switch (getItemViewType(position)) {
            case 0:
                tvholder = (ViewHolder2) convertView.getTag();
                tvholder.TV.setText(getItem(position).getText());
                break;
            case 1:
                ivholder = (ViewHolder) convertView.getTag();
                ivholder.IV.setImageResource(getItem(position).getImage());
                break;
        }
    }
    return convertView;
}

哪一行引起错误,你可以发布你的完整错误Logo Shanx man,仅仅1个更多的东西,你认为这个代码对于远程数据来说是最优化的吗?通过远程数据,你指的是来自Web服务的数据或类似的东西吗?
@Override
public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder2 tvholder;
    ViewHolder ivholder;

    LayoutInflater inflater =(LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        switch (getItemViewType(position)) {
            case 0:
                convertView = inflater.inflate(R.layout.textcell, null);
                tvholder  = new ViewHolder2(convertView);
                tvholder.TV.setText(getItem(position).getText());
                convertView.setTag(tvholder);
                break;
            case 1:
                convertView = inflater.inflate(R.layout.imagecell, null);
                ivholder  = new ViewHolder(convertView);
                ivholder.IV.setImageResource(getItem(position).getImage());
                convertView.setTag(ivholder);
                break;
        }
    } else {
        switch (getItemViewType(position)) {
            case 0:
                tvholder = (ViewHolder2) convertView.getTag();
                tvholder.TV.setText(getItem(position).getText());
                break;
            case 1:
                ivholder = (ViewHolder) convertView.getTag();
                ivholder.IV.setImageResource(getItem(position).getImage());
                break;
        }
    }
    return convertView;
}