2017-02-16 17 views
0

我想要實現這兩個單元格中鍵入我的應用程序的圖像和文字,讓我只是測試此列表視圖中,我的應用程序工作正常和完美的負載,但是當我開始TIS崩潰用下面的錯誤滾動安卓應用程序崩潰滾動時有2個不同細胞

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種不同的細胞類型?

任何想法,將不勝感激

+0

哪一行導致錯誤,你可以發佈烏爾完整的錯誤日誌 –

回答

1

解決您的問題,我想先澄清一些之前。在使用ArrayAdapter時,您不必將對象或上下文的列表存儲在自己中,因爲它是在創建適配器時爲您完成的。也就是說,像objectlist.get(position)這樣的每個呼叫都會是這樣的getItem(position),並且您只需撥打getContext即可獲取上下文。

現在讓我們來探討這個問題。根據documentationAdapter類中,getItemViewType(int position)方法具有0getViewTypeCount() - 1之間返回一個值。

代表視圖的類型的整數。如果可以在getView(int,View,ViewGroup)中將兩個視圖轉換爲另一個視圖,則兩個視圖應該共享相同的類型。注意:整數必須在0到getViewTypeCount() - 1之間。IGNORE_ITEM_VIEW_TYPE也可以被返回。

在你的代碼的問題是,你是返回一個佈局文件,這通常是一個非常大的數字的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; 
} 
+0

許多感謝名單的人,只有1件事做u認爲此代碼的最優化,甚至進行遠程數據? –

+0

通過遠程數據,你指的是從Web服務或類似的東西的數據? –