2015-05-22 110 views
1

我正在关注一个android开发教程(创建一个天气应用程序),但我遇到了一个错误,我得到的是我在问题结尾处列出了完整的logcat日志。有没有人有线索为什么我得到这个错误?我已经检查了超过10次。 NODE:minSDK的版本是14,这就是为什么我使用支持库来使用Recycler视图。Nullpointer使用RecyclerView时出现异常

这是活动的布局XML文件,使用回收的观点:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:background="@drawable/bg_gradient" 
    tools:context="koemdzhiev.com.stormy.ui.HourlyForecastActivity"> 


<android.support.v7.widget.RecyclerView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/recyclerView"/> 

这是我的Recycler.Adapter代码:

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 mSummaryLabel; 
     public TextView mTemperatureLabel; 
     public ImageView mIconImageView; 

     public HourViewHolder(View itemView) { 

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

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

这是活动中的代码:

public class HourlyForecastActivity extends Activity { 

    private Hour[] mHours; 
    //inject the RecyclerView as member variable 
    @InjectView(R.id.recyclerView) RecyclerView mRecyclerView; 

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

     ButterKnife.inject(this); 

     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); 
     //if dealing with fixed size data, it is recommended to do the following... 
     mRecyclerView.setHasFixedSize(true); 
    } 
} 

这是我收到的logcat日志:

05-22 22:56:00.394 32579-32579/koemdzhiev.com.stormy E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: koemdzhiev.com.stormy, PID: 32579 
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageResource(int)' on a null object reference 
     at koemdzhiev.com.stormy.adapters.HourAdapter$HourViewHolder.bindHour(HourAdapter.java:61) 
     at koemdzhiev.com.stormy.adapters.HourAdapter.onBindViewHolder(HourAdapter.java:33) 
     at koemdzhiev.com.stormy.adapters.HourAdapter.onBindViewHolder(HourAdapter.java:16) 
     at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:4805) 
     at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4106) 
+1

你能显示R.layout.hourly_list_item文件吗?错误显示当您调用mIconImageView.setImageResource(hour.getIconId())时,mIconImageView为null; – GuilhE

+0

我已经包含了这个文件的代码作为答案。比你这么快回复! :) –

+1

哦,天哪!我发现了这个问题!有一个我没有看到的错字! IconImageView中带有“v”的IconImaveView。哦,我的... 谢谢你指出我在这个方向! –

回答

3

ImageView ID是iconIma V EVIEW但在你的代码,您所呼叫iconIma EVIEW。这很奇怪,因为除非在其他.xml文件中有其他位置的iconImageView,否则应该有编译错误。

+0

不,我没有编译器错误。这只是一个运行时错误。你是对的,这很奇怪。再次感谢! :) –

+0

尝试使用FIND工具并在您的项目中搜索该ID。您的R文件是自动生成的,该ID必须存在于您的项目中。 – GuilhE

1

!有一个我没有看到的错字!在IconImageView的id中,带有“v”的iconImaveView。我简直不敢相信那很简单。