【问题标题】:RecyclerView Null Pointer ExceptionRecyclerView 空指针异常
【发布时间】:2016-07-28 19:37:44
【问题描述】:

我是 Android Studio 的新手,发现了类似的问题,但没有适用于我当前实例的回复。我一直在尝试使用 RecyclerViews 并且每当我使用它打开活动时都会收到以下错误消息。代码没有显示任何错误。

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.lucasrizzotto.edgeweather/com.lucasrizzotto.edgeweather.ui.HourlyForecastActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)' on a null object reference

这是我的适配器:

public class HourAdapter extends RecyclerView.Adapter<HourAdapter.HourViewHolder> {

    private Hour[] mHours;

    public HourAdapter(Hour[] hours) {
        mHours = hours;
    }

    @Override
    public HourViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).
                inflate(R.layout.hourly_list_item, parent, false);
        HourViewHolder viewHolder = new HourViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(HourViewHolder holder, int position) {
        holder.bindHour(mHours[position]);
    }

    @Override
    public int getItemCount() {
        return mHours.length;
    }

    public class HourViewHolder extends RecyclerView.ViewHolder {

        public TextView mTimeLabel;
        public TextView mTemperatureLabel;
        public TextView mSummaryLabel;
        public ImageView mIconImageView;

        public HourViewHolder(View itemView) {
            super(itemView);
            mTimeLabel = (TextView) itemView.findViewById(R.id.timeLabel);
            mTemperatureLabel = (TextView) itemView.findViewById(R.id.temperatureLabel);
            mSummaryLabel = (TextView) itemView.findViewById(R.id.summaryLabel);
            mIconImageView = (ImageView) itemView.findViewById(R.id.iconImageView);
        }

        public void bindHour(Hour hour) {
            mTimeLabel.setText(hour.getHour());
            mSummaryLabel.setText(hour.getSummary());
            mTemperatureLabel.setText((int)hour.getTemperature());
            mIconImageView.setImageResource(hour.getIconId());
        }

    }
}

还有我的 Activity 类(请记住,我使用 ButterKnife 插件来避免样板代码)

public class HourlyForecastActivity extends AppCompatActivity {

    private Hour[] mHours;

    @BindView(R.id.recyclerView) RecyclerView mRecyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_hourly_forecast);

        Intent intent = getIntent();
        Parcelable[] parcelables = intent.getParcelableArrayExtra(MainActivity.HOURLY_FORECAST);
        mHours = Arrays.copyOf(parcelables, parcelables.length, Hour[].class);

        HourAdapter adapter = new HourAdapter(mHours);
        mRecyclerView.setAdapter(adapter);

        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(layoutManager);
        mRecyclerView.setHasFixedSize(true);

    }
}

我忽略了什么?

提前感谢您的智慧!

【问题讨论】:

    标签: java android model-view-controller butterknife


    【解决方案1】:

    尝试调用:

    ButterKnife.bind(this);
    

    设置内容视图后

    由于您不是以传统方式执行此操作,因此您需要实际调用 bind()。

    【讨论】:

    • 您好,贵霜,谢谢您的回复!我尝试了您的建议并得到了一个新错误: FATAL EXCEPTION: main Process: PID: 19348 android.content.res.Resources$NotFoundException: String resource ID #0x4b
    • 错误是什么?这实际上是您之前异常的正确答案。
    • 您缺少一些您在某处使用过的字符串引用
    • 好吧,你已经解决了第一个问题,所以谢谢你(:
    • 哈哈,谢谢!不知道我是怎么得到它的。我有点难以理解 Adapter、ViewHolder、LayoutManager (etc) 模式,您有什么资源可以推荐给我吗?
    【解决方案2】:

    您正在使用 ButterKnife 绑定视图,这很好。

    但您似乎忘记为您当前的 Activity 初始化 ButterKnife

    就这样吧,

    ButterKnife.bind(this);
    

    在这一行之后,

    setContentView(R.layout.activity_hourly_forecast);
    

    将为您当前的 Activity 初始化 ButterKnife,您将能够正确地从您的布局中引用 RecyclerView。

    希望对你有帮助。

    【讨论】:

    • 感谢您的回复,阿里特拉!你完全正确。
    • 我愿意,但我还没有 15 声望。它不会让我。
    【解决方案3】:

    基本上你需要初始化mRecyclerView

    例如

    mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    

    但在您的情况下,您为此使用 ButterKnife 库。

    所以你需要在setContentView(R.layout.activity_hourly_forecast);之后调用它的bind()方法

    setContentView(R.layout.activity_hourly_forecast);
    ButterKnife.bind(this);
    

    【讨论】:

    • 感谢您的快速回复,马克斯!由于更改,我现在遇到了一个新错误: FATAL EXCEPTION: main Process: PID: 19348 android.content.res.Resources$NotFoundException: String resource ID #0x4b
    • 正如我所说,您在您试图在某处引用的 strings.xml 中缺少一些字符串引用
    • @SexualPotatoes 在哪一行?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    相关资源
    最近更新 更多