Android:ViewPaper动态添加移除第一页

问题:

动态改变itemList之后,调用notifyDataSetChanged();没有作用。

原因:

原因是PagerAdapter内部的getItemPosition方法获取的值是固定POSITION_UNCHANGED,表示未改变,所以不更新。

解决:

要更新则重写这个方法,返回POSITION_NONE。那么调用notifyDataSetChanged()方法每个界面都会更新。如果是动态添加移除最后一页,那么前面所有item是不需要更新的,就会造成资源浪费。这里我是动态添加移除第一页,其他每页都会前移一页,所以每项item都是有改变的,所以需要所有都更新,我这边就直接返回POSITION_NONE了。如需求不同可根据getItemPosition方法传进来的object参数(实际上就是itemList里面的view)判断是否需要更新来返回不同值。

完整参考代码:

java 复制代码
public class MyAdapter extends PagerAdapter {

        private final List<View> itemList;

        public MyAdapter(List<View> list) {
            this.itemList = list;
        }

        public void addToFirst(View view) {
            if (itemList != null && !itemList.isEmpty()) {
                View currentView = itemList.get(0);
                if (currentView != null && currentView == view) {
                    return;
                }
                itemList.add(0, view);
                notifyDataSetChanged();
            }
        }

        public boolean isFirstView(View view) {
            if (itemList != null && !itemList.isEmpty()) {
                return itemList.get(0) == view;
            }
            return false;
        }

        public void removeFirstItem() {
            if (itemList != null && !itemList.isEmpty()) {
                itemList.remove(0);
                notifyDataSetChanged();
            }
        }

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

        @NonNull
        @Override
        public Object instantiateItem(@NonNull ViewGroup container, int position) {
            View view = itemList.get(position);
            container.addView(itemList.get(position));
            return view;
        }

        @Override
        public int getItemPosition(@NonNull Object object) {
            return POSITION_NONE;
        }

        @Override
        public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
            if (object instanceof View){
                container.removeView((View) object);
            }
        }

        @Override
        public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
            return view == o;
        }
    }
相关推荐
不急不躁1233 小时前
Android16 GTS GtsPermissionTestcases 测试,跳过权限检查
android
符哥20085 小时前
关于用Android Compose开发成不成熟的分析
android·android jetpack
蜗牛、Z5 小时前
Android 蓝牙/Wi-Fi通信协议之:蓝牙扫描ScanCallback详解
android
黄昏晓x5 小时前
Linux----进程控制
android·linux·运维
我是阿亮啊5 小时前
android中事件分发机制
android·事件分发·事件分发机制
心前阳光6 小时前
Unity 模拟父子关系
android·unity·游戏引擎
2501_915106326 小时前
当 Perfdog 开始收费之后,我重新整理了一替代方案
android·ios·小程序·https·uni-app·iphone·webview
多多*6 小时前
2月3日面试题整理 字节跳动后端开发相关
android·java·开发语言·网络·jvm·adb·c#
习惯就好zz8 小时前
[Android/Linux] 实战记录:利用 Kconfig 精确控制 i.MX8MM 特定 DTB 的编译生成
android·linux·dts·dtb·lunch·多卡板配置
踏雪羽翼8 小时前
android 解决混淆导致AGPBI: {“kind“:“error“,“text“:“Type a.a is defined multiple times
android·java·开发语言·混淆·混淆打包出现a.a