2013-10-30 68 views
0

我正在使用自定義適配器從JSON字符串中加載20個項目以及在第4和第14位執行廣告。我遇到的是,當我滾動查看項目#19時,它與標題中的錯誤一起崩潰。java.lang.IndexOutOfBoundsException:索引20無效,大小爲20

我知道錯誤是說它試圖訪問不在數組中的索引,但我認爲這是因爲它包含在索引中的adViews(它不應該)。我覺得這很簡單,但我很想失望,但請幫忙。這裏是我的2個適配器:

public class ListViewAdapter extends BaseAdapter implements AdListener { 

private final Activity activity; 
private final BaseAdapter delegate; 

public ListViewAdapter(Activity activity, BaseAdapter delegate) { 
    this.activity = activity; 
    this.delegate = delegate; 
} 

@Override 
public int getCount() { 
    // Total count includes list items and ads. 
    return delegate.getCount() + 2; 
} 

@Override 
public Object getItem(int position) { 
    // Return null if an item is an ad. Otherwise return the delegate item. 
    if (isItemAnAd(position)) { 
     return null; 
    } 
    return delegate.getItem(position - 1); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (isItemAnAd(position)) { 
     if (convertView instanceof AdView) { 
      return convertView; 
     } else { 
      AdView adView = new AdView(activity, AdSize.SMART_BANNER,"AD ID (removed for post)"); 
      AdRequest adRequest = new AdRequest(); 
      adView.loadAd(adRequest); 
      return adView; 
     } 
    } else { 
     return delegate.getView(position-1, convertView, parent); 
    } 
} 

@Override 
public int getViewTypeCount() { 
    return delegate.getViewTypeCount() + 1; 
} 

@Override 
public int getItemViewType(int position) { 
    if (isItemAnAd(position)) { 
     return delegate.getViewTypeCount(); 
    } else { 
     return delegate.getItemViewType(getOffsetPosition(position)); 
    } 
} 

@Override 
public boolean areAllItemsEnabled() { 
    return false; 
} 

@Override 
public boolean isEnabled(int position) { 
    return (!isItemAnAd(position)) && delegate.isEnabled(getOffsetPosition(position)); 
} 

private boolean isItemAnAd(int position) { 
    // Place an ad at the first and last list view positions. 
    return (position == 4 || position == 14); 
} 

@Override 
public void onDismissScreen(Ad arg0) { 
} 

@Override 
public void onFailedToReceiveAd(Ad arg0, AdRequest.ErrorCode arg1) { 
} 

@Override 
public void onLeaveApplication(Ad arg0) { 
} 

@Override 
public void onPresentScreen(Ad arg0) { 
} 

@Override 
public void onReceiveAd(Ad arg0) { 

} 

private int getOffsetPosition(int position) { 
    return position - 1; 
} 

}

這裏的自定義適配器,其設置列表視圖:

class CustomMovieAdapter extends BaseAdapter { 

    private ArrayList<SearchResults> searchArrayList; 

    private LayoutInflater mInflater; 

    public CustomMovieAdapter(Context context, ArrayList<SearchResults> results){ 

     searchArrayList = results; 
     mInflater = LayoutInflater.from(context); 
    } 


    @Override 
    public int getCount() { 
     return searchArrayList.size()+2; 
    } 

    @Override 
    public Object getItem(int position) { 
     return searchArrayList.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = new ViewHolder(); 

      if(convertView == null){ 
       convertView = mInflater.inflate(R.layout.list_item, null); 
       holder = new ViewHolder(); 

       assert convertView != null; 
       holder.txtRating = (TextView) convertView.findViewById(R.id.movieRating); 
       holder.txtMovieName = (TextView) convertView.findViewById(R.id.movieName); 
       holder.txtMovieSize = (TextView) convertView.findViewById(R.id.movieSize); 
       holder.txtImdbRating = (TextView) convertView.findViewById(R.id.imdbScore); 
       convertView.setTag(holder); 
      } else { 
       holder = (ViewHolder) convertView.getTag(); 
      } 

      holder.txtRating.setText(searchArrayList.get(position+1).getRating()); 
      holder.txtMovieName.setText(searchArrayList.get(position+1).getName()); 
      holder.txtMovieSize.setText(searchArrayList.get(position+1).getSize()); 
      holder.txtImdbRating.setText(searchArrayList.get(position+1).getImdbRating()); 

     return convertView; 

    } 
    class ViewHolder { 

     TextView txtRating; 
     TextView txtMovieName; 
     TextView txtMovieSize; 
     TextView txtImdbRating; 
    } 
} 

回答

1
@Override 
public int getCount() { 
    // Total count includes list items and ads. 
    return delegate.getCount() + 2; 
} 

你應該返回的數據集的大小,而不改變它。如果您需要顯示更多項目,請將其添加到數據集中。改變它與

@Override 
public int getCount() { 
    // Total count includes list items and ads. 
    return delegate.getCount() ; 
} 

應該修復你的異常。

編輯,在getView你應該避免篡改的位置Android是爲您提供:

position+1 
+0

如果我刪除了+2,應用程序崩潰的負載以下內容:產生的原因:顯示java.lang.NullPointerException at com.halcyonsystems.nzbtrend.ShowTopMovies $ CustomMovieAdapter.getCount(ShowTopMovies.java:227) at com.halcyonsystems.nzbtrend.ListViewAdapter.getCount(ListViewAdapter.java:30) – AutomationEngineer1982

相關問題