2017-02-23 10 views
0

私はデータをロードするGridViewを作成しました。データに画像リンクがあります。このリンクを取得し、ImageViewで読み込むためにPicassoに配置します。 GridViewのスクロールが終了すると、アダプタにさらにデータがロードされます。 アダプタデータに40以上のアイテムがある場合、スクロールは神秘的です。 アダプターの中央に留まってスクロールアップしようとすると、アダプターが1位に移動し、すべての画像が自動的に更新されます。 誰か助けてくれますか?Gridviewのスクロールは神秘的にnotifyDataSetChanged()の後に動作します

MyAdapter:

public class GridArrayAdapter extends BaseAdapter { 
private static final String URL_SITE = "some url"; 
private List<Movie> movies = new ArrayList<>(); 
private Context context; 


public GridArrayAdapter(Context context, List<Movie> model) { 
    super(); 
    this.movies = model; 
    this.context = context; 

} 

public void addMovies(List<Movie> newMovies){ 
    this.movies.addAll(newMovies); 
    notifyDataSetChanged(); 
} 

@Override 
public int getCount() { 
    return movies.size(); 
} 

@Override 
public Object getItem(int position) { 
    return position; 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(final int position, View convertView, final ViewGroup parent) { 
    Holder holder; 
    if(convertView == null) { 
     convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false); 
     holder = new Holder(); 
     holder.imageView = (ImageView) convertView.findViewById(R.id.thumbnail); 
     convertView.setTag(holder); 

    } else { 
     holder = (Holder) convertView.getTag(); 
     holder.imageView.setImageDrawable(null); 
    } 
    com.squareup.picasso.Picasso 
      .with(context) 
      .load(URL_SITE + movies.get(position).getPosterPath()) 
      .into(holder.imageView); 

    return convertView; 
} 
class Holder{ 
    ImageView imageView; 
}} 

スクロールコード:

 gridView.setOnScrollListener(new AbsListView.OnScrollListener() { 
     private boolean canScroll = false; 
     @Override 
     public void onScrollStateChanged(AbsListView view, int scrollState) { 
      if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) { 
       canScroll = false; 
      } else if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_FLING || 
        scrollState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) { 
       canScroll = true; 
      } 
     } 

     @Override 
     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
      if(firstVisibleItem + visibleItemCount == filmArray.size()&& canScroll) { 
       canScroll = false; 
       getPage(currentPage); 
      } 
     } 
    }); 

} 

取得データ:

private void getPage(Integer page){ 
    Call<Result> callPage = service.getPopularPage(++page, MovieDBApi.API_KEY); 
    callPage.enqueue(new Callback<Result>() { 
     @Override 
     public void onResponse(Call<Result> call, retrofit2.Response<Result> response) { 
      currentPage = response.body().getPage(); 
      adapter.addMovies(response.body().getResults()); 
     } 

     @Override 
     public void onFailure(Call<Result> call, Throwable t) { 
      Log.d("onFailure", "Fail"); 
     } 
    }); 
} 
+1

onScrollStateChanged()でコードを削除します。スクロール状態を制御する必要はありません。リストの最後のスクロールを認識し、getPage()を呼び出すだけで済みます。 – nnn

答えて

0

あなたのイメージリフレッシュあなたはピカソローディング画像にタグを使用していないため。次のようになります。

com.squareup.picasso.Picasso 
      .with(context) 
      .load(URL_SITE + movies.get(position).getPosterPath()) 
      .tag(context) 
      .into(holder.imageView); 

あなたがholder.imageView.setImageDrawable(null);を設定しないのはなぜこのpost

にタグ付け読むことができます。削除して試すことができます。しかし、あなたがあまりにも速く動いた後にイメージが爽やかになるのはとても簡単です。

関連する問題