2017-08-13 20 views
1

我從我的api的內容創建一個listview,如果我點擊一個listview項目我想顯示一個新的視圖以及關於該項目的更多詳細信息,目前listview顯示正確但如果我點擊一個項目的應用程序崩潰,我得到這個錯誤信息:Android ListView與詳細信息頁面null對象

> java.lang.RuntimeException: Unable to start activity 
> ComponentInfo{de.dev.app/de.dev.app.ui.quote.ArticleDetailActivity}: 
> java.lang.NullPointerException: Attempt to invoke virtual method 
> 'java.lang.String de.dev.app.jokeapp.entities.Joke.getTitle()' on a null 
> object reference ... Caused by: java.lang.NullPointerException: 
> Attempt to invoke virtual method 'java.lang.String 
> de.dev.app.entities.Joke.getTitle()' on a null object reference 
>                  at 
> de.dev.app.ui.quote.ArticleDetailFragment.onCreateView(ArticleDetailFragment.java:100) 

錯誤指向此行我ArticleDetailFragment.java:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View rootView = inflateAndBind(inflater, container, R.layout.fragment_article_detail); 
    if (!((BaseActivity) getActivity()).providesActivityToolbar()) { 
     ((BaseActivity) getActivity()).setToolbar((Toolbar) rootView.findViewById(R.id.toolbar)); 
    } 
    collapsingToolbar.setTitle(jokeItem.getTitle()); // points here 
    author.setText(jokeItem.getTitle()); 
    quote.setText(jokeItem.getTitle()); 
    jokeHeader.setText(jokeItem.getTitle()); 
    jokeContent.setText(jokeItem.getContent()); 

    return rootView; 
} 

這是我onAttach方法:

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    Bundle bundle = getArguments(); 
    if(bundle == null) { 
     getActivity().finish(); 
     return; 
    } 
    jokeItem = (Joke)bundle.getSerializable("joke"); 
} 

這是我ArticleDetailFragment樣子:

public class ArticleDetailFragment extends BaseFragment { 



    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     if (getArguments().containsKey(ARG_ITEM_ID)) { 
      // load dummy item by using the passed item ID. 
      dummyItem = DummyContent.ITEM_MAP.get(getArguments().getString(ARG_ITEM_ID)); 
     } 

     SharedPreferences preferences = this.getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE); 
     tokenManager = TokenManager.getInstance(preferences); 
     service = RetrofitBuilder.createServiceWithAuth(ApiService.class, tokenManager); 

     setHasOptionsMenu(true); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflateAndBind(inflater, container, R.layout.fragment_article_detail); 
     if (!((BaseActivity) getActivity()).providesActivityToolbar()) { 
      // No Toolbar present. Set include_toolbar: 
      ((BaseActivity) getActivity()).setToolbar((Toolbar) rootView.findViewById(R.id.toolbar)); 
     } 
     collapsingToolbar.setTitle(jokeItem.getTitle()); 
     author.setText(jokeItem.getTitle()); 

     return rootView; 
    } 


    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     inflater.inflate(R.menu.sample_actions, menu); 
     super.onCreateOptionsMenu(menu, inflater); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.action_settings: 
       // your logic 
       return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 


    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     Bundle bundle = getArguments(); 
     if(bundle == null) { 
      getActivity().finish(); 
      return; 
     } 
     jokeItem = (Joke)bundle.getSerializable("joke"); 
    } 

} 

我ArticleDetailActivity

public class ArticleDetailActivity extends BaseActivity { 

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

     if (getSupportActionBar() != null) { 
      getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     } 

     ArticleDetailFragment fragment = ArticleDetailFragment.newInstance(getIntent().getStringExtra(ArticleDetailFragment.ARG_ITEM_ID)); 
     getFragmentManager().beginTransaction().replace(R.id.article_detail_container, fragment).commit(); 
    } 

    @Override 
    public boolean providesActivityToolbar() { 
     return false; 
    } 
} 

調用像這樣在我ListActivit的ArticleDetailActivity:

public class ListActivity extends BaseActivity implements ArticleListFragment.Callback { 
... 
    @Override 
    public void onItemSelected(Joke joke) { 

      Intent detailIntent = new Intent(this, ArticleDetailActivity.class); 
      // detailIntent.putExtra(ArticleDetailFragment.ARG_ITEM_ID, id); 
      startActivity(detailIntent); 
    } 
    ... 
+0

添加您的代碼,您正在創建這個片段。 –

+0

@MuthukrishnanRajendranhi再次我的朋友是我們談到上週同樣的問題還記得,更新的代碼藏漢 – utdev

+0

您可以添加代碼在你的活動,其調用ArticleDetailFragment –

回答

1

呼叫DetailActivity這樣從ListActvity,

Intent detailIntent = new Intent(this, ArticleDetailActivity.class); 
// detailIntent.putExtra(ArticleDetailFragment.ARG_ITEM_ID, id); 
Bundle bundle = new Bundle(); 
bundle.putSerializable("joke", joke); 
detailIntent.putExtras(bundle); 
startActivity(detailIntent); 

,改變你的ArticleDetailActivity改變這樣的,我們需要將數據發送到分段

public class ArticleDetailActivity extends BaseActivity { 

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

     // Show the Up button in the action bar. 
     if (getSupportActionBar() != null) { 
      getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     } 

     ArticleDetailFragment fragment = new ArticleDetailFragment(); 

     fragment.setArguments(getIntent().getExtras()); 

     getFragmentManager().beginTransaction().replace(R.id.article_detail_container, fragment).commit(); 
    } 

    @Override 
    public boolean providesActivityToolbar() { 
     return false; 
    } 
} 
+0

我得到這個錯誤信息https://kopy.io/kfSG7 – utdev

+0

Roeove ** if(getArguments()。 containsKey(ARG_ITEM_ID)){ //通過使用傳遞的項目ID加載虛擬物品。 dummyItem = DummyContent.ITEM_MAP.get(getArguments()。getString(ARG_ITEM_ID)); } **在您的ArticleDetailFragment中 –

-1

這行代碼添加到您的ArticleDetailFragment

@BindView(R.id.title) 
TextView title;