【问题标题】:ArrayAdapter getItem(position) - Can i ignore this NullPointer Warning?ArrayAdapter getItem(position) - 我可以忽略这个 NullPointer 警告吗?
【发布时间】:2017-12-16 16:08:45
【问题描述】:

我构建了一个自定义 ArrayAdapter 来填充 Spinner。

public class CountryAdapter extends ArrayAdapter<CountryItem> {

    public CountryAdapter(@NonNull Context context, ArrayList<CountryItem> countryList) {
        super(context, 0, countryList);
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        return initView(position, convertView, parent);
    }

    @Override
    public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        return initView(position, convertView, parent);
    }

    private View initView(int position, View convertView, ViewGroup parent) {

        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(
                R.layout.country_spinner_row, parent, false);
        }
        ImageView imageViewFlag = convertView.findViewById(R.id.image_view_flag);
        TextView textViewName = convertView.findViewById(R.id.text_view_name);

        CountryItem currentItem = getItem(position);

        imageViewFlag.setImageResource(currentItem.getFlagImage());
        textViewName.setText(currentItem.getCountryName());

        return convertView;
    }
}

setImageResourcesetText 方法向我显示 NullPointer 警告,但考虑到我在这里传递了一个 ArrayList,这是否可以忽略不计?在我看来,这也应该为给定位置返回一个项目。

【问题讨论】:

  • 我不明白?
  • 警告不是错误。再看一遍只是一个提示。如果您确信一切正常,那很好。如果膨胀的视图没有这些子视图,那么你只能得到 null,这意味着你有一个更严重的问题。
  • imageView 资源不为空,并且微调器工作至今。警告位于getFlagImage,似乎与 getItem(position) 有关。
  • 如果getItem(position) 返回null 这意味着您的位置错误(这里不是这种情况)或者您的适配器实现已损坏。所以在正常操作中不会发生任何事情。
  • 警告到底是什么?是在setImageResource 还是getFlagImage

标签: android spinner adapter android-arrayadapter


【解决方案1】:

问题出在这里:

CountryItem currentItem = getItem(position);

getItem() 可以返回空值。下面是该方法的源代码,你会注意到它带有@Nullable注解。

@Override
public @Nullable T getItem(int position) {
    return mObjects.get(position);
}

这意味着当你调用这个方法时,你需要处理为空的情况。我知道在正常操作中你永远不会得到 null,你可以忽略这个警告。但正确的方法是做空检查。

final CountryItem currentItem = getItem(position);
if (currentItem != null) {
    imageViewFlag.setImageResource(currentItem.getFlagImage());
    textViewName.setText(currentItem.getCountryName());
}

【讨论】:

  • 我不同意。空检查隐藏了您希望尽快检测到的更严重的潜在问题。在这种情况下,NPE 是首选发生的事情。
  • 哈是的,但这就是测试用例的来源。另一个解决方案是添加assertNonNull(currentItem)而不是空检查。这样我们就会立即崩溃。但在数据是动态的 ListView 和类似的情况下,我不喜欢这种情况。如果在 Kotlin 中放入相同的代码,则不执行 null 检查就无法访问它。
  • 2 亨利很困惑 :D 所以你说我应该插入这张支票吗?
  • 哈哈 :D 由你决定。如果你希望应用程序在数据出现问题时崩溃,请插入assertNonNull(currentItem) 检查。或者,如果您可以不显示错误的数据,那么您不必这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 2021-07-24
  • 2017-04-14
  • 2014-11-21
  • 2017-10-19
  • 2016-08-27
相关资源
最近更新 更多