2017-08-24 2 views
0

Ich benutze Parse-Server, um die App zu entwickeln, die RecyclerView verwendet, um Bildelemente anzuzeigen.Android RecyclerView angezeigtes Element geändert, wenn ich jedes Mal rauf und runter scrollte

aber das Problem ist, dass die in der Ansicht angezeigten Elemente jedes Mal, wenn ich scrollte, nach oben und unten geändert wurden.

Ich möchte wissen, was das Problem an meinem Code ist.

Wenn Sie die folgenden Bilder sehen, können Sie feststellen, dass die Elemente ihre Position ändern.

Ich habe versucht, Halter Bild Null werden, bevor Sie den Inhaber wieder anrufen. aber es funktioniert nicht. Ich denke, dass die Positionsnummer des Elements geändert wird, wenn ich den Artikel nennen again.but ich nicht die Ursache für die Situation

enter image description here enter image description here

RecyclerParseAdapter.java

public class MyTimelineAdapter extends RecyclerParseAdapter { 

private interface OnQueryLoadListener<ParseObject> { 

    public void onLoading(); 
    public void onLoaded(List<ParseObject> objects, Exception e); 

} 

private static ParseQueryAdapter.QueryFactory<ParseObject> queryFactory; 
private static List<OnQueryLoadListener<ParseObject>> onQueryLoadListeners; 
private static List<List<ParseObject>> objectPages; 
private static ArrayList<ParseObject> items; 
private static int currentPage; 


private static RequestManager requestManager; 


public MyTimelineAdapter(Context context, RequestManager requestManager) { 

    super(context); 
    this.requestManager = requestManager; 

    this.onQueryLoadListeners = new ArrayList<>(); 
    this.currentPage = 0; 
    this.objectPages = new ArrayList<>(); 
    this.items = new ArrayList<>(); 



    this.queryFactory = new ParseQueryAdapter.QueryFactory<ParseObject>() { 
     @Override 
     public ParseQuery<ParseObject> create() { 

      ParseQuery<ParseObject> query = ParseQuery.getQuery("ImageClassName"); 
      query.setCachePolicy(ParseQuery.CachePolicy.CACHE_THEN_NETWORK); 
      query.whereEqualTo("status", true); 
      query.orderByDescending("createdAt"); 

      return query; 
     } 
    }; 

    loadObjects(currentPage); 

} 



@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View timelineView; 

    timelineView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_timeline_item2, parent, false); 

    TimelineItemViewHolder timelineItemViewHolder = new TimelineItemViewHolder(timelineView); 

    return timelineItemViewHolder; 

} 



@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 

    final ParseObject timelineOb = getItem(position); 

    FunctionPost functionPost = new FunctionPost(context); 
    functionPost.TimelineArtistPostAdapterBuilder(timelineOb, holder, requestManager); 

    //기능 추가 

} 



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

@Override 
public ParseObject getItem(int position) { 
    return items.get(position); 
} 

@Override 
public void loadObjects(final int page) { 

    final ParseQuery<ParseObject> query = this.queryFactory.create(); 

    if (this.objectsPerPage > 0 && this.paginationEnabled) { 

     this.setPageOnQuery(page, query); 

    } 

    this.notifyOnLoadingListeners(); 


    if (page >= objectPages.size()) { 

     objectPages.add(page, new ArrayList<ParseObject>()); 

    } 


    query.findInBackground(new FindCallback<ParseObject>() { 
     @Override 
     public void done(List<ParseObject> foundObjects, ParseException e) { 

      if ((e != null) && ((e.getCode() == ParseException.CONNECTION_FAILED) || (e.getCode() != ParseException.CACHE_MISS))) { 

       hasNextPage = true; 

      } else if (foundObjects != null) { 

       // Only advance the page, this prevents second call back from CACHE_THEN_NETWORK to 
       // reset the page. 
       if (page >= currentPage) { 
        currentPage = page; 

        // since we set limit == objectsPerPage + 1 
        hasNextPage = (foundObjects.size() > objectsPerPage); 
       } 

       if (paginationEnabled && foundObjects.size() > objectsPerPage) { 
        // Remove the last object, fetched in order to tell us whether there was a "next page" 
        foundObjects.remove(objectsPerPage); 
       } 

       List<ParseObject> currentPage = objectPages.get(page); 
       currentPage.clear(); 
       currentPage.addAll(foundObjects); 
       syncObjectsWithPages(items, objectPages); 

       // executes on the UI thread 
       notifyDataSetChanged(); 

      } 

      notifyOnLoadedListeners(foundObjects, e); 


     } 
    }); 
} 


public void loadNextPage() { 

    if (items.size() == 0) { 

     loadObjects(0); 

    } else { 

     loadObjects(currentPage + 1); 

    } 
} 



public void syncObjectsWithPages(ArrayList<ParseObject> items, List<List<ParseObject>> objectPages) { 

    items.clear(); 

    for (List<ParseObject> pageOfObjects : objectPages) { 

     items.addAll(pageOfObjects); 

    } 
} 

protected void setPageOnQuery(int page, ParseQuery<ParseObject> query) { 

    query.setLimit(this.objectsPerPage + 1); 

    query.setSkip(page * this.objectsPerPage); 

} 

public void addOnQueryLoadListener(OnQueryLoadListener<ParseObject> listener) { 

    this.onQueryLoadListeners.add(listener); 

} 

public void removeOnQueryLoadListener(OnQueryLoadListener<ParseObject> listener) { 

    this.onQueryLoadListeners.remove(listener); 

} 

public void notifyOnLoadingListeners() { 

    for (OnQueryLoadListener<ParseObject> listener : this.onQueryLoadListeners) { 

     listener.onLoading(); 

    } 

} 

public void notifyOnLoadedListeners(List<ParseObject> objects, Exception e) { 

    for (OnQueryLoadListener<ParseObject> listener : this.onQueryLoadListeners) { 

     listener.onLoaded(objects, e); 

    } 

} 


} 

Antwort

0

finden Ich habe finde das Problem

Ich füge Overide-Methode in den Adapter, dann funktioniert es finden.

@Override 
public int getItemViewType(int position) { 
    return position; 
} 

Ich bin mir nicht sicher, warum es jetzt passiert. Kann mir jemand helfen, die Ursache des Problems zu erkennen?

0

Ich habe ein ähnliches Problem den anderen Tag siehe this post. onBindViewHolder muss wissen, wie die Zeile angezeigt wird, wenn sie aufgerufen wird. Ich habe je nach Bedarf in getItemViewType zwei verschiedene View-Typen zurückgegeben, den View-Typ in onCreateViewHolder bedingt aufgebläht, dann konnte ich die Daten im ViewHolder nach Bedarf setzen.

+0

danke ~ @Brian es ist wirklich hilfreich .. – ssamkyu

Verwandte Themen