Отображение RecyclerView в фрагменте

Я RecyclerView новый RecyclerView в Android Lollipop, и я застрял.

Я пытаюсь получить список с иконкой и TextView справа от значка внутри Fragment .

Я нашел этот отличный учебник о том, как настроить RecyclerView . Я следил за каждым пунктом и только менял item_layout.xml чтобы соответствовать моим потребностям.

Проект строится без каких-либо ошибок, но когда он запускается на моем устройстве, я получаю эту ошибку:

Java.lang.RuntimeException: Невозможно запустить Activity ComponentInfo {com.fredrikaldgard.materialcolors / com.fredrikaldgard.materialcolors.MainActivity}: java.lang.NullPointerException: попытка вызвать виртуальный метод 'void android.support.v7.widget.RecyclerView. SetLayoutManager (android.support.v7.widget.RecyclerView $ LayoutManager) 'на ссылке нулевого объекта

Я попытался решить проблему Google, но я довольно любитель с разработкой Android.

Вот моя MainActivity :

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 1. get a reference to recyclerView RecyclerView recyclerView = (RecyclerView) findViewById(R.id.list); // 2. set layoutManger recyclerView.setLayoutManager(new LinearLayoutManager(this)); // this is data fro recycler view ItemData itemsData[] = { new ItemData("Indigo",R.drawable.circle), new ItemData("Red",R.drawable.color_ic_launcher), new ItemData("Blue",R.drawable.indigo), new ItemData("Green",R.drawable.circle), new ItemData("Amber",R.drawable.color_ic_launcher), new ItemData("Deep Orange",R.drawable.indigo)}; // 3. create an adapter MyAdapter mAdapter = new MyAdapter(itemsData); // 4. set adapter recyclerView.setAdapter(mAdapter); // 5. set item animator to DefaultAnimator recyclerView.setItemAnimator(new DefaultItemAnimator()); 

И мой MyAdapter :

 public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private ItemData[] itemsData; public MyAdapter(ItemData[] itemsData) { this.itemsData = itemsData; } // Create new views (invoked by the layout manager) @Override public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // create a new view View itemLayoutView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_layout, null); // create ViewHolder ViewHolder viewHolder = new ViewHolder(itemLayoutView); return viewHolder; } // Replace the contents of a view (invoked by the layout manager) @Override public void onBindViewHolder(ViewHolder viewHolder, int position) { // - get data from your itemsData at this position // - replace the contents of the view with that itemsData viewHolder.txtViewTitle.setText(itemsData[position].getTitle()); viewHolder.imgViewIcon.setImageResource(itemsData[position].getImageUrl()); } // inner class to hold a reference to each item of RecyclerView public static class ViewHolder extends RecyclerView.ViewHolder { public TextView txtViewTitle; public ImageView imgViewIcon; public ViewHolder(View itemLayoutView) { super(itemLayoutView); txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.item_title); imgViewIcon = (ImageView) itemLayoutView.findViewById(R.id.item_icon); } } // Return the size of your itemsData (invoked by the layout manager) @Override public int getItemCount() { return itemsData.length; } } 

Изменить: вот Fragment

 public class ColorsFragment extends Fragment { public ColorsFragment(){} @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_colors, container, false); return rootView; } } 

Что, возможно, пошло не так?

Solutions Collecting From Web of "Отображение RecyclerView в фрагменте"

Это уже разрешено андроидом 🙂

Взгляните на: https://developer.android.com/samples/RecyclerView/src/com.example.android.recyclerview/RecyclerViewFragment.html

Это было задано некоторое время назад, но на основании ответа, предоставленного @ nacho_zona3, и предыдущего опыта с фрагментами, проблема в том, что представления не были созданы к тому моменту, когда вы пытаетесь найти их с findViewById() метода findViewById() в onCreate() чтобы исправить это, переместите следующий код:

 // 1. get a reference to recyclerView RecyclerView recyclerView = (RecyclerView) findViewById(R.id.list); // 2. set layoutManger recyclerView.setLayoutManager(new LinearLayoutManager(this)); // this is data fro recycler view ItemData itemsData[] = { new ItemData("Indigo",R.drawable.circle), new ItemData("Red",R.drawable.color_ic_launcher), new ItemData("Blue",R.drawable.indigo), new ItemData("Green",R.drawable.circle), new ItemData("Amber",R.drawable.color_ic_launcher), new ItemData("Deep Orange",R.drawable.indigo)}; // 3. create an adapter MyAdapter mAdapter = new MyAdapter(itemsData); // 4. set adapter recyclerView.setAdapter(mAdapter); // 5. set item animator to DefaultAnimator recyclerView.setItemAnimator(new DefaultItemAnimator()); 

К onCreateView() вашего фрагмента. Требуется небольшое количество рефакторинга, потому что все переменные и методы, вызванные этим методом, должны быть статическими. Окончательный код должен выглядеть так:

  public class ColorsFragment extends Fragment { public ColorsFragment() {} @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_colors, container, false); // 1. get a reference to recyclerView RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.list); // 2. set layoutManger recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); // this is data fro recycler view ItemData itemsData[] = { new ItemData("Indigo", R.drawable.circle), new ItemData("Red", R.drawable.color_ic_launcher), new ItemData("Blue", R.drawable.indigo), new ItemData("Green", R.drawable.circle), new ItemData("Amber", R.drawable.color_ic_launcher), new ItemData("Deep Orange", R.drawable.indigo) }; // 3. create an adapter MyAdapter mAdapter = new MyAdapter(itemsData); // 4. set adapter recyclerView.setAdapter(mAdapter); // 5. set item animator to DefaultAnimator recyclerView.setItemAnimator(new DefaultItemAnimator()); return rootView; } } 

Итак, главное, что везде, где вы вызываете findViewById() вам нужно будет использовать rootView.findViewById()

Вы должны получить RecyclerView во Fragment после раздувания основного вида с помощью этого представления. Возможно, он не может найти вашего переработчика, потому что он не является частью деятельности

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View view = inflater.inflate(R.layout.fragment_artist_tracks, container, false); final FragmentActivity c = getActivity(); final RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView); LinearLayoutManager layoutManager = new LinearLayoutManager(c); recyclerView.setLayoutManager(layoutManager); new Thread(new Runnable() { @Override public void run() { final RecyclerAdapter adapter = new RecyclerAdapter(c); c.runOnUiThread(new Runnable() { @Override public void run() { recyclerView.setAdapter(adapter); } }); } }).start(); return view; }