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