简体   繁体   中英

Attempt to invoke virtual method 'android.os.Parcelable android.os.Bundle.getParcelable(java.lang.String)' on a null object reference

Idk why is it not working, Im trying to transfer data, i'm doing an app but when i run it i get an error, the Error is in the BlogActivity Class "showData(getIntent().getExtras().getParcelable(EXTRAS_BLOG));"(java.lang.NullPointerException).

This is BlogActivity Class:

public class BlogActivity extends AppCompatActivity{

private static final String EXTRAS_BLOG = "EXTRAS_BLOG";
private TextView textTitle;
private TextView textDate;
private TextView textAuthor;
private TextView textRating;
private TextView textDescription;
private TextView textViews;
private RatingBar ratingBar;
private ImageView imageAvatar;
private ImageView imageMain;
private ImageView imageBack;
private ProgressBar progressBar;


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

    imageMain = findViewById(R.id.yemenImg);
    imageAvatar = findViewById(R.id.yemenAvatar);

    imageBack = findViewById(R.id.imageBack);
    imageBack.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View view)
        {
            new Handler().postDelayed(new Runnable()
            {
                @Override
                public void run()
                {
                    Intent myInt = new Intent(getApplicationContext(),MainActivity.class);
                    startActivity(myInt);

                }
            },2);
        }
    });

    textDate = findViewById(R.id.dateYemen);
    textTitle = findViewById(R.id.textTitle);
    textAuthor = findViewById(R.id.yemenAuthor);
    textRating = findViewById(R.id.textRating);
    textViews = findViewById(R.id.textViews);
    textDescription = findViewById(R.id.textDescription);
    ratingBar = findViewById(R.id.ratingBar);
    progressBar = findViewById(R.id.progressBar);


     
   showData(getIntent().getExtras().getParcelable(EXTRAS_BLOG));

}

/*private void loadData()
{
    BlogHttpClient.INSTANCE.loadBlogArticles(new BlogArticlesCallback() {
        @Override
        public void onSuccess(final List<Blog> blogList) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    showData(blogList.get(0));
                }
            });
        }

        @Override
        public void onError() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    showErrorSnackbar();
                }
            });

        }
    });
}*/

private void showData(Blog blog)
{
    progressBar.setVisibility(View.GONE);
    textTitle.setText(blog.getTitle());
    textDate.setText(blog.getDate());
    textAuthor.setText(blog.getAuthor().getName());
    textRating.setText(String.valueOf(blog.getRating()));
    textViews.setText(String.format("(%d views)", blog.getViews()));
    textDescription.setText(blog.getDescription());
    textDescription.setText(Html.fromHtml(blog.getDescription(),Html.FROM_HTML_MODE_COMPACT));
    ratingBar.setRating(blog.getRating());
    ratingBar.setVisibility(View.VISIBLE);
    imageBack.setImageResource(R.drawable.ic_baseline_arrow_back_24);




    Glide.with(this)
            .load(blog.getImage())
            .transition(DrawableTransitionOptions.withCrossFade())
            .into(imageMain);

    Glide.with(this)
            .load(blog.getAuthor().getAvatar())
            .transform(new CircleCrop())
            .transition(DrawableTransitionOptions.withCrossFade())
            .into(imageAvatar);

}

/*private void showErrorSnackbar()
{
    View rootView = findViewById(android.R.id.content);
    Snackbar snackbar = Snackbar.make(rootView,"Error during loading blog articles",
            Snackbar.LENGTH_INDEFINITE);
    snackbar.setActionTextColor(Color.parseColor("#e0af1f"));
    snackbar.setAction("Retry", v -> {
        snackbar.dismiss();
    });
    snackbar.show();
}*/

public static void startBlogDetailsActivity(Activity activity, Blog blog) {
    Intent intent = new Intent(activity, BlogActivity.class);
    intent.putExtra(EXTRAS_BLOG, blog);
    activity.startActivity(intent);
}

Blog Class:

public class Blog implements Parcelable {

private String id;
private Author author;
private String title;
private String date;
private String image;
private String description;
private int views;
private float rating;

protected Blog(Parcel in) {
    id = in.readString();
    title = in.readString();
    date = in.readString();
    image = in.readString();
    description = in.readString();
    views = in.readInt();
    rating = in.readFloat();
    author = in.readParcelable(Author.class.getClassLoader());
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(id);
    dest.writeString(title);
    dest.writeString(date);
    dest.writeString(image);
    dest.writeString(description);
    dest.writeInt(views);
    dest.writeFloat(rating);
    dest.writeParcelable(author, 0);
}

@Override
public int describeContents() {
    return 0;
}

public static final Creator<Blog> CREATOR = new Creator<Blog>() {
    @Override
    public Blog createFromParcel(Parcel in) {
        return new Blog(in);
    }

    @Override
    public Blog[] newArray(int size) {
        return new Blog[size];
    }
};

public String getTitle() {
    return title;
}

public String getDate() {
    return date;
}

public String getImage() {
    return image;
}

public String getDescription() {
    return description;
}

public int getViews() {
    return views;
}

public float getRating() {
    return rating;
}

public Author getAuthor() {
    return author;
}

public void setAuthor(Author author) {
    this.author = author;
}

public String getId() {
    return id;
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Blog blog = (Blog) o;
    return views == blog.views &&
            Float.compare(blog.rating, rating) == 0 &&
            Objects.equals(id, blog.id) &&
            Objects.equals(author, blog.author) &&
            Objects.equals(title, blog.title) &&
            Objects.equals(date, blog.date) &&
            Objects.equals(image, blog.image) &&
            Objects.equals(description, blog.description);
}

@Override
public int hashCode() {
    return Objects.hash(id, author, title, date, image, description, views, rating);
}

This is Main Activity Class:

public class MainActivity extends AppCompatActivity {


private MainAdapter adapter;
private SwipeRefreshLayout refreshLayout;

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

    adapter = new MainAdapter(blog ->
            BlogActivity.startBlogDetailsActivity(this, blog));

    RecyclerView recyclerView = findViewById(R.id.recylerView);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setAdapter(adapter);


    refreshLayout = findViewById(R.id.refresh);
    refreshLayout.setOnRefreshListener(this::loadData);

    loadData();
}

private void loadData()
{
    refreshLayout.setRefreshing(true);
    BlogHttpClient.INSTANCE.loadBlogArticles(new BlogArticlesCallback() {
        @Override
        public void onSuccess(final List<Blog> blogList) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    refreshLayout.setRefreshing(false);
                    adapter.submitList(blogList);
                }
            });
        }

        @Override
        public void onError() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    refreshLayout.setRefreshing(false);
                    showErrorSnackbar();
                }
            });

        }
    });
}

private void showErrorSnackbar() {
    View rootView = findViewById(android.R.id.content);
    Snackbar snackbar = Snackbar.make(rootView,"Error during loading blog articles",
            Snackbar.LENGTH_INDEFINITE);
    snackbar.setActionTextColor(Color.parseColor("#e0af1f"));
    snackbar.setAction("Retry", v -> {
        loadData();
        snackbar.dismiss();
    });
    snackbar.show();
}

This is MainAdapter Class:

public class MainAdapter extends ListAdapter<Blog, MainAdapter.MainViewHolder>{

public interface OnItemClickListener{
    void onItemClicked(Blog blog);
}

private OnItemClickListener clickListener;

public MainAdapter(OnItemClickListener clickListener){
    super(DIFF_CALLBACK);
    this.clickListener = clickListener;
}

@NonNull
@Override
public MainAdapter.MainViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
{
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    View view = inflater.inflate(R.layout.activity_listlayout,parent,false);
    return new MainViewHolder(view, clickListener);
}

@Override
public void onBindViewHolder(@NonNull MainAdapter.MainViewHolder holder, int position)
{
    holder.bindTo(getItem(position));

}

static class MainViewHolder extends RecyclerView.ViewHolder
{
    private TextView textTitle;
    private TextView textDate;
    private ImageView imageAvatar;
    private Blog blog;

    public MainViewHolder(@NonNull View itemView, OnItemClickListener listener)
    {
        super(itemView);
        itemView.setOnClickListener(view -> listener.onItemClicked(blog));
        textTitle = itemView.findViewById(R.id.textTitle);
        textDate = itemView.findViewById(R.id.textDate);
        imageAvatar = itemView.findViewById(R.id.imageAvatar);
    }


    void bindTo(Blog blog)
    {
        textTitle.setText(blog.getTitle());
        textDate.setText(blog.getDate());

        Glide.with(itemView)
                .load(blog.getAuthor().getAvatar())
                .transform(new CircleCrop())
                .transition(DrawableTransitionOptions.withCrossFade())
                .into(imageAvatar);
    }
}

private static final DiffUtil.ItemCallback<Blog> DIFF_CALLBACK =
        new DiffUtil.ItemCallback<Blog>()
        {
            @Override
            public boolean areItemsTheSame(@NonNull Blog oldItem, @NonNull Blog newItem)
            {
                return oldItem.getId().equals(newItem.getId());
            }

            @Override
            public boolean areContentsTheSame(@NonNull Blog oldItem, @NonNull Blog newItem)
            {
                return oldItem.equals(newItem);
            }
        };

You may set value to blog variable in MainViewHolder .
Add this line to your bindTo() method body: this.blog = blog

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM