Я создал пользовательский 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)
'movieInfo' является нулевым, когда вы устанавливаете свой« Адаптер ». Сначала инициализируйте его. –
Перед использованием объекта Movie назначьте movieInfo = новый список(); –
initialize by 'List movieInfo = new ArrayList <>();' –
Sanoop