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();
}
誰かが私の理由は、この起こっているとリサイクルビューローディング非同期データを実装するための適切な方法は何で説明できますか?ありがとう。
「notifyDataSetChanged」またはアダプタのnotify *メソッドへの呼び出しがないことに気付きました。私はそれがそれと関係があると思う。 –
onBindViewHolderのたびに新しいインスタンスを作成しないでください。あなたは一度だけ作成し、次回からはnotifyDataSetChanged()メソッドを使用してください!それはUIや何かを妨げることはありません! –