2017-05-12 13 views
-1

2つのアクティビティを持つメイン画面があります。いずれもRecyclerViewを持ち、項目をクリックするとこのエラーが発生します。私は変更しようとしました"extend"アクティビティとFragmentActivityの結果が同じです。私はこれのための解決策はありません、多分私はアダプタ全体を変更する必要があります。あなたのソリューションは何ですか?このライン意図意図=新しいテント(getActivity()、HeroShowCase.class)から第3アクティビティ、コンテキストヌルオブジェクトの開始

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference 


これは、あなたの行はエラーをスローして

public class HeroListAdapter extends Fragment{ 

    private class HeroHolder extends RecyclerView.ViewHolder { 

    private Heroes mHeroes; 


    public TextView mHeroTextView; 
    public ImageView mHeroImageView; 

    public HeroHolder(View heroView){ 
     super(heroView); 
     itemView.setOnClickListener(new View.OnClickListener(){ 
      @Override 
      public void onClick(View v){ 
       Intent intent=new Intent(getActivity(),HeroShowCase.class); 
       intent.putExtra(MainHeroScreen.EXTRA_HERO_ID,mHeroes.getId()); 
       startActivity(intent); 
      } 
     }); 
     mHeroTextView=(TextView) heroView.findViewById(R.id.hero_item_hero_name); 
     mHeroImageView=(ImageView) heroView.findViewById(R.id.hero_item_hero_icon); 
     mHeroImageView.setAlpha(196); 
    } 

    public void bindHero(Heroes heroes){ 
     mHeroes=heroes; 
     mHeroImageView.setImageResource(heroes.getHeroPortrait()); 
     mHeroTextView.setText(heroes.getTitle()); 
    } 
} 

public class HeroAdapter extends RecyclerView.Adapter<HeroHolder>{ 
    private List<Heroes> mHeroes; 
    public HeroAdapter(List<Heroes> heroes){ 
     mHeroes=heroes; 
    } 
    @Override 
    public HeroHolder onCreateViewHolder(ViewGroup parent, int viewType){ 
     LayoutInflater layoutInflater=LayoutInflater.from(parent.getContext()); 
     View view=layoutInflater.inflate(R.layout.heroes_item,parent,false); 
     return new HeroHolder(view); 
    } 
    @Override 
    public void onBindViewHolder(HeroHolder holder, int position){ 
     Heroes heroes=mHeroes.get(position); 
     holder.bindHero(heroes); 
    } 
    @Override 
    public int getItemCount(){ 
     return mHeroes.size(); 
    } 
} 
} 

MainActivity(第二の活動)

public class MainHeroScreen extends Activity{ 

public static final String EXTRA_HERO_ID="com.example.ferhat.heroesitems_dota2.hero_id"; 

private RecyclerView mHeroRecyclerView; 
private HeroListAdapter.HeroAdapter mHeroAdapter; 
private RecyclerView.ItemDecoration mDividerItemDecoration; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.heroes_list_view); 
    mHeroRecyclerView = (RecyclerView) findViewById(R.id.hero_recycler_view); 
    mHeroRecyclerView.setHasFixedSize(true); 
    mHeroRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 

    updateUI(); 
    //İtem arası çizgi 
    mDividerItemDecoration = new DividerItemDecoration(mHeroRecyclerView.getContext() 
      ,new LinearLayoutManager(this).getOrientation()); 
    mHeroRecyclerView.addItemDecoration(mDividerItemDecoration); 

} 

public void updateUI() { 
    HeroLab heroLab = HeroLab.get(this); 
    List<Heroes> heroes = heroLab.getHeroes(); 

    mHeroAdapter = new HeroListAdapter().new HeroAdapter(heroes); 
    mHeroRecyclerView.setAdapter(mHeroAdapter); 
} 
} 

AndroidManifest

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.example.ferhat.heroesitems_dota2"> 
<uses-sdk 
    android:maxSdkVersion="25" 
    android:minSdkVersion="21" 
    android:targetSdkVersion="23"> 

</uses-sdk> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:roundIcon="@mipmap/ic_launcher_round" 
    android:supportsRtl="true" 
    > 
    <activity android:name=".MainScreen"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN"/> 

      <category android:name="android.intent.category.LAUNCHER"/> 
     </intent-filter> 
    </activity> 
    <activity android:name=".MainHeroScreen"></activity> 
    <activity android:name=".HeroShowCase"></activity> 
    <activity android:name=".MainItemScreen"></activity> 

</application> 

</manifest> 
+0

itemViewはどこに宣言されていますか?これは、HeroHolderコンストラクタで使用されます。 –

+0

クラスのネストは私にとって非常に奇妙なようです。 –

答えて

1

問題の直接的な原因は、アクティビティに添付されていないフラグメントオブジェクトに対してgetActivity()を呼び出すことです。あなたがこの問題を解決できるかもしれませんが、そのような修正は、より重要な問題をカバーしているバンド援助にすぎません。断片がどのような活動にも結合していない理由を理解することが重要です。本当の問題はここにある:

mHeroAdapter = new HeroListAdapter().new HeroAdapter(heroes); 

これは単にアダプタを作成するには(奇妙HeroList アダプター命名された)フラグメントを作成します。フラグメントはアクティビティーに追加されません。実際の問題は、アダプタがフラグメントサブクラス内で宣言されていることです。あなたは断片を広げる必要はないと私には思われます。代わりに、レベルクラスはRecyclerView.Adapterを拡張する必要があります。これにより、すべてをコンパイルして正しく動作させるための調整が必要になります。

カスタムアダプタを作成する正しい方法の詳細については、the RecyclerView API Guideおよび付属のサンプルアプリケーションを参照してください。

0

第三のアクティビティを開くことを意図しているアダプタです、あなたは1つ大きなiss ue。メソッドgetActivity()は、フラグメントがアクティビティにアタッチされていない場合はnullを返します。あなたのケースでは

Intent intent=new Intent(getActivity(), HeroShowCase.class); 

あなたはView.getContext()vので、ここではnullになることはありません使用して簡単にそれを修正することができます。

Intent intent=new Intent(v.getContext(), HeroShowCase.class); 
+0

あなたの迅速な対応のために、:)、私はできるだけ早く試してみます –

関連する問題