3

다음은 예상대로 일부 HIDE THE VIEW가 작동하지ViewHolder는

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    // - get element from your dataset at this position 
    StatusItem item = mDataset.get(position); 
    //...... 
    //Add content and timing to the textview 
    String content = item.getContent(); 

    holder.mTextViewTime.setText(timing); 
    //Set the img 
    holder.imgViewIcon.setImageDrawable(item.getProfileDrawable()); 
    //Set content image (for Instagram) 
    holder.mImageViewContentPic.setImageDrawable(item.getContentDrawable()); 
    //HIDE THE VIEW Start 
    if(item.getContentDrawable() == null){ 
     holder.mImageViewContentPic.setVisibility(View.GONE); 
    } 
    //HIDE THE VIEW End 
} 

(MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> 내부) onBindViewHolder 내 코드의 일부입니다 위치합니다. 아래로 스크롤 할 때보기가 정상적으로 작동합니다. 그러나 위로 스크롤하여 이전보기를 다시 방문하면 VISIBLE 인 ImageView는 GONE이되지만 내 데이터 세트를 확인하고 수정되지 않았 음을 확인합니다. 뷰에서 다른 메서드를 호출하면 잘못된 결과가 나타납니다 (데이터 세트의 위치와 항목이 일치하지 않음).

보기 소유자가 RecyclerView의 특정 위치에 묶여 있지 않은 것 같습니다.

HIDE THE VIEW 부분을 제거하면 코드가 예상대로 작동합니다. 이 문제를 해결하고 내 경우보기를 동적으로 숨길 수있는 방법이 있습니까?

참고 : 일부 AsyncTasks를 사용하여 데이터 집합을 업데이트하고 notifyDataSetChanged() (관련있는 경우)을 호출합니다.

+0

ViewHolder는 위치와 관련이 없습니다. 즉 100 개의 항목이있는 경우 100 개의 ViewHolders가 없습니다. 위치에 대한 가시성을 대신 변경하려면 어댑터에서 bindView 메소드를 재정의하십시오 (정확한 이름은 기억이 안납니다). – harism

+0

'RecyclerView.Adapter'에서 그런 메소드를 찾을 수 없습니다. – paradite

답변

8
###This is the solution to your problem:### 

holder.mImageViewContentPic.setVisibility(View.VISIBLE); 
if(item.getContentDrawable() == null){ 
     holder.mImageViewContentPic.setVisibility(View.GONE); 
    } 
+0

고마워요. 이 작동합니다. 이것이 왜 효과가 있는지 더 설명 할 수 있습니까? – paradite

+0

뷰 홀더 패턴을 구현 한 경우입니다. 매번 동일한보기를 사용하거나보기를 재사용 할 수 있으므로보기가 사라지면 계속 표시되도록해야합니다. 이러한 재사용 가능한 견해를 다루는 많은 트릭이 있으며 가까운 장래에 찾을 수 있기를 바랍니다. –

+0

괜찮아요.'재사용 가능한 뷰 '에 대한 아이디어가 있다고 생각합니다. – paradite

0

RecyclerView 사용 재활용 아주 잘하기 때문에 어떤 속성이 잘못된 객체에 부착 당신이 경우 특정에 ViewHolder의 모든 속성을 필요로하므로, ViewHolder A는 ViewHolder B로 사용할 수있다.