2016-10-01 66 views
0

我已經看過無數有關此的stackoverflow線程,但找不到解決方案。所以我的問題是,當我滾動回到我的回收站視圖時,數據混淆了一瞬間,然後再次得到糾正。Android RecyclerView在滾動時混合數據

這裏是我的適配器:

class ListViewAdapter extends RecyclerView.Adapter<ListViewAdapter.ViewHolder> { 

private Typeface font; 
private Context context; 
private ArrayList<String> events; 
private VisitorAttendeesHandler visitorAttendeesHandler; 

ListViewAdapter(Typeface font, Context context, ArrayList<String> events) { 
    this.font = font; 
    this.context = context; 
    this.events = events; 
} 

class ViewHolder extends RecyclerView.ViewHolder { 
    View mView; 
    FrameLayout progressBar; 
    TextView event_title, event_date, event_time, event_address; 

    public ViewHolder(View itemView) { 
     super(itemView); 
     mView = itemView; 
     progressBar = (FrameLayout) mView.findViewById(R.id.progressBar); 
     event_title = (TextView) mView.findViewById(R.id.event_title); 
     event_date = (TextView) mView.findViewById(R.id.event_date); 
     event_time = (TextView) mView.findViewById(R.id.event_time); 
     event_address = (TextView) mView.findViewById(R.id.event_address); 
    } 

    void showProgressBar() { 
     progressBar.setVisibility(View.VISIBLE); 
    } 

    void hideProgressBar() { 
     progressBar.setVisibility(View.GONE); 
    } 

    void setClickListener(final String eid) { 
     mView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       int pos = getAdapterPosition(); 
       Intent intent = new Intent(context, EventInfoActivity.class); 
       intent.putExtra("eid", eid); 
       context.startActivity(intent); 

      } 
     }); 
    } 

    public void setAttendees(String eid) { 
     final ArrayList<User> attendeesList = new ArrayList<>(); 
     final TextView event_attendees = (TextView) mView.findViewById(R.id.event_attendees); 
     final ImageView statusBadge = (ImageView) mView.findViewById(R.id.statusBadge); 
     event_attendees.setTypeface(font); 

     visitorAttendeesHandler = new VisitorAttendeesHandler(eid, LoggedInUser.getInstance().getUid(), new VisitorAttendeesCallback() { 
      @Override 
      public void attendeeEventStatus(AttendeeStatus status) { 
       if (attendeesList.isEmpty()) event_attendees.setText("0"); 
       Log.e("STATUS - ", status.toString()); 
       switch (status) { 
        case APPROVED: 
         statusBadge.setVisibility(View.VISIBLE); 
         statusBadge.setImageDrawable(context.getResources().getDrawable(R.drawable.joined_badge)); 
         break; 
        case REJECTED: 
         statusBadge.setVisibility(View.VISIBLE); 
         statusBadge.setImageDrawable(context.getResources().getDrawable(R.drawable.rejected_badge)); 
         break; 
        case PENDING: 
         statusBadge.setVisibility(View.VISIBLE); 
         statusBadge.setImageDrawable(context.getResources().getDrawable(R.drawable.pending_badge)); 
         break; 
        default: 
         statusBadge.setVisibility(View.GONE); 
         break; 
       } 
      } 

      @Override 
      public void onUpdate(Map<String, AttendeeStatus> attendees, final AttendeesCallbackEvent trigger) { 
       for (Map.Entry e : attendees.entrySet()) { 
        if (e.getValue() == AttendeeStatus.APPROVED) { 
         CurrentUserListeners.getUserInfo(e.getKey().toString(), new UserFetchedCallback() { 
          @Override 
          public void ready(User user) { 
           if (trigger == AttendeesCallbackEvent.ADDED) { 
            attendeesList.add(user); 
            event_attendees.setText(Integer.toString(attendeesList.size())); 
           } else if (trigger == AttendeesCallbackEvent.REMOVED) { 
            attendeesList.remove(user); 
            event_attendees.setText(Integer.toString(attendeesList.size())); 
           } 
          } 
         }); 
        } 
       } 

       visitorAttendeesHandler.getAttendeeStatus(); 
      } 
     }); 

     visitorAttendeesHandler.subscribeToApprovedAttendees(); 
     visitorAttendeesHandler.getAttendeeStatus(); 

    } 

    public void setImage(String eid) { 
     final SimpleDraweeView draweeView = (SimpleDraweeView) mView.findViewById(R.id.my_image_view); 

     if (!eid.equals("")) { 
      EventPictureDao eventPictureDao = new EventPictureDaoImpl(eid); 
      eventPictureDao.getEventPhotos(new PhotosFetchedCallback() { 
       @Override 
       public void onPhotosReady(HashMap<String, String> photoURLs) { 
        if (photoURLs != null) { 
         GenericDraweeHierarchyBuilder builder = 
           new GenericDraweeHierarchyBuilder(context.getResources()); 
         GenericDraweeHierarchy hierarchy = builder 
           .setFadeDuration(300) 
           .setPlaceholderImage(context.getResources().getDrawable(R.drawable.no_photo_placeholder)) 
           .setPlaceholderImageScaleType(ScalingUtils.ScaleType.CENTER_CROP) 
           .setActualImageScaleType(ScalingUtils.ScaleType.CENTER_CROP) 
           .build(); 
         draweeView.setHierarchy(hierarchy); 

         for (Map.Entry e : photoURLs.entrySet()) { 
          draweeView.setImageURI(e.getValue().toString()); 
         } 

        } else { 
         draweeView.setImageResource(R.drawable.no_photo_placeholder); 
         draweeView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
        } 
       } 
      }); 
     } 
    } 
} 


@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View itemView = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.item_list_view, parent, false); 

    return new ViewHolder(itemView); 

} 

@Override 
public void onBindViewHolder(final ViewHolder holder, final int position) { 
    //holder.showProgressBar(); 
    EventDao eventDao = new EventDaoImpl(); 
    eventDao.getEventInfo(events.get(position), new EventFetchedCallback() { 
     @Override 
     public void onEventReady(Event event) { 
      holder.event_title.setText(event.getEventTitle()); 
      holder.event_date.setText(event.getStartDate()); 
      holder.event_time.setText(event.getStartTime()); 
      holder.setAttendees(events.get(position)); 
      holder.event_address.setText(event.getEventAddress()); 
      holder.setImage(events.get(position)); 
      holder.setClickListener(events.get(position)); 
      holder.hideProgressBar(); 
     } 
    }); 
} 

@Override 
public void onDetachedFromRecyclerView(RecyclerView recyclerView) { 
    super.onDetachedFromRecyclerView(recyclerView); 
    visitorAttendeesHandler.detachAllListeners(); 
} 

@Override 
public int getItemCount() { 
    return events.size(); 
} 

有人能解釋我爲什麼會這樣,什麼是實現回收視圖異步加載數據的正確方法?謝謝。

+1

我注意到你沒有任何調用'notifyDataSetChanged'或任何適配器通知*方法。我認爲這與它有關。 –

+0

每次在onBindViewHolder中都不要創建一個新的實例。你創建一次,從下次開始,你只需要使用notifyDataSetChanged()方法!它不會妨礙用戶界面或任何東西! –

回答

1

這可能不是你的解決方案,但你應該永遠的INT位置參數爲final的onBindViewHolder(final int position),因爲有回收圖,其中適配器上的位置不相匹配的狀態佈局管理器上的位置。相反,如果你想訪問的位置,使用此方法:holder.getAdapterPosition()