Android - 自定义ArrayAdapter

2023-12-02

有人可以帮我解决我的问题吗? 我仍在尝试与DraggingListView and ArrayAdapter。 现在我想实现删除元素listview通过点击,但是当我制作时:

StableArrayAdapter.this.notifyDataSetChanged();

i get nullPointer Exception ...

这是我的适配器:

public class StableArrayAdapter extends ArrayAdapter<Product> {

    final int INVALID_ID = -1;
    LayoutInflater lInflater;
    Context ctx;
    public static final String PREFS_NAME = "com.shvedchenko.skleroshop";
    public static final String PREFS_THEME = "theme";

    HashMap<Product, Integer> mIdMap = new HashMap<Product, Integer>();

    public StableArrayAdapter(Context context, int textViewResourceId, List<Product> prod) {
        super(context, textViewResourceId, /*objects*/prod);
        lInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        ctx = context;
        for (int i = 0; i < prod.size(); ++i) {
            mIdMap.put(prod.get(i), i);
        }
    }


    // пункт списка
    @Override
    public View getView(final int position, View convertView, final ViewGroup parent) {
        // используем созданные, но не используемые view
        View view = convertView;
        if (view == null) {
            view = lInflater.inflate(R.layout.item, parent, false);
        }

        Product p = getItem(position);

        SharedPreferences pref = ctx.getSharedPreferences(PREFS_NAME, ctx.MODE_PRIVATE);
        int theme = pref.getInt(PREFS_THEME, 0);             // getting Integer

        if(theme == 0)
            ((TextView) view.findViewById(R.id.tvDescr)).setTextColor(Color.WHITE);
        else
            ((TextView) view.findViewById(R.id.tvDescr)).setTextColor(Color.BLACK);

        ((TextView) view.findViewById(R.id.tvDescr)).setText(p.getProductName());
        ((ImageView) view.findViewById(R.id.ivImage)).setImageResource(p.getProductImage());

        ImageView iv = (ImageView)view.findViewById(R.id.ivImage);
        iv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mIdMap.remove(getItem(position));
                System.out.println("FROM CLICK -- " + mIdMap.size() );
                /*for( Product p : mIdMap.keySet() ) {
                    System.out.println( p.getProductName() );
                }*/
                //StableArrayAdapter.this.notifyDataSetChanged();
            }
        });

        return view;
    }

    /*@Override
    public Object getItem(int position) {
        return mIdMap.get(position);
    }*/


    @Override
    public long getItemId(int position) {
        if (position < 0 || position >= mIdMap.size()) {
            return INVALID_ID;
        }
        Product item = (Product) getItem(position);
        return mIdMap.get(item);
    }

    @Override
    public boolean hasStableIds() {
        return true;
    }

}

这是错误:

08-26 08:50:58.902 2167-2167/com.shvedchenko.skleroshop E/AndroidRuntime:致命异常:main java.lang.NullPointerException 在 com.shvedchenko.skleroshop.StableArrayAdapter.getItemId(StableArrayAdapter.java:104) 在 android.widget.AdapterView.rememberSyncState(AdapterView.java:1195) 在 android.widget.AdapterView$AdapterDataSetObserver.onChanged(AdapterView.java:810) 在 android.widget.AbsListView$AdapterDataSetObserver.onChanged(AbsListView.java:5958) 在 android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37) 在 android.widget.BaseAdapter.notifyDataSetChanged(BaseAdapter.java:50) 在 android.widget.ArrayAdapter.notifyDataSetChanged(ArrayAdapter.java:286) 在 com.shvedchenko.skleroshop.StableArrayAdapter$1.onClick(StableArrayAdapter.java:85) 在 android.view.View.performClick(View.java:4204) 在 android.view.View$PerformClick.run(View.java:17355) 在 android.os.Handler.handleCallback(Handler.java:725) 在 android.os.Handler.dispatchMessage(Handler.java:92) 在 android.os.Looper.loop(Looper.java:137) 在 android.app.ActivityThread.main(ActivityThread.java:5041) 在 java.lang.reflect.Method.invokeNative(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:511) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 在dalvik.system.NativeStart.main(本机方法)

/UPDATED/

我现在的适配器:

public class StableArrayAdapter extends ArrayAdapter<Product> {

    final int INVALID_ID = -1;
    LayoutInflater lInflater;
    Context ctx;
    public static final String PREFS_NAME = "com.shvedchenko.skleroshop";
    public static final String PREFS_THEME = "theme";

    HashMap<Product, Integer> mIdMap = new HashMap<Product, Integer>();
    ArrayList<Product> prods = new ArrayList<Product>();

    public StableArrayAdapter(Context context, int textViewResourceId, List<Product> prod) {
        super(context, textViewResourceId, /*objects*/prod);
        lInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        ctx = context;
        for (int i = 0; i < prod.size(); ++i) {
            mIdMap.put(prod.get(i), i);
            prods.add(i,prod.get(i));
        }
    }


    // пункт списка
    @Override
    public View getView(final int position, View convertView, final ViewGroup parent) {
        // используем созданные, но не используемые view
        View view = convertView;
        if (view == null) {
            view = lInflater.inflate(R.layout.item, parent, false);
        }

        Product p = getItem(position);

        SharedPreferences pref = ctx.getSharedPreferences(PREFS_NAME, ctx.MODE_PRIVATE);
        int theme = pref.getInt(PREFS_THEME, 0);             // getting Integer

        if(theme == 0)
            ((TextView) view.findViewById(R.id.tvDescr)).setTextColor(Color.WHITE);
        else
            ((TextView) view.findViewById(R.id.tvDescr)).setTextColor(Color.BLACK);

        ((TextView) view.findViewById(R.id.tvDescr)).setText(p.getProductName());
        ((ImageView) view.findViewById(R.id.ivImage)).setImageResource(p.getProductImage());

        ImageView iv = (ImageView)view.findViewById(R.id.ivImage);
        iv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                prods.remove(position);
                StableArrayAdapter.this.notifyData(prods);

            }
        });

        return view;
    }

    public void notifyData(List<Product> prod) {

        //First of all Clear Map
        mIdMap.clear();
        for (int i = 0; i < prod.size(); ++i) {
            mIdMap.put(prod.get(i), i);
        }

        notifyDataSetChanged();
    }


    @Override
    public long getItemId(int position) {
        if (position < 0 || position >= mIdMap.size()) {
            return INVALID_ID;
        }
        Product item = (Product) getItem(position);
        return mIdMap.get(item);
    }

    @Override
    public boolean hasStableIds() {
        return true;
    }

}

/ERROR/

08-26 09:53:19.270 2530-2530/com.shvedchenko.skleroshop E/AndroidRuntime:致命异常:主要 java.lang.NullPointerException 在 com.shvedchenko.skleroshop.StableArrayAdapter.getItemId(StableArrayAdapter.java:122) 在 android.widget.AdapterView.rememberSyncState(AdapterView.java:1195) 在 android.widget.AdapterView$AdapterDataSetObserver.onChanged(AdapterView.java:810) 在 android.widget.AbsListView$AdapterDataSetObserver.onChanged(AbsListView.java:5958) 在 android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37) 在 android.widget.BaseAdapter.notifyDataSetChanged(BaseAdapter.java:50) 在 android.widget.ArrayAdapter.notifyDataSetChanged(ArrayAdapter.java:286) 在 com.shvedchenko.skleroshop.StableArrayAdapter.notifyData(StableArrayAdapter.java:112) 在 com.shvedchenko.skleroshop.StableArrayAdapter$1.onClick(StableArrayAdapter.java:91)

我做错了什么?

提前TNX!


适配器的正确代码:

public class StableArrayAdapter extends ArrayAdapter<Product> {

    final int INVALID_ID = -1;
    LayoutInflater lInflater;
    Context ctx;
    public static final String PREFS_NAME = "com.shvedchenko.skleroshop";
    public static final String PREFS_THEME = "theme";

    HashMap<Product, Integer> mIdMap = new HashMap<Product, Integer>();

    public StableArrayAdapter(Context context, int textViewResourceId, List<Product> prod) {
        super(context, textViewResourceId, /*objects*/prod);
        lInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        ctx = context;
        for (int i = 0; i < prod.size(); i++) {
            mIdMap.put(prod.get(i), i);
        }
    }


    // пункт списка
    @Override
    public View getView(final int position, View convertView, final ViewGroup parent) {
        // используем созданные, но не используемые view
        View view = convertView;
        if (view == null) {
            view = lInflater.inflate(R.layout.item, parent, false);
        }

        Product p = getItem(position);

        SharedPreferences pref = ctx.getSharedPreferences(PREFS_NAME, ctx.MODE_PRIVATE);
        int theme = pref.getInt(PREFS_THEME, 0);             // getting Integer

        if(theme == 0)
            ((TextView) view.findViewById(R.id.tvDescr)).setTextColor(Color.WHITE);
        else
            ((TextView) view.findViewById(R.id.tvDescr)).setTextColor(Color.BLACK);

        ((TextView) view.findViewById(R.id.tvDescr)).setText(p.getProductName());
        ((ImageView) view.findViewById(R.id.ivImage)).setImageResource(p.getProductImage());

        ImageView iv = (ImageView)view.findViewById(R.id.ivImage);
        iv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                StableArrayAdapter.this.remove(getItem(position));
                StableArrayAdapter.this.notifyDataSetChanged();
            }
        });

        return view;
    }


    @Override
    public long getItemId(int position) {
        if (position < 0 || position >= mIdMap.size()) {
            return INVALID_ID;
        }
        Product item = (Product) getItem(position);
        return mIdMap.get(item);
    }

    @Override
    public boolean hasStableIds() {
        return true;
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android - 自定义ArrayAdapter 的相关文章

  • 从 Gradle 将 url 添加到 BuildConfig 文件

    我的BuildConfig是由Gradle生成的 我的字符串之一是 URL 当我尝试创建 apk 时 出现以下错误 在网址中 有什么想法我应该告诉 gradle 才能正常工作吗 这是我告诉 Gradle 的 buildConfigField
  • Android SQLite 数据库从查询中删除重复项

    我是 SQLite 新手 我使用此查询是为了从特定用户的列中提取所有行 Cursor c db query true TABLE COLUMN USER user null null null null null 这是表格的示例 group
  • 改造中如何使用HashMap发布数据?

    您能解释一下如何使用以下方式发布数据吗hashmap in 改造2 这就是我发的帖子 FormUrlEncoded POST getProfile Call
  • 使用 android 将图像上传到 Flickr

    我需要将 Flickr 与 android 集成 我已完成身份验证 我需要将图像上传到 flickr 但我不知道如何执行相同操作 我参考文件 http www flickr com services api upload api html
  • Android 上的多处理

    我一直在 Android 上执行一些测试 以验证并行化算法 如 FFT 的性能可以提高多少 我通过使用带有 JNI FFTW 的 pthread 和 Java 线程 来自 JTransforms 来实现这些算法 我没有像预期那样通过使用线程
  • 按钮点击和声音之间的延迟

    我不太明白为什么按钮点击和声音之间有延迟 以下是我的代码 button Button findViewById R id playBtn final MediaPlayer playButtonClick MediaPlayer creat
  • Context.startForegroundService 然后没有调用Service.startForeground

    这是我的 BroadcastReciever 类 该类处理启动电话状态 Code public class BroadCastRecieverBoot extends BroadcastReceiver Override public vo
  • 如何设计Android建筑物室内地图? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想设计一个 Android 应用程序 它可以帮助学生和其他人在特定建筑物 一层 中导航 显示前往教室的步行方向 我需要帮助 这是您通
  • Android Volley:意外响应代码 405

    我的 Android Volley JsonObjectRequest 遇到 onErrorResponse 并出现以下问题 BasicNetwork performRequest Unexpected response code 405
  • 将 React Native 应用程序嵌入到现有的 ios/android 应用程序中

    我需要知道是否可以在现有的 ios android 应用程序中 嵌入 一个 React Native 应用程序 而不共享 React Native 应用程序代码 我们目前有一个 React Native 应用程序 它使用一些插件依赖项 并被
  • SDK 管理器缺少模拟器的旧版 Android 系统映像

    我刚刚重新安装了 ADT 捆绑包 20130522 和 Android Studio 因为我的 eclipse 安装再次搞砸了 但那是另一个故事了 在任一版本中 当我启动 SDK Manager 时 都没有任何 2 2 的系统映像 只有 2
  • Google play APK 上传错误重复权限声明

    我尝试上传新的 apk 使用我自己的发布密钥存储签名 并在 google play 开发者控制台中收到以下错误 重复的许可声明 android permission ACCESS COARSE LOCATION 与不同 maxSdkVers
  • 使用audioSessionId值实例化AudioFx类?

    我已经阅读了 Android API 并尝试在互联网上搜索有关声明自定义audioSessionId然后用它audioSessionId初始化 AudioFx 类并为我的 MediaPlayer 或 AudioTrack 分配硬编码audi
  • 在 Unity 中构建 apk 应用程序时包含文件

    在unity中构建apk文件时如何将文件和文件夹添加到apk文件中 我需要的是在Android上安装应用程序后 在应用程序的父目录 android data com company product files 中存在一些文件和文件夹 这是我
  • 我怎样才能实现CoverFlow视图[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想用点线布局实现溢出视图 目前我正在使用 polidea 封面流库 URL github https
  • Android 10 中没有设备筛选器的 USB_DEVICE_ATTACHED

    我正在开发一个 Android 应用程序 它在清单中为 BroadcastReceiver 注册了四个意图过滤器 这些都是 android hardware usb action USB DEVICE ATTACHED android ha
  • React Native v0.71.8 React-native-vector-icons 你看不到的图标

    我在用react native版本v0 71 8 我安装了react native vector icons库 但图标未显示 似乎链接在最新版本的 React Native 中不再起作用 所以我按照说明进行操作 但它不再编译 出现以下错误
  • 如何在捆绑中存储稀疏数组

    我有一个SparseArray
  • 地理围栏不可用以及如何处理

    我正在 Android 上使用地理围栏 它在大多数手机上都工作正常 但在其中一些上 它不起作用 在我的错误日志中显示 地理围栏不可用 某些用户没有为 Google Play 服务启用位置跟踪 我认为这就是地理围栏在他们的手机上不起作用的原因
  • 布局聊天气泡问题:TextView 占满整个屏幕

    我正在研究泡泡聊天 我使用具有两种布局的适配器 一种用于传入消息 另一种用于我的消息 适配器工作正常 我的问题在于传入布局 无法很好地显示传入时间文本 当消息文本增长时 会填满屏幕的整个宽度 并隐藏消息时间的文本 第一个问题 如何才能实现这

随机推荐

  • 绘制堆积条形图?

    我有以下数据 structure list Time c 1L 1L 1L 1L 1L 1L 1L 1L 1L 1L 1L 1L 2L 2L 2L 2L 2L 2L 2L 2L 2L 2L 2L 2L 3L 3L 3L 3L 3L 3L 3
  • 从“int”到“char *”的转换无效

    我想编写一个程序 该程序将从文本文件中读取并使用结构存储文本文件中的内容 然后重新组合并打印出文本文件中的信息 但我遇到了问题getline 我试着写getline像这样 getline infile info name 但它不起作用 我还
  • 设置 HTML 表单文本区域的值?

    我正在使用以下内容来设置文本区域的值 br b Description b br
  • SQLite3 中的外键支持

    根据this从 2010 年开始 EnforceFKConstraints 连接字符串属性应该在 SQLite 的未来版本中实现 有谁知道开发商是否已经开始这样做了 如果没有 是否有另一种方法可以启用外键支持 而无需在每个连接上执行 PRA
  • 用于 Spring 配置的 Hibernate OGM 提供程序

    我创建了一个Java应用程序 可以使用SQL Server或Neo4j作为数据库 而无需触及应用程序层 我只需修改提供程序和连接信息 如下所示
  • 就在我以为我终于理解了 Javascript 范围的时候

    我遇到了一些事情 这说明我显然还没有明白 谁能解释一下为什么 this 的值会在下面发生变化 var MyFunc function alert this var innerFunc function alert this innerFun
  • C# - 如何确定 Type 是否为数字

    有没有办法确定给定的 Net 类型是否是数字 例如 System UInt32 UInt16 Double都是数字 我想避免使用很长的开关盒Type FullName 试试这个 Type type object GetType bool i
  • 如何在 php docker 镜像中安装 pdo 驱动程序?

    我使用作为基础php docker 容器带有标签 php 5 6 apache 我将它与基本的mysql 5 6我可以在主机上找到的图像mysql 我创建了一个数据库 并用基本值填充了一个表 然而尝试访问我的应用程序时 我得到 Fatal
  • (Git) 当当前分支中有大量更改时,将修复提交到不同分支的最实用方法是什么?

    这是场景 您正在功能分支上工作 您创建了几个新文件 移动了一些文件并更改了其他几个文件 在处理一些不是您编写的代码时 您注意到并立即修复了一个错误 或者 您注意到某个功能缺少文档 因此您可以快速为下一个开发人员添加一些专业提示 然后 您意识
  • 检测硬盘是否正在被访问

    我正在尝试制作一个非常简单的硬盘访问监视器像那些根据驱动器使用情况闪烁的嵌入式 LED 一样工作 那个 LED 确实对我很有帮助 但我使用的笔记本电脑没有它 因此 我制作了一个简单的托盘图标应用程序 但我不知道如何确定磁盘访问的变量 我搜索
  • mysql 服务器无法启动 MAMP

    我在这里读过一些答案 这些答案说当你的 mysql 服务器无法在 MAMP 中启动时 你应该运行 sudo killall 9 mysqld 我过去曾使用过它 它确实有效 但无论出于何种原因 这次它不起作用 我在日志中收到此错误消息 04
  • 如何从 ActiveRecord 中的事务中排除模型?

    我有一个特殊情况的模型 它不能成为外部事务的一部分 Outer Transaction do Inner create blah end 假设 Inner 不知道它正在被拉入哪个特定交易 我如何阻止 Inner 成为交易的一部分 例如 创建
  • 整理和重塑凌乱的数据集(重塑/收集/联合功能)?

    按照我之前的问题 R 重塑 收集功能以创建准备进行多级分析的数据集 我发现它有点复杂 我的数据集实际上比我希望的 更混乱 完整的故事如下 我有一个很大的数据集 有 240 个案例 每行都是一个病例 乳腺癌患者 在数据集末尾的某个地方 比如从
  • 对于大图像,UIImage imageNamed 是否仍然会导致 iOS 4 上的内存问题?

    我发现了几篇内存管理文章提到UIImage s imageNamed当内存中有很多大图像时会引起问题 http akosma com 2009 01 28 10 iphone memory management tips http www
  • Cocoa forControlEvents:WHATGOESHERE

    在 Cocoa Objective C 中 如果我以编程方式创建了一个按钮 我应该为我的控制事件添加什么 btnMakeChar addTarget self action selector makeChar forControlEvent
  • jQuery:删除结束标签

    有没有办法使用 jQuery 删除单个结束 HTML 标签 Example div class one div class two CONTENT div div 我必须删除最后一个 这意味着 div one 关闭后的关闭 div 标签 不
  • Dynamics 356 v9 - 将executionContext.getFormContext() 与 HTML Web 资源结合使用

    我们如何使用的任何想法executionContext getFormContext 使用 HTML 网络资源 唯一有效的方法是parent Xrm Page现在已弃用 我们仍在使用parent Xrm Page and parent Xr
  • 如何使用枚举或任何其他方式在java中构建类别的层次结构树?

    假设我们有一组类别 categories A B 再假设A包含子类别 A1 A2 A3 B包含子类别 B1 B2 此外 还有更多子类别如下 对于A1 A1a A1b 对于A2 A2a A2b 对于 A3 A3a A3b A3c 对于 B1
  • 如果上面的单元格值较低,则将单元格颜色为红色

    我需要一个用于 Google 电子表格的公式 脚本来执行此操作 如果当前单元格值高于上方单元格中的值 则当前单元格背景为红色 如果小于或等于则保留白色 如下所示 IF C34 gt B34 make background red leave
  • Android - 自定义ArrayAdapter

    有人可以帮我解决我的问题吗 我仍在尝试与DraggingListView and ArrayAdapter 现在我想实现删除元素listview通过点击 但是当我制作时 StableArrayAdapter this notifyDataS