滚动

时间:2016-10-01 15:32:52

标签: android android-recyclerview

我已经看过无数的stackoverflow线程,但无法找到解决方案。所以我的问题是,当我通过我的回收站视图滚动时,数据会瞬间混淆,然后再次得到纠正。

这是我的适配器:

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 个答案:

答案 0 :(得分:2)

这可能不是你的解决方案,但你应该从不将int position参数作为final在onBindViewHolder(final int position)中,因为有回收者视图的状态位置适配器上的位置与布局管理器上的位置不匹配。相反,如果您想访问该职位,请使用以下方法:holder.getAdapterPosition()