设置场景
我目前有完全相同的问题。我有一个带有布局充气机的自定义适配器的完美工作代码,使用以下格式parent
and false
作为第二个和第三个参数。
由于代码运行良好,没有混淆,我有足够的信心忽略 stackoverflow 上有关的所有问题和回复null
由于错误使用 Android API 而返回视图。
如果您也遇到了没有混淆的问题,请忽略此答案和问题并继续!检查这些问题 https://stackoverflow.com/questions/10204262/nullpointerexception-in-custom-adapter-getview
我将尽力在这个答案中报告我的发现。这个答案可能会随着时间的推移而增长。跳到底部的结论如果您渴望了解最新消息。
快速而肮脏的解决方案
这里直接的解决方案是更新您的混淆器配置,以排除您的代码在混淆后失败的类。
在你的 proguard 配置文件中应该是这样的:
-keep class * extends your.company.secret.package
有关 proguard 的更多信息请开始查看此处 http://developer.android.com/tools/help/proguard.html。还要确保您至少拥有 Android 项目所需的最低限度的 proguard 配置文件。检查这个例子 http://code.google.com/p/google-gson/source/browse/trunk/examples/android-proguard-example/proguard.cfg.
映射回您的源代码
在研究这个问题时,您可能会对混淆之前该类的原始名称感兴趣。这应该会让事情变得容易得多。您可以在项目的 bin 文件夹中的 mapping.txt 文件的 proguard 文件夹中找到此映射。
/bin/proguard/mapping.txt
固定到以下代码行
就我而言,我能够确定以下代码行的错误。这些行仅出现在发生故障的适配器中,而其他代码在工作适配器中是常见的。以下所有代码都是getView(final int position, View convertView, final ViewGroup parent):View
method
holder.layout.removeAllViews();
TextView tView;
for (final String text : mItems.getTextList()) {
tView = new TextView(mContext);
tView.setTextSize(14);
tView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
tView.setText(text);
holder.layout.addView(tView);
}
如果我只是删除addView()
and removeAllViews()
打电话比一切顺利。
安卓源代码
我的第一个想法是检查该行代码的源代码。我在堆栈跟踪中找到了以下点。
11-20 14:19:40.709: E/AndroidRuntime(22236): FATAL EXCEPTION: main
11-20 14:19:40.709: E/AndroidRuntime(22236): Process: your.company.secret.package, PID: 22236
11-20 14:19:40.709: E/AndroidRuntime(22236): java.lang.NullPointerException
11-20 14:19:40.709: E/AndroidRuntime(22236): at android.widget.AbsListView.obtainView(AbsListView.java:2265)
The AbsListView 的源代码可以在 grepcode 上找到 http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.3_r2.1/android/widget/AbsListView.java#AbsListView.obtainView%28int,boolean%5B%5D%29然而,查看该代码并没有给我很大的勇气在那里找到解决方案。相反,我转向了其他资源。可能稍后会回到这个话题。
我在 Android 4.4 设备上执行此代码,因此行号甚至不匹配。
在 4.3 设备上测试
正确的代码行是 2177。与此行匹配:
child = mAdapter.getView(position, null, this);
示例项目
See https://github.com/hanscappelle/so-10822397 https://github.com/hanscappelle/so-10822397对于示例项目。您需要 Android Studio(Beta)0.8.2 和最新的构建工具。我还必须手动获取 proguard-android.txt 文件并将其放置到位。
您可以注释掉适配器中作用于静态 ViewHolder 类的布局字段的行。一旦启用 proguard 并且应用程序在设备上运行,这些就会失败。
我接下来计划做的事情
结论
似乎与动态添加视图有关getView()
自定义适配器的方法。与代码混淆相结合。