0

Я пытаюсь отправить два пользовательских объекта, один из которых хранит экземпляр другого, а также намерение другого действия. Оба эти компиляторы реализуют Serializable, например, так:Intent.getSerializableExtra возвращает null

public class Story implements Serializable { 

    private String title, author; 
    private ArrayList<StorySegment> segments; 

... } 


class StorySegment implements Serializable { 

    private String author; 
    private String contents; 

... } 

И в моем классе StoryOverviewAdapter, у меня есть это:

public class StoryOverviewAdapter extends ArrayAdapter<Story> { 

    public StoryOverviewAdapter(Context ctx, ArrayList<Story> stories) { 
     super(ctx, 0, stories); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      convertView = LayoutInflater.from(getContext()).inflate(
        R.layout.story_overview_item, parent, false); 
     } 

     final Story story = getItem(position); 

     TextView tvStoryTitle = (TextView) convertView.findViewById(R.id.tv_story_title); 
     tvStoryTitle.setText(story.getTitle()); 
     TextView tvStoryOpening = (TextView) convertView.findViewById(R.id.tv_story_opening); 
     tvStoryOpening.setText(story.getSegment(0).getContents()); 

     ImageView ivUserPicture = (ImageView) convertView.findViewById(R.id.iv_user_picture); 
     ivUserPicture.setTag(position); 
     ivUserPicture.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // Show user profile 
      } 
     }); 

     LinearLayout llStoryLayout = (LinearLayout) convertView.findViewById(R.id.story_layout); 
     llStoryLayout.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(v.getContext(), StoryActivity.class); 
        intent.putExtra("story", story); 
       getContext().startActivity(intent); 
      } 
     }); 

     return convertView; 
    } 
} 

Когда я иду, чтобы вытащить эту информацию из моего Намерения в приемной деятельности. ..

Intent intent = getIntent(); 
Story story = (Story) intent.getSerializableExtra("story"); 

... А затем попытаться проверить свой код, я получаю это:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.Serializable android.content.Intent.getSerializableExtra(java.lang.String)' on a null object reference 

И я понятия не имею, почему. Я думал, что, возможно, удаление «final» из переменной истории избавится от нее, но я не могу получить доступ к переменной изнутри моего внутреннего класса OnClickListener без нее. Не уверен, что делать.

EDIT: Кроме того, вот код, который показывает, что я добавил историю ...

public class OverviewActivity extends AppCompatActivity { 

    ArrayList<Story> stories = new ArrayList<Story>(); 

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

     stories.add(new Story("Lorem Ipsum", "Firstname Lastname", 
       new StorySegment("Firstname Lastname", "Lorem ipsum dolor sit amet, lorem ipsum dolor sit amet, lorem ipsum dolor sit amet..."))); 

     StoryOverviewAdapter storyOverviewAdapter = new StoryOverviewAdapter(this, stories); 
     ListView listView = (ListView) findViewById(R.id.story_overview_list); 
     listView.setAdapter(storyOverviewAdapter); 
    } 
} 
+0

Проверьте это слишком http://stackoverflow.com/questions/37646466/attempt-to-invoke-virtual-method-on -a-null-object-reference-for-video-id –

+0

Вы уверены, что ваша история не является нулевой? –

+0

Пожалуйста, сначала проверьте, что ваш объект Serializable не равен null, после того как вы перейдете в цель. – Shailesh

ответ

0

изменить это

Intent intent = new Intent(v.getContext(), StoryActivity.class); 
        intent.putExtra("story", story); 
       getContext().startActivity(intent); 

в этот

Intent intent = new Intent(v.getContext(), StoryActivity.class); 
        intent.putExtra("story", (Serializable)stories.get(position)); 
       getContext().startActivity(intent); 
+0

Это не влияет на сообщение об ошибке. Все еще дает мне то же самое. – Varoun

+0

@Varoun я отредактировал мой ответ.Надеюсь, это сработает для вас. –

0

Используйте этот код он отлично работает

private Context ctx; 
public StoryOverviewAdapter(Context ctx, ArrayList<Story> stories) { 
     super(ctx, 0, stories); 
this.ctx=ctx; 
    } 

Intent intent = new Intent(ctx, StoryActivity.class); 
        intent.putExtra("story", story); 
       getContext().startActivity(intent); 
+0

Кажется, не работает. Дает мне ту же ошибку, что и раньше. – Varoun

1

мне удалось решить эту проблему за счет миграции попытка получить дополнительные услуги Намерение в ...

Intent intent = getIntent(); 
    story = (Story) intent.getSerializableExtra("story"); 

в мой метод OnCreate(), а не за ее пределами. Так что вместо этого ...

Intent intent = getIntent(); 
Story story = (Story) intent.getSerializableExtra("story"); 

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

... Теперь у меня это ...

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

    Intent intent = getIntent(); 
    Story story = (Story) intent.getSerializableExtra("story"); 
} 

был глупый оплошность с моей стороны ... Дух!

0

Вы можете отправлять пользовательские объекты в виде простых текстов, используя GSON. Нет необходимости в сериализации.

String intentData = gson.toJson(storyObject); 
    intent.putExtra("story", intentData); 

И в приемной деятельности вы можете написать, как,

Story object = gson.fromJson(intentData, Story.class); 
+0

Спасибо за это! Все еще нова для большинства из этого, и мне сказали, что сериализация может быть субоптимальным решением, поэтому я обязательно это проверю. – Varoun

Смежные вопросы