zoukankan      html  css  js  c++  java
  • Android开发 ViewPager删除Item后,不会更新数据和View

    问题描述: 

      在使用ViewPager的适配器删除适配器里一个Item后依然会,而删除的这个item依然会保留缓存,适配器不会重新加载更新数据.如下代码:

    public class TReleaseCircleZoomablePagerAdapter extends PagerAdapter {
        private List<TReleaseCircleBase.Pic> mImageUrlList = new ArrayList<>();
    
    
        public void removeItem(int position){
            mImageUrlList.remove(position);
            notifyDataSetChanged();
    
        }
    
    //....略

    在这个代码里removeItem(int position)是希望清理适配器List里的一项item,并且重新刷新.但是其实真实情况是并不会重新刷新...... 在滑动超过3个页面后才会让你那个删除item消失.

    解决办法:

    依然在这个适配器里重写public int getItemPosition(@NonNull Object object)方法

    public class TReleaseCircleZoomablePagerAdapter extends PagerAdapter {
        private List<TReleaseCircleBase.Pic> mImageUrlList = new ArrayList<>();
    
        public void removeItem(int position){
            mImageUrlList.remove(position);
            notifyDataSetChanged();
    
        }
    
    
        @Override
        public int getItemPosition(@NonNull Object object) {
    //        return super.getItemPosition(object);
            return POSITION_NONE;
        }
    
    //略......

    注意关键点是返回 POSITION_NONE

    为什么呢?

      为什么我改了这个之后就可以在删除item后更新view了呢?好奇心害死猫,我们进一步探究一下.

      首先我们看看 return super.getItemPosition(object); 父类里写的返回值到底里面有啥

      

        /**
         * 在主视图尝试确定项目的位置时调用
         * 已经改变。 如果给定的位置,则返回{@link #POSITION_UNCHANGED}
         * 如果适配器中不再存在该项,则item未更改或{@link #POSITION_NONE}。
         *
         * <p>The default implementation assumes that items will never
         * change position and always returns {@link #POSITION_UNCHANGED}.
         *
         * @param object Object representing an item, previously returned by a call to
         *               {@link #instantiateItem(View, int)}.
         * @return object's new position index from [0, {@link #getCount()}),
         *         {@link #POSITION_UNCHANGED} if the object's position has not changed,
         *         or {@link #POSITION_NONE} if the item is no longer present.
         */
        public int getItemPosition(@NonNull Object object) {
            return POSITION_UNCHANGED;
        }

    很好上面的意思是

    如果视图item已经是加载过的,就使用 POSITION_UNCHANGED 来标识,表示这个item不需要重复更新

    如果item在适配器里不存在,就说item未加载过,就使用 POSITION_NONE 来标识,标识这个item需要更新一次

    接着继续探究下ViewPager是怎么调用getItemPosition()的

    void dataSetChanged() {
            // This method only gets called if our observer is attached, so mAdapter is non-null.
    
            final int adapterCount = mAdapter.getCount();
            mExpectedAdapterCount = adapterCount;
            boolean needPopulate = mItems.size() < mOffscreenPageLimit * 2 + 1
                    && mItems.size() < adapterCount;
            int newCurrItem = mCurItem;
    
            boolean isUpdating = false;
            for (int i = 0; i < mItems.size(); i++) {
                final ItemInfo ii = mItems.get(i);
                final int newPos = mAdapter.getItemPosition(ii.object);
    
                if (newPos == PagerAdapter.POSITION_UNCHANGED) {
                    continue;
                }
    
                if (newPos == PagerAdapter.POSITION_NONE) {
                    mItems.remove(i);
                    i--;
    
                    if (!isUpdating) {
                        mAdapter.startUpdate(this);
                        isUpdating = true;
                    }
    
                    mAdapter.destroyItem(this, ii.position, ii.object);
                    needPopulate = true;
    
                    if (mCurItem == ii.position) {
                        // Keep the current item in the valid range
                        newCurrItem = Math.max(0, Math.min(mCurItem, adapterCount - 1));
                        needPopulate = true;
                    }
                    continue;
                }
    上面的if (newPos == PagerAdapter.POSITION_UNCHANGED)if (newPos == PagerAdapter.POSITION_NONE) 就已经破案了...,只能说google真会写方法名称...

  • 相关阅读:
    Java 并发专题 :FutureTask 实现预加载数据 在线看电子书、浏览器浏览网页等
    Excel里的单元格提行
    Ubuntu各版本的历史发行界面
    CentOS常用命令、快照、克隆大揭秘
    虚拟网络编辑器的知识和出现的一些问题(没有VMnet0或VMnet8)
    CentOS图形界面下如何安装Eclipse和使用maven
    Hadoop MapReduce编程 API入门系列之mr编程快捷键活用技巧详解(四)
    Hadoop MapReduce概念学习系列之mr程序详谈(二十三)
    Hadoop MapReduce概念学习系列之mr的Shuffle(二十二)
    Hadoop MapReduce概念学习系列之JobTracker、ResourceManager、Task Tracker、NodeManager(二十一)
  • 原文地址:https://www.cnblogs.com/guanxinjing/p/11099708.html
Copyright © 2011-2022 走看看