【问题标题】:Gridview scrolling mystically behave after notifyDataSetChanged()在 notifyDataSetChanged() 之后,Gridview 滚动神秘地表现
【发布时间】:2017-07-13 17:05:52
【问题描述】:

我创建了一个 GridView,我在其中加载数据。数据有一个图像链接,我正在获取这个链接并将其放到 Picasso 以在 ImageView 中加载。 当我的 GridView 滚动结束时,我正在向适配器加载更多数据。 如果适配器数据有更多 40 项,则滚动工作很神秘。 当我停留在适配器的中间位置并尝试向上滚动时,适配器将我移动到第一个位置,所有图像都会自动刷新。 谁能帮帮我?

我的适配器:

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()。

标签: android gridview picasso


【解决方案1】:

您的图像刷新,因为您没有在 Picasso 加载图像中使用标签。应该是:

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

你可以在post阅读标签

为什么要设置holder.imageView.setImageDrawable(null);。您可以删除它并尝试。但是移动太快后的图像刷新非常简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多