1

J'ai un ArrayAdapter qui implémente OnScrollListener. La méthode OnScroll est appelée plusieurs fois, plus d'une fois la plupart du temps. Maintenant, le OnScrollChangedState n'est jamais appelé et je n'ai absolument aucune idée de pourquoi. J'ai lu quand il est appelé pour être appelé, et je n'ai pas ce comportement. Voici mon codeOnScrollChangedState non appelé

@Override 
public void onActivityCreated(Bundle savedInstanceState){ 
    super.onActivityCreated(savedInstanceState); 
    /* Some code */ 
    setNewListAdapter() 
    getListView().setOnScrollListener(movieListAdapter); 



}  








public class MovieListAdapter extends ArrayAdapter<Movie> implements AbsListView.OnScrollListener{ 

    private ImageView thumbnail; 
    private TextView title; 
    private RatingBar ratingBar; 
    private int currentFirstVisibleItem; 
    private int currentVisibleItemCount; 
    private int currentScrollState; 
    private int totalItemCount; 


    public MovieListAdapter(Context context, ArrayList<Movie> movies) { 
     super(context, 0, movies); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // Get the data item for this position 
     Movie movie = getItem(position); 
     // Check if an existing view is being reused, otherwise inflate the view 
     if (convertView == null) { 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.movie_list, parent, false); 
     } 
     // Lookup view 
     thumbnail = (ImageView) convertView.findViewById(R.id.film_cover); 
     title = (TextView) convertView.findViewById(R.id.movieTitle); 
     ratingBar = (RatingBar) convertView.findViewById(R.id.ratingBar); 
     // Populate the views 
     new ImageLoader(movie.getPoster_path(),thumbnail).execute(); 
     title.setText(movie.getTitle()); 
     ratingBar.setRating((float)movie.getVote_average()); 

     // Return the completed view to render on screen 
     return convertView; 
    } 

    private void updateData(){ 

     this.clear(); 

     for(Movie m : movieArrayList){ 
      this.insert(m,this.getCount()); 
     } 
    } 

    @Override 
    public void onScrollStateChanged(AbsListView view, int scrollState) { 
     this.currentScrollState = scrollState; 
     this.isScrollCompleted(); 
    } 

    /* Detect if the scroll has been completed*/ 
    private void isScrollCompleted() { 

     final int lastItem = currentFirstVisibleItem + currentVisibleItemCount; 

     if (this.currentScrollState == SCROLL_STATE_IDLE && lastItem == totalItemCount) { 
      listener.nextPage(++currentPage); 
      updateData(); // Refresh Movies List 
     } else if (this.currentScrollState == SCROLL_STATE_IDLE && (currentFirstVisibleItem + totalItemCount == totalItemCount)) { 
      listener.previousPage(--currentPage); 
      updateData(); // Refresh Movies List 
     } 

    } 

    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
     this.currentFirstVisibleItem = firstVisibleItem; 
     this.currentVisibleItemCount = visibleItemCount; 
     this.totalItemCount = totalItemCount; 
    } 
} 

Merci d'avance les gars. Tout commentaire est apprécié

Répondre

1

Je suppose que vous avez fait une erreur logique ici, pouvez-vous essayer de remplacer comme ci-dessous et vérifier si cela fonctionne?

lastItem == totalItemCount 

à

lastItem == totalItemCount - 1 

et même remplacer

currentFirstVisibleItem + totalItemCount == totalItemCount 

à

currentFirstVisibleItem + totalItemCount == totalItemCount - 1 
+0

Non, je l'ai droit. Le problème n'est pas là. C'est le callback Android qui ne fonctionne pas correctement. – Greggz

+0

Donc, vous avez essayé de mettre un journal en dehors des conditions de la fonction onScrollStateChange, vous êtes sûr? – himanshu1496

+0

La méthode IsScrollCompleted() n'est même pas appelée, car OnStateChanged ne l'est pas. – Greggz