Android, функции в адаптере никогда не вызывают

Функции как onCreateViewHolder(), onBindViewHolder(), onAttachedToRecyclerView() никогда не звонят. Это то, что я пытаюсь сделать.

  1. Переключиться с MainActivity в RecyclerViewActivity когда Button1 нажать и загрузить fragment_recyclerview в RecyclerViewActivity
    switch(id) {
        case R.id.aboutMeButton:
            getSupportFragmentManager().beginTransaction().replace(R.id.mainContainer, AboutMeFragment.newInstance()).addToBackStack(null).commit();
            break;
        case R.id.task1Button:
            intent = new Intent(this, RecyclerViewActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT );
            startActivity(intent);
            break;
        default:
            break;
    }
  1. FragmentViewActivity.onCreate()
FragmentViewActivity.onCreate()
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_recyclerview);

    getSupportFragmentManager().beginTransaction().replace(R.id.recyclerViewContainer, RecyclerViewFragment.newInstance()).commit();

    Log.d("AAA", "RecyclerViewActivity.onCreate( )");
}
  1. RecyclerViewFragment.onCreateView():
RecyclerViewFragment.onCreateView(){
    final View rootView = inflater.inflate(R.layout.fragment_recyclerview, container, false);
    movieData = new MovieData();

    mRecyclerView = (RecyclerView) rootView.findViewById(R.id.cardViewContainer);

    // Log.d("AAA", "mRecyclerView  = " + mRecyclerView.getId());

    // use this setting to improve performance if you know that changes
    // in content do not change the layout size of the RecyclerView
    mRecyclerView.setHasFixedSize(true);

    // use a linear layout manager
    mLayoutManager = new LinearLayoutManager(getActivity());
    mRecyclerView.setLayoutManager(mLayoutManager);

    Log.d("AAA", "getActivity() = " + getActivity().toString());
    Log.d("AAA", "movieList size  = " + movieData.getMoviesList().size());

    // specify an adapter (see also next example)
    mAdapter = new MovieDataAdapter(getActivity(), movieData.getMoviesList());
    mRecyclerView.setAdapter(mAdapter);

    return super.onCreateView(inflater, container, savedInstanceState);
}
  1. Adapter.getItemCount() возвращает 30, однако, функции в адаптере, отличном от конструктора, никогда не вызываются, что оставляет мне чистый пустой экран. Я понятия не имею, что происходит

2 ответа

Решение

Вы устанавливаете свой View сведущий rootView а потом вместо того, чтобы вернуть View, Вы возвращаетесь super.onCreateView():

Вместо следующего в onCreateView():

return super.onCreateView(inflater, container, savedInstanceState);

Вы должны вернуть View Вы только что настроили:

return rootView;

первый:

  • не выполняйте инициализацию адаптера в Fragment.onCreateView(,,,), поскольку имя говорит, что этот метод должен использоваться для раздувания или создания представления:

так раздувать вид

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.recycler_layout, container, false);
}

после создания представления используйте метод onViewCreated(..) для инициализации и создания адаптера:

@Override
public void onViewCreated(View view, Bundle savedInstanceState){
    // here initialize recycler view 
    super.onViewCreated(view, savedInstanceState);
}

и, как сказал user13, вам нужно вернуть завышенный вид, а не супер созданный вид!!!!*

тогда вы избежите таких проблем

второй:

  • в зависимости от использования фрагмента / родительского компонента (например, вы должны использовать другой подход, когда реализуете пейджер представления с помощью адаптера состояния или обычного адаптера или сохраняете фрагмент), иногда вы можете, а иногда и не можете удерживать ссылку на завышенное представление (таким образом, возвращать или нет один раз созданный вид) - но, к сожалению, это зависит от того, какой подход вы используете
Другие вопросы по тегам