2016-12-01 6 views
-1

Я работаю над приложением, в котором пользователь может отображать плакаты фильма в виде сетки и видеть детали фильма. Моя проблема в том, что когда я запускаю приложение и нажмите на плакат, я получаю эту ошибку Вызвано: java.lang.NullPointerException: попытка вызвать виртуальный метод 'java.lang.Long com.example.android.movies.Movies.getMposter_id()' на нулевом объекте ссылка на этой строке id = movie.getMposter_id();java.lang.NullPointerException: попытка вызвать виртуальный метод для ссылки на нулевой объект

Я не знаю, как я могу его решить. Извините, если я некомпетентен, но я не мог понять, как это исправить. Благодарю.

здесь DetailsFragment.java

package com.example.android.movies; 

import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ExpandableListView; 
import android.widget.ImageView; 
import android.widget.TextView; 
import android.widget.ToggleButton; 

import com.squareup.picasso.Picasso; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 

import static com.example.android.movies.R.id.favoriteButton; 
import static com.example.android.movies.R.id.iv_poster; 


/** 
* A placeholder fragment containing a simple view. 
*/ 
public class DetailsFragment extends Fragment{ 


    Long id; 
    String title, overview, poster, date; 
    String vote; 
    ImageView posterIV; 
    TextView titleTV, dateTV, overviewTV, voteTV; 
    static Context mContext; 

    ExpandableListAdapter listAdapter; 
    static ExpandableListView expListView; 
    static List<String> listDataHeader; 
    static HashMap<String, List<Trailers>> listDataChild; 

    static ArrayList<Trailers> arrTrailers; 
    static ArrayList<Trailers> arrReviews; 

    ToggleButton favorite; 
    private MoviesDB db; 

    Trailers t; 


    public static DetailsFragment newInstance() { 
     return new DetailsFragment(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_details, container, false); 

     // get the listview 
     expListView = (ExpandableListView) rootView.findViewById(R.id.lvExp); 

     // receiving intent 

     Intent gIntent = getActivity().getIntent(); 
     Movies movie = null; 
     if (gIntent != null && gIntent.hasExtra("movie")) { 
      movie = gIntent.getParcelableExtra("movie"); 


      id = movie.getMposter_id(); 

      title = movie.getMtitle(); 
      titleTV = (TextView) rootView.findViewById(R.id.tv_title); 
      titleTV.setText(title); 

      date=movie.getMdate(); 
      dateTV = (TextView) rootView.findViewById(R.id.tv_date); 
      dateTV.setText(date); 

      vote=String.valueOf(movie.getMvote()); 
      voteTV= (TextView) rootView.findViewById(R.id.tv_vote); 
      voteTV.setText(vote); 


      overview=movie.getMoverview(); 
      overviewTV = (TextView) rootView.findViewById(R.id.tv_overview); 
      overviewTV.setText(overview); 

      poster = movie.getMposter_path(); 
      posterIV = (ImageView) rootView.findViewById(iv_poster); 
      Picasso.with(getActivity()) 
        .load("http://image.tmdb.org/t/p/w185".concat(poster)).into(posterIV); 

      favorite= (ToggleButton) rootView.findViewById(favoriteButton); 

     } 
     favorite.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       db.insert(id,title,poster,date, Double.parseDouble(vote),overview,t.getContent1()); 

      } 
     }); 

     return rootView; 
    } 

    private void settingAdapter() { 
     // preparing list data 
     prepareListData(); 

     listAdapter = new ExpandableListAdapter(getActivity(), listDataHeader, listDataChild); 

     // setting list adapter 
     expListView.setAdapter(listAdapter); 
    } 

    /* 
    * Preparing the list data 
    */ 
    private void prepareListData() { 
     listDataHeader = new ArrayList<String>(); 
     listDataChild = new HashMap<String, List<Trailers>>(); 


     // Adding child data 
     listDataHeader.add("Reviews"); 
     listDataHeader.add("Trailers"); 

     listDataChild.put(listDataHeader.get(0), arrReviews); // Header, Child data 
     listDataChild.put(listDataHeader.get(1), arrTrailers); 
    } 

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

     mContext=getActivity(); 

     new TrailersFetcher(getActivity(), id,this).execute(); 
    } 

    public void updateTrailers(ArrayList<Trailers> trailers){ 

     arrTrailers = new ArrayList<>(); 
     for (int i = 0; i <trailers.size() ; i++) { 
      arrTrailers.add(trailers.get(i)); 

     } 
     new ReviewsFetcher(mContext, id,this).execute(); 
    } 

    public void updateReviews(ArrayList<Trailers> reviews){ 
     arrReviews = new ArrayList<>(); 

     for (int i = 0; i <reviews.size() ; i++) { 
      arrReviews.add(reviews.get(i)); 

     } 

     settingAdapter(); 
    } 
} 

здесь Movies.java

package com.example.android.movies; 

import android.os.Parcel; 
import android.os.Parcelable; 

/** 
*/ 
public class Movies implements Parcelable { 
    String Mposter_path; 
    Long Mposter_id; 
    String Mtitle; 
    String Moverview; 
    String Mdate; 
    Double Mvote; 
    Long id; 

    public Movies(String mposter_path, Long mposter_id, String mtitle, 
        String moverview, String mdate, Double mvote) { 
     Mposter_path = mposter_path; 
     Mposter_id = mposter_id; 
     Mtitle = mtitle; 
     Moverview = moverview; 
     Mdate = mdate; 
     Mvote = mvote; 
    } 

    public Movies() { 

    } 

    public String getMposter_path() { 
     return Mposter_path; 
    } 

    public Long getMposter_id() {return Mposter_id;} 

    public String getMtitle() { 
     return Mtitle; 
    } 

    public String getMoverview() { 
     return Moverview; 
    } 

    public String getMdate() { 
     return Mdate; 
    } 

    public Double getMvote() { 
     return Mvote; 
    } 


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

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(this.Mposter_path); 
     dest.writeValue(this.Mposter_id); 
     dest.writeString(this.Mtitle); 
     dest.writeString(this.Moverview); 
     dest.writeString(this.Mdate); 
     dest.writeValue(this.Mvote); 
    } 

    private Movies(Parcel in) { 
     this.Mposter_path = in.readString(); 
     this.Mposter_id = (Long) in.readValue(Long.class.getClassLoader()); 
     this.Mtitle = in.readString(); 
     this.Moverview = in.readString(); 
     this.Mdate = in.readString(); 
     this.Mvote = (Double) in.readValue(Double.class.getClassLoader()); 
    } 

    public static final Parcelable.Creator<Movies> CREATOR = new Parcelable.Creator<Movies>() { 
     @Override 
     public Movies createFromParcel(Parcel source) { 
      return new Movies(source); 
     } 

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

MovieAdapter.java

package com.example.android.movies; 

import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 

import com.squareup.picasso.Picasso; 

import java.util.ArrayList; 

/** 
* 
*/ 
public class MovieAdapter extends BaseAdapter{ 
    ArrayList<Movies> MovieList=new ArrayList<Movies>(); 
    Context mContext; 

    public MovieAdapter(Context context,ArrayList<Movies> movieArrayList) { 
     this.mContext=context; 
     this.MovieList=movieArrayList; 
    } 

    @Override 
    public int getCount() { 
     return MovieList == null ? 0 : MovieList.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return MovieList.get(position); 
    } 

    @Override 
    public long getItemId(int id) {return MovieList.get(id).getMposter_id(); } 

    @Override 
    public View getView(int position, View ConvertedView, ViewGroup viewGroup) { 
     View view=ConvertedView; 
     if (view==null) 
     { 
      LayoutInflater inflater=(LayoutInflater) 
        mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      view=inflater.inflate(R.layout.grid_item,null); 
     } 
     ImageView ivMovieName= (ImageView) view.findViewById(R.id.image_view); 

     Picasso.with(mContext) 
       .load("http://image.tmdb.org/t/p/w185"+MovieList.get(position).getMposter_path()).into(ivMovieName); 


     return view; 
    } 
} 
+1

'gIntent.getParcelableExtra (" фильм ")' возвращает 'null'. [Что такое NullPointerException и как его исправить?] (Http://stackoverflow.com/q/218384/3572108) –

ответ

0

Вы можете иметь фильм в своем намерении, но mPoster_id является ноль. Вам нужно проверить, что ваш фильм имеет mPoster_id, который не является нулевым, или по умолчанию задает значение null.

0

Где мой код активности? Вы на самом деле положили этот объект фильма на намерение своей деятельности, например getIntent(). PutExtra (movie)? Похоже, что нет проблем с классом фильма. Вот рабочий код, который я испытал: MainActivity.java:

public class MainActivity extends AppCompatActivity { 

Movie movie; 

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

    TextView test = (TextView) findViewById(R.id.test); 

    movie = new Movie("Awesome", (long) 123); 
    String about = movie.getName() + "\n" + movie.getId(); 
    test.setText(about); 

    test.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      getIntent().putExtra("movie", movie); 

      if (savedInstanceState == null) 
       getSupportFragmentManager() 
         .beginTransaction() 
         .replace(R.id.container_view, new DetailFragment()) 
         .commit(); 

     } 
    }); 

} 
} 

DetailFragment.java:

public class DetailFragment extends Fragment{ 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View root = inflater.inflate(R.layout.fragment_detail,container,false); 

    TextView textView = (TextView)root.findViewById(R.id.textView2); 

    Movie movie = getActivity().getIntent().getParcelableExtra("movie"); 

    String about = movie.getName()+"\n"+movie.getId(); 
    textView.setText(about); 

    return root; 
} 
} 

Movie.java:

public class Movie implements Parcelable{ 

private Long id; 
private String name; 

public Movie(String n, Long i){ 
    name = n; 
    id = i; 
} 

public Long getId() { 
    return id; 
} 

public void setId(Long id) { 
    this.id = id; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

protected Movie(Parcel in) { 
    this.name = in.readString(); 
    this.id = (Long) in.readValue(Long.class.getClassLoader()); 
} 

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

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

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

@Override 
public void writeToParcel(Parcel parcel, int i) { 
    parcel.writeString(this.name); 
    parcel.writeValue(this.id); 
} 
}