Java.lang.NullPointerException en android.support.v7.widget.RecyclerView.onMeasure

Intento usar RecyclerView con RecyclerView.Adapter pero aquí hay algo malo. Publico mi código a continuación:

Diseño:

<android.support.v7.widget.RecyclerView xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/topic_view" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="match_parent" /> 

Topic_tile.xml:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="@dimen/tile_height"> <com.makeramen.RoundedImageView xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/avatar" android:padding="16dp" app:riv_corner_radius="72dp" android:layout_height="72dp" android:layout_width="72dp" /> <LinearLayout android:id="@+id/text_layout" android:orientation="vertical" android:paddingTop="@dimen/text_padding_top_and_bottom" android:paddingBottom="@dimen/text_padding_top_and_bottom" android:paddingRight="16dp" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/title" android:textSize="@dimen/primary_font" android:paddingLeft="@dimen/text_padding_left" android:textColor="#000000" android:text="Title" android:layout_width="match_parent" android:layout_height="wrap_content"/> <TextView android:id="@+id/author" android:textSize="@dimen/secondary_font" android:paddingLeft="@dimen/text_padding_left" android:text="author" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout> </RelativeLayout> 

Aquí está en onCreate()

 public class TitleListActivity extends ActionBarActivity { private RecyclerView topic_view; private RecyclerView.LayoutManager mLayoutManager; private TitlelistAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_title_list); ..... topic_view = (RecyclerView)findViewById(R.id.topic_view); adapter = new TitlelistAdapter(topicList); topic_view.setHasFixedSize(true); mLayoutManager = new LinearLayoutManager(TitleListActivity.this); topic_view.setLayoutManager(mLayoutManager); topic_view.setItemAnimator(new DefaultItemAnimator()); topic_view.setAdapter(adapter); 

El adaptador:

 public class TitlelistAdapter extends RecyclerView.Adapter<TitlelistAdapter.ViewHolder> { public List<Topic> topicList; public static class ViewHolder extends RecyclerView.ViewHolder{ TextView title; TextView author; RoundedImageView avatar; public ViewHolder(View itemView) { super(itemView); title = (TextView)itemView.findViewById(R.id.title); author = (TextView)itemView.findViewById(R.id.author); avatar = (RoundedImageView)itemView.findViewById(R.id.avatar); } } public TitlelistAdapter(List<Topic> topicList){ this.topicList = topicList; } @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.topic_tile,viewGroup,false); return new ViewHolder(itemView); } @Override public void onBindViewHolder(ViewHolder viewHolder, int i) { viewHolder.title.setText(topicList.get(i).title); viewHolder.author.setText(topicList.get(i).member.username); } @Override public long getItemId(int position) { return super.getItemId(position); } @Override public int getItemCount() { return topicList.size(); } } 

Aquí está la excepción:

 java.lang.NullPointerException at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:1694) at android.view.View.measure(View.java:16497) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) at android.view.View.measure(View.java:16497) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) at android.view.View.measure(View.java:16497) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) at android.support.v7.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:453) at android.view.View.measure(View.java:16497) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) at android.view.View.measure(View.java:16497) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) at android.view.View.measure(View.java:16497) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2291) at android.view.View.measure(View.java:16497) at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1912) at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1109) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1291) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) at android.view.Choreographer.doCallbacks(Choreographer.java:574) at android.view.Choreographer.doFrame(Choreographer.java:544) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5001) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) at dalvik.system.NativeStart.main(Native Method) 

¿Es algo que no init o algo que debería escribir más?

Tengo este error cuando mi RecyclerView no tenía LayoutManager. La adición de este código solucionó el problema:

 recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext())); 

Su xml muestra que tiene dos espacios de nombres android que en realidad debería darle un error, ya que en android se le permite usar el espacio de nombres sólo una vez. Quite el linearLayout de su disposición principal pues parece innecesario. Compruebe su diseño de fila personalizado, por ejemplo topic_tile , así como cualquier error similar

 <android.support.v7.widget.RecyclerView xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/topic_view" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="match_parent" /> 

EDIT:

En onCreate()

 private RecyclerView.LayoutManager mLayoutManager; @Override protected void onCreate(Bundle savedInstanceState) { . . . mLayoutManager = new LinearLayoutManager(this); recycleView.setLayoutManager(mLayoutManager); } 

Si está enfrentando el mismo problema para RecycleView dentro de un fragmento, intente utilizar este código.

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View rootView = inflater.inflate(R.layout.fragment_latest, container, false); // get recycler view mRecyclerView = (RecyclerView) rootView.findViewById(R.id.novel_item_list); //mRecyclerView.setHasFixedSize(true); // use a linear layout manager mLayoutManager = new LinearLayoutManager(getActivity()); mRecyclerView.setLayoutManager(mLayoutManager); String[] abc = {"hi","how are you","this is recycler"}; // specify an adapter (see also next example) mAdapter = new RecyclerViewAdapter(abc); mRecyclerView.setAdapter(mAdapter); return rootView; } 

LayoutManager configurar LayoutManager para RecycleView :

Actualmente, Android soporta 3 tipos de diseños.

Si desea que LinearLayoutManager un ListView normal, use LinearLayoutManager .

Si desea que parezca un gridView, utilice GridLayoutManager .

Si desea que parezca escalonada, use StaggeredGridLayoutManager

Constructores para 3 tipos de diseños arriba

 LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity()); GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 2); StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(spanCount, StaggeredGridLayoutManager.HORIZONTAL); 

Entonces usted fija LinearLayout a RecycleView (en este caso utilicé LinearLayoutManager

 recyclerView = (RecyclerView) view.findViewById(R.id.saved_recycle_view); recyclerView.setHasFixedSize(true); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context); recyclerView.setLayoutManager(linearLayoutManager); 

De todas formas, utilice la Biblioteca OttoBus para distribuir eventos del Adaptador a la Actividad / Fragmento que contiene la RecycleView . Buena suerte !

Para cualquier persona que intenta utilizar un ViewPager para las pestañas, y dentro de sus lengüetas tienen un RecyclerView que cause este error loco, sugiero posponer el inflado creando otro fragmento para incluir solamente el RecylerView.

Este archivo xml es una de mis pestañas que contienen un diseño de marco en lugar de un reciclador.

Shop_most_views_fragment.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <FrameLayout android:id="@+id/most_view_item_frameLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#f3f3f3" /> </LinearLayout> 

Su clase java

 public class MostViews extends Fragment { private String title; private int page; View convertedView; RecyclerView grids; public static MostViews newInstance(int page, String title) { MostViews fragmentFirst = new MostViews(); Bundle args = new Bundle(); args.putInt("someInt", page); args.putString("someTitle", title); fragmentFirst.setArguments(args); return fragmentFirst; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); page = getArguments().getInt("someInt", 0); title = getArguments().getString("someTitle"); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { convertedView = inflater.inflate(R.layout.shop_most_views_fragment, container, false); transitMasonaryLayoutFragmentIntoFramLayout(); return convertedView; } private void transitMasonaryLayoutFragmentIntoFramLayout() { MasanoryLayout masanoryLayout = new MasanoryLayout(); FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); fragmentManager.beginTransaction() .add(R.id.most_view_item_frameLayout, masanoryLayout).commit(); } } 

Así que tenemos una disposición del marco para poner nuestro fragmento del recylcer en él.

Shop_most_view_masanory_fragment.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/mostViewsItem" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> 

Su clase java

 public class MasanoryLayout extends Fragment { View convertedView; RecyclerView grids; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { convertedView = inflater.inflate(R.layout.shop_most_view_masanory_fragment, container, false); grids = (RecyclerView) convertedView.findViewById(R.id.mostViewsItem); setLayoutManagerOnRecyclerView(); MasonryAdapter adapter = new MasonryAdapter(initializeData()); grids.setAdapter(adapter); return convertedView; } private void setLayoutManagerOnRecyclerView() { grids.setLayoutManager(new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL)); } private List<StoreItem> initializeData() { List<StoreItem> storeItems = new ArrayList<>(); storeItems.add(new StoreItem("احسان", "احسان", R.drawable.detailed_index_store)); storeItems.add(new StoreItem("احسان", "احسان", R.drawable.clothstore)); storeItems.add(new StoreItem("احسان", "احسان", R.drawable.detailed_index_store)); storeItems.add(new StoreItem("احسان", "احسان", R.drawable.clothstore)); storeItems.add(new StoreItem("احسان", "احسان", R.drawable.detailed_index_store)); storeItems.add(new StoreItem("احسان", "احسان", R.drawable.detailed_index_store)); storeItems.add(new StoreItem("احسان", "احسان", R.drawable.clothstore)); return storeItems; } } 

Como ves tu FragmentPagerAdapter llamaría MostViews para ser inflados y MostViews en sí llamaría MasanoryLayout para ser inflados. Así que escapamos del contexto FragmentPagerAdapter;)

  • Refrescar datos en RecyclerView y mantener su posición de desplazamiento
  • Cómo deshabilitar el desplazamiento de RecyclerView excepto programáticamente
  • Error al inflar la clase android.support.v7.widget.RecyclerView
  • Twowayview agrega automáticamente relleno al desplazarse
  • Android recyclerView findViewHolderForAdapterPosition devuelve null
  • Selección única en RecyclerView
  • RecyclerView GridLayoutManager: cómo detectar el recuento de span?
  • Recyclerview anidado se desplaza por sí mismo
  • RecyclerView se desplaza al final después de smoothScrollToPosition (0)
  • Cómo obtener el elemento del adaptador RecyclerView en Android
  • Decoración RecyclerView (con GridLayoutManager) para mostrar el divisor entre los elementos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.