2016-06-19 2 views
-1

내 배열 목록에있는 항목에 따라 두 가지 항목 뷰를 표시하려고합니다. 조건없이 (if) 아무런 문제가 없지만 조건을 넣을 때 2 개의 viewHolders를 처리해야하므로 viewHolder가 viewHolder로 캐스팅 될 수 없다는 오류가 발생합니다.viewHolder를 viewHolder에서 캐스팅 할 수 없습니다.

@Override 
public View getView(int position, View view, ViewGroup parent) { 

    bind(getItem(position), view); 

    return view; 
} 


private void bind(final Eddystone eddystone, final View view) { 

     List<Content> contents = ... ; 

     if(contents.get(i).content_type_id==2){ 

      ViewHolder holder = (ViewHolder) view.getTag(); 
      // some code here 
     } 
     else { 

      ViewHolderVideo holder = (ViewHolderVideo) view.getTag(); 
      // some code here 
     } 

} 

오류가 (다른 조건에서) 두 번째 홀더에 :

여기 내 코드입니다.

조건을 제거하면 (else) 완벽하게 작동하며이 코드가 작성된 클래스는 어댑터입니다.

어떤 도움을 주셔서 감사합니다.

감사합니다 :)

답변

1

문제 ListView에 잘못된 행을 재활용이다. 현재 ListView는 행 유형이 두 가지 이상 있다고 말하지 않았기 때문에 모든 행이 동일하다고 생각합니다.

어댑터가 getItemViewType()getViewTypeCount()을 구현해야합니다. 이 두 메서드는 ListView에 행 유형 수와 어떤 행 유형이 해당 위치에 해당하는지 알려주므로 올바른 행 뷰를 재활용 할 수 있습니다. 당신의 anwser에 대한

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    int type = getItemViewType(position); 
    if (type == VIEW_TYPE_VIDEO) { 
     return buildVideoRow(position, convertView, parent); 
    } else if (type == VIEW_TYPE_DEFAULT) { 
     return buildDefaultRow(position, convertView, parent); 
    } 
    return null; // or throw an IllegalStateException, because something is wrong if you get here. 
} 

private View buildVideoRow(int position, View convertView, ViewGroup parent) { 
    VideoViewHolder holder; 
    if (convertView != null) { 
     holder = (VideoViewHolder) convertView.getTag(); 
    } else { 
     convertView = ... // inflate row here 
     // set the tag, etc. 
    } 
    ... // bind views here 
    return convertView; 
} 

private View buildDefaultRow(int position, View convertView, ViewGroup parent) { 
    // similar implementation as buildVideoRow() 
} 
+0

감사 :

private static final int VIEW_TYPE_DEFAULT = 0; private static final int VIEW_TYPE_VIDEO = 1; @Override public int getViewTypeCount() { return 2; } @Override public int getItemViewType(int position) { // return a value between zero (inclusive) and the total item type count (exclusive) if (contents.get(position).content_type_id == 2) { return VIEW_TYPE_VIDEO; } return VIEW_TYPE_DEFAULT: } 

당신은 다시 getView()의 내부보기 유형을 확인할 수 있습니다 : 당신이 게시 한 내용

, 당신의 구현은 아마도 다음과 같을 것입니다 감안할 이해하지만, 내 코드의 문제는 내용 목록이 CallBack()에서 시작되므로 contents.get (i)가있는 getItemVIewType에서 null 참조 예외가 발생합니다. 목차 목록은 콜백의 onSuccess 메소드 내부의 buildVideoRow에서 시작됩니다./이것을 해결하는 방법은 있습니까? –

+0

@AymaneBo 목록에 표시하기 전에 데이터를 먼저로드하거나 행 유형을 결정하고 나머지를 나중에로드 할 수있는 부분을로드하십시오. 목록 작성자는 목록을로드 할 책임이 없습니다. ListView를 새로 고치려면 필요하다면'notifyDataSetChanged()'를 호출하여 Activity 나 Fragment에서 그것을 수행 한 다음로드 된 목록을 어댑터로 전달하십시오. – Karakuri

관련 문제