ListView의 여러보기에 대한 사용자 정의 Android 어댑터가있는 ArrayIndexOutOfBoundsException


185

목록의 각 항목이 다른보기 (링크, 토글 또는 라디오 그룹)를 가질 수 있기 때문에 ListView에 대한 사용자 정의 어댑터를 만들려고하지만 ListView를 사용하는 활동을 실행하려고하면 오류가 발생합니다. 앱이 중지됩니다. 응용 프로그램은 Android 1.6 플랫폼을 대상으로합니다.

코드:

public class MenuListAdapter extends BaseAdapter {
 private static final String LOG_KEY = MenuListAdapter.class.getSimpleName();

 protected List<MenuItem> list;
 protected Context ctx;
 protected LayoutInflater inflater;

 public MenuListAdapter(Context context, List<MenuItem> objects) {
  this.list = objects;
  this.ctx = context;
  this.inflater = (LayoutInflater)this.ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 }

 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
  Log.i(LOG_KEY, "Position: " + position + "; convertView = " + convertView + "; parent=" + parent);
  MenuItem item = list.get(position);
  Log.i(LOG_KEY, "Item=" + item );

        if (convertView == null)  {
            convertView = this.inflater.inflate(item.getLayout(), null);
        }

        return convertView;
 }

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

 @Override
 public boolean isEnabled(int position) {
  return true;
 }

 @Override
 public int getCount() {
  return this.list.size();
 }

 @Override
 public MenuItem getItem(int position) {
  return this.list.get(position);
 }

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

 @Override
 public int getItemViewType(int position) {
  Log.i(LOG_KEY, "getItemViewType: " + this.list.get(position).getLayout());
  return this.list.get(position).getLayout();
 }

 @Override
 public int getViewTypeCount() {
  Log.i(LOG_KEY, "getViewTypeCount: " + this.list.size());
  return this.list.size();
 }

}

내가받는 오류 :

    java.lang.ArrayIndexOutOfBoundsException
  at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:3523)
  at android.widget.ListView.measureHeightOfChildren(ListView.java:1158)
  at android.widget.ListView.onMeasure(ListView.java:1060)
  at android.view.View.measure(View.java:7703)

응용 프로그램이 돌아 오는 것을 알고 있습니다. getView 모든 것이 순서대로 보인다는 것을 있습니다.

이것을 일으킬 수있는 것에 대한 아이디어가 있으면 감사하겠습니다.

감사,

-단


안녕 댄, getCount 당신의 ListView에 표시 할 총 요소가 있습니까 ??? public int getCount () {return this.list.size (); }
Jorgesys

4
그들은 덜 설명적인 오류 메시지를 내놓을 수 없었습니다 ...
JoeyJ

답변:


515

돌아 오는 아이템 뷰 타입

getItemViewType()입니다 >= getViewTypeCount().


24
이것은 불쾌합니다. 디버깅 할 방법이 없습니다. Romain Guy가 설명해 주셔서 감사합니다.
Yar

113

16
지금까지 답변에 대해 38 upvote를 얻었으므로 이것이 완벽한 답변이 될 수 있지만 문제를 설명하고 해결하는 방법에 대한 텍스트를 추가하십시오.
Chirag Patel

15
스 텀핑 된 사람들의 경우 ViewType은 0 기반 인덱스를 반환해야합니다. 예를 들어 (0, 1, 2 ...). 제 경우에는 ViewType에 R.layout을 재사용하려고했습니다. 내부적으로 ViewType의 값이 키가 아닌 재활용 풀의 색인으로 사용되고 있다고 생각합니다.
사무엘

2
평소와 같이 문서 에서이 중요한 titbit를 언급 할 수없는 Android 개발자와 달리이 오류를 설명해 주셔서 감사합니다.
WKS

17

허용 된 답변이 맞습니다. 이것이 내가 문제를 피하기 위해하고있는 일입니다.

public enum FoodRowType {
    ONLY_ELEM,
    FIRST_ELEM,
    MID_ELEM,
    LAST_ELEM
}

@Override
public int getViewTypeCount() {
    return FoodRowType.values().length;
}

@Override
public int getItemViewType(int position) {
    return rows.get(position).getViewType();  //returns one of the above types
}

getItemViewTypeint를 반환하지 않은 경우에만 좋을 수 있음
dVaffection

0

getItemType 값이 잘못되면 문제가 발생합니다. 이 값은 정수 여야하며 0에서 getViewTypeCount ()-1 사이 여야합니다.


-3

그 이유는 getItemViewType 메소드가 잘못된 값을 리턴하기 때문일 가능성이 높습니다! 목록보기의 각 행은 하나의보기입니다. getItemViewType을 스크롤링하는 동안 View의 수보다 많은 수에 도달합니다.

무엇을해야합니까? 문제를 피하는 방법?

먼저 목록보기에서 첫 번째로 표시되는보기 (행)를 결정하십시오.

    @Override
    public int getItemViewType(int position) {
        return choseType(position);//function to use modular equation
    }
    @Override
    public int getViewTypeCount() {
        return 10;
    }

이 예에서는 10 개의 뷰 (10 행)가 있습니다.

private  int choseType(int position){
    if(position%10==0)
        return 0;
    else if(position%10==1)
        return 1;
    else if(position%10==2)
        return 2;
    else if(position%10==3)
        return 3;
    else if(position%10==4)
        return 4;
    else if(position%10==5)
        return 5;
    else if(position%10==6)
        return 6;
    else if(position%10==7)
        return 7;
    else if(position%10==8)
        return 8;
    else
        return 9;


}

중대한

일부 사용자는 그 방법에 대한 다른 질문에 언급했습니다.

공개 int getViewTypeCount () 및 공개 int getItemViewType (int position)은 Tooglebutton과 같이 자동으로 스크롤링에서 상태 확인 true를 활성화합니다. 그것은 큰 잘못입니다 .

toogleButton.setChecked(false);

getView 대체 메소드에서.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.