2016-06-06 2 views
1

RecyclerView.ViewHolder에 대한 내보기를 프로그래밍 방식으로 작성하기 때문에 onCreateViewHolder에 어떤보기도 전달할 필요가 없지만 super를 호출하면 충돌합니다 이 오류 :RecyclerView.ViewHolder에 null보기를 전달하면 슈퍼를 호출 할 때 응용 프로그램이 중단됩니다.

 @Override 
    public ImagePreviewViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     return new ImagePreviewViewHolder(null); 
    } 


protected class ImagePreviewViewHolder extends RecyclerView.ViewHolder { 
    public LinearLayout page; 
    public ImageView imageView; 

    public ImagePreviewViewHolder(View itemView) { 
     super(itemView); // HERE IT CRASHES 
     page = createPage(); 
     imageView = createImageView(); 
     page.addView(imageView); 
    } 
} 

@DanailAlexiev, 당신이 무엇을 의미하는지 이것이다 : 여기

IllegalArgumentException: itemView may not be null 

몇 가지 코드

@Override 
    public ImagePreviewViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     LinearLayout page = createPage(); 
     ImageView imageView = createImageView(); 
     page.addView(imageView); 
     return new ImagePreviewViewHolder(page); 
    } 

protected class ImagePreviewViewHolder extends RecyclerView.ViewHolder { 

    LinearLayout page; 
    ImageView imageView; 

    public ImagePreviewViewHolder(View itemView) { 
     super(itemView); 
     page = (LinearLayout) itemView; 
     imageView = (ImageView) page.getChildAt(0); 
    } 
} 

답변

2

ViewHolder은 내부적으로 itemView 참조를 사용합니다. null 일 수 없습니다.

당신이해야 할 일은보기 생성 논리를 onCreateViewHolder()으로 옮기고 작성한보기를 ViewHolder 인스턴스로 전달하는 것입니다.

+0

Ive가 귀하의 기술을 따르는 코드로 내 질문을 업데이트했습니다. 귀하가 의미 한 바를 확인할 수 있습니까? –

+0

감사합니다. 3 분 안에 답을 수락합니다. –

+0

@ J.K. Yope, 이것이 내가 의미했던 것입니다. –

1

요점은 앞에을 입력해야합니다. 을 보유 할 수 있습니다. 팩토리 메소드를 사용하십시오.

static class ImagePreviewViewHolder extends RecyclerView.ViewHolder { 
    public LinearLayout page; 
    public ImageView imageView; 

    public static ImagePreviewViewHolder create(ViewGroup parent) { 
     // Option 1: Inflate the view hierarchy. 
     final Context context = parent.getContext(); 
     final LayoutInflater inflater = LayoutInflater.from(context); 
     final View view = inflater.inflate(R.layout.my_item_layout, parent, false); 
     return new ImagePreviewViewHolder(view); 
    } 

    public ImagePreviewViewHolder(View itemView) { 
     super(itemView); 
     page = (LinearLayout) itemView.findViewById(R.id.page); 
     imageView = (ImageView) itemView.findViewById(R.id.image); 
    } 
} 

이 예제는 프로그래밍 방식으로 뷰를 만들 때 필요에 맞게 조정할 수 있습니다.

가장 가까운 Context을 사용하는 것과 같은 건강한 습관을 강요하는 클래스의 static 수정 자에 유의하십시오.

+0

프로그래밍 방식으로 내 견해를 생성 할 때 풍선을 배치 할 레이아웃이 없기 때문에 빈 부모를 전달했습니다 –

+0

@ J.K. 뷰 홀더 생성자에서 부모를 전달하지 않아도됩니다. 부모는'RecyclerView'입니다. 항목을 나타내는보기를 전달해야합니다. –

관련 문제