2016-06-03 5 views
-2

저는 Movie 객체의 배열을 취하여 영화의 포스터 이미지를 이미지 뷰로 배치하고 제목을 텍스트 뷰로 배치하는 사용자 정의 ArrayAdapter를 만들었습니다. Movie 클래스의 필드는 여기에 표시됩니다. 그것은 표준 게터와 세터를 가지고 있습니다. 여기 listview.setAdapter (myAdapter)가 사용자 정의 어댑터 코드와 함께 작동하지 않습니다.

public class Movie { 
    protected String id; 
    protected String posterPath; 
    protected String title; 

사용자 정의 ArrayAdapter와 생성자입니다 :

public class MovieAdapter extends ArrayAdapter<Movie> { 
    private static final String LOG_TAG = MovieAdapter.class.getSimpleName(); 

    /** 
    * 
    * @param context Current context used to inflate layout file 
    * @param movies list of Movie objects that will be displayed in list 
    */ 
    public MovieAdapter(Activity context, List<Movie> movies){ 
     super(context, 0, movies); 
     Log.d(LOG_TAG, "adapter constructor"); 
     if(movies != null){ 
      for(int i = 0; i < movies.size(); i++){ 
       Log.d(LOG_TAG, movies.get(i).getTitle()); 
      } 
     } 
    } 

을 그리고 여기에 어댑터를 호출 OnCreateView 코드 조각입니다 : 로그를 기반으로

public class MovieFragment extends Fragment { 
    //number of movies to be displayed 
    private static final int ARG_NUM_MOVIES = 40; 
    private static final String LOG_TAG = MovieFragment.class.getSimpleName(); 

    private List<Movie> movieInfo; 
    private MovieAdapter mMovieAdapter; 


    public MovieFragment() { 
     // Required empty public constructor 
    } 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
     Log.d(LOG_TAG, "onCreateView Start"); 
     mMovieAdapter = new MovieAdapter(getActivity(), movieInfo); 

     View rootView = inflater.inflate(R.layout.fragment_main, container, false); 

     Log.d(LOG_TAG, "listview creation"); 
     ListView listView = (ListView) rootView.findViewById(R.id.listview_movies); 
     Log.d(LOG_TAG, "listview creation2"); 
     listView.setAdapter(mMovieAdapter); 
     /*listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       String 
      } 
     }*/ 
     Log.d(LOG_TAG, "return statement"); 
     return rootView; 
    } 

, 내가 추론 한은 내 어댑터를 listView에 설정하는 중에 오류가 있지만 그 원인을 모르겠습니다. 필자는 또한 사용자 지정 어댑터의 목록이/null (항상은 아닐 경우)로 시작하려면 비어 있음을 보여 줬습니다.

여기에 내 응용 프로그램에서 충돌까지 이어질 오류 로그는 다음과 같습니다

06-02 15:47:47.276 22311-22311/com.example.android.popularmovies D/MovieFragment: onCreateView Start 
06-02 15:47:47.276 22311-22311/com.example.android.popularmovies D/MovieAdapter: adapter constructor 
06-02 15:47:47.286 22311-22311/com.example.android.popularmovies D/AbsListView: Get MotionRecognitionManager 
06-02 15:47:47.286 22311-22311/com.example.android.popularmovies E/MotionRecognitionManager: mSContextService = [email protected] 
06-02 15:47:47.286 22311-22311/com.example.android.popularmovies E/MotionRecognitionManager: motionService = [email protected]7998283 
06-02 15:47:47.286 22311-22311/com.example.android.popularmovies E/MotionRecognitionManager: motionService = [email protected]7998283 
06-02 15:47:47.286 22311-22311/com.example.android.popularmovies D/MovieFragment: listview creation 
06-02 15:47:47.286 22311-22311/com.example.android.popularmovies D/MovieFragment: listview creation2 
06-02 15:47:47.286 22311-22311/com.example.android.popularmovies D/AndroidRuntime: Shutting down VM 
06-02 15:47:47.286 22311-22311/com.example.android.popularmovies E/AndroidRuntime: FATAL EXCEPTION: main 
                        Process: com.example.android.popularmovies, PID: 22311 
                        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.popularmovies/com.example.android.popularmovies.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference 
                         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3253) 
                         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349) 
                         at android.app.ActivityThread.access$1100(ActivityThread.java:221) 
                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 
                         at android.os.Handler.dispatchMessage(Handler.java:102) 
                         at android.os.Looper.loop(Looper.java:158) 
                         at android.app.ActivityThread.main(ActivityThread.java:7224) 
                         at java.lang.reflect.Method.invoke(Native Method) 
                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
                        Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference 
                         at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:337) 
                         at android.widget.ListView.setAdapter(ListView.java:508) 
                         at com.example.android.popularmovies.MovieFragment.onCreateView(MovieFragment.java:54) 
                         at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974) 
+0

'adapter'를 설정할 때'movieInfo'는 null입니다. 먼저 초기화하십시오. –

+0

Movie 객체를 사용하기 전에 movieInfo = new List를 할당하십시오. (); –

+0

에 의해 초기화 됨 List movieInfo = new ArrayList <>(); ' – Sanoop

답변

1

movieInfo 어떤 객체가 널 (null)이 의미에 가리 키지 만 참조입니다.

같은 movieInfo의 대상 만드십시오 :

movieInfo = new ArrayList<>(); 

을하고 일부 값이 좋아하는 줄 :

movieInfo.add(new Movie("1","path one","ONE")); 
movieInfo.add(new Movie("2","path two","TWO")); 
movieInfo.add(new Movie("1","path three","THREE")); 
movieInfo.add(new Movie("1","path four","FOUR")); 
movieInfo.add(new Movie("1","path five","FIVE")); 

을하고 나열하는 어댑터를 설정합니다.

관련 문제