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