programing

목록 보기에서 여러 보기를 위한 사용자 지정 Android 어댑터가 포함된 ArrayIndexOfBoundsException

codeshow 2023. 8. 10. 21:43
반응형

목록 보기에서 여러 보기를 위한 사용자 지정 Android 어댑터가 포함된 ArrayIndexOfBoundsException

목록의 각 항목이 다른 보기(링크, 토글 또는 라디오 그룹)를 가질 수 있기 때문에 ListView에 대한 사용자 지정 어댑터를 만들려고 하는데 ListView를 사용하는 Activity를 실행하려고 하면 오류가 발생하고 앱이 중지됩니다.이 애플리케이션은 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모든 것이 잘 되어가는 것 같습니다.

무엇이 원인이 될 수 있는지에 대한 아이디어는 감사하겠습니다.

감사해요.

-댄

반환할 항목 보기 유형

getItemViewType()이라>= getViewTypeCount().

받아들여진 답이 맞습니다.이 문제를 피하기 위해 제가 하고 있는 일은 다음과 같습니다.

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
}

getItem 시 문제 발생형식 값이 잘못되었습니다.이 값은 정수여야 하며 getView를 사용하려면 0에서 시작해야 합니다.Count()-1을 입력합니다.

그 이유는 getItemView 때문일 가능성이 높습니다.형식 메서드가 잘못된 값을 반환하고 있습니다!목록 보기의 각 행은 단일 보기입니다.스크롤하는 동안 ItemView 가져오기reach를 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;


}

중요한

일부 사용자가 스택 오버플로에 대한 다른 질문에 해당 방법을 언급했습니다.

공용 게이트 보기TypeCount() 및 Google 버튼과 같은 public integtItemViewType(위치 내) 수정은 스크롤 시 상태 확인 True를 자동으로 활성화합니다.그것은 큰 잘못입니다.만약 당신이 스크롤에 자동 엔발레를 원하지 않는다면 그냥 하세요.

toogleButton.setChecked(false);

on getView 재정의 메서드입니다.

언급URL : https://stackoverflow.com/questions/2596547/arrayindexoutofboundsexception-with-custom-android-adapter-for-multiple-views-in

반응형