Recyclerview, no puedo obtener la vista del elemento con getChildAt (posición). Referencia de objeto nulo

Estoy usando un recyclerView dentro de mi cajón de la navegación y estoy utilizando esta biblioteca Twoway-view para conseguir la ayuda del tecleo y de la selección.

Funciona perfectamente y puedo cambiar el color del texto y de los iconos sin problemas dentro del método de OnClick para cada posición:

itemClickSupport.setOnItemClickListener(new ItemClickSupport.OnItemClickListener() { @Override public void onItemClick(RecyclerView parent, View view, int position, long id) { TypedValue typedValue = new TypedValue(); MainActivity.this.getTheme().resolveAttribute(R.attr.colorAccent, typedValue, true); final int color = typedValue.data; //TODO Icon and text colors for (int i = 0; i < drawerTitles.length; i++){ if (i == position){ ImageView imageViewDrawerIcon = (ImageView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.imageViewDrawerIcon); TextView textViewDrawerTitle = (TextView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.textViewDrawerItemTitle); imageViewDrawerIcon.setColorFilter(color); if(Build.VERSION.SDK_INT > 15){ imageViewDrawerIcon.setImageAlpha(255); }else{ imageViewDrawerIcon.setAlpha(255); } textViewDrawerTitle.setTextColor(color); RelativeLayout relativeLayoutDrawerItem = (RelativeLayout) recyclerViewDrawer.getChildAt(i).findViewById(R.id.relativeLayoutDrawerItem); relativeLayoutDrawerItem.setFocusableInTouchMode(true); }else{ ImageView imageViewDrawerIcon = (ImageView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.imageViewDrawerIcon); TextView textViewDrawerTitle = (TextView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.textViewDrawerItemTitle); imageViewDrawerIcon.setColorFilter(getResources().getColor(R.color.md_text)); if(Build.VERSION.SDK_INT > 15){ imageViewDrawerIcon.setImageAlpha(138); }else{ imageViewDrawerIcon.setAlpha(138); } textViewDrawerTitle.setTextColor(getResources().getColor(R.color.md_text)); RelativeLayout relativeLayoutDrawerItem = (RelativeLayout) recyclerViewDrawer.getChildAt(i).findViewById(R.id.relativeLayoutDrawerItem); relativeLayoutDrawerItem.setFocusableInTouchMode(false); } } //TODO Fragments (closedrawers before setfragment) final Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { // Do something after some time } }, 250); mDrawerLayout.closeDrawers(); } }); 

El problema es que quiero acceder al primer elemento como en ese método, pero antes de él (para establecer el primer elemento seleccionado, con diferentes colores, etc).

Pero consigo un desplome (referencia nula) cuando intento conseguir el primer artículo fuera del método de OnClick:

 ImageView imageViewDrawerIcon = (ImageView) recyclerViewDrawer.getChildAt(0).findViewById(R.id.imageViewDrawerIcon); 

Todo el código:

 // Setup RecyclerView inside drawer recyclerViewDrawer = (RecyclerView) findViewById(R.id.recyclerViewDrawer); recyclerViewDrawer.setHasFixedSize(true); recyclerViewDrawer.setLayoutManager(new LinearLayoutManager(MainActivity.this)); ArrayList<DrawerItem> drawerItems = new ArrayList<>(); final String[] drawerTitles = getResources().getStringArray(R.array.drawer); final TypedArray drawerIcons = getResources().obtainTypedArray(R.array.drawerIcons); for (int i = 0; i < drawerTitles.length; i++) { drawerItems.add(new DrawerItem(drawerTitles[i], drawerIcons.getDrawable(i))); } drawerIcons.recycle(); adapterDrawer = new DrawerAdapter(drawerItems); recyclerViewDrawer.setAdapter(adapterDrawer); // Here is the problem ImageView imageViewDrawerIcon2 = (ImageView) recyclerViewDrawer.getChildAt(0).findViewById(R.id.imageViewDrawerIcon); // RecyclerView item listener. ItemClickSupport itemClickSupport = ItemClickSupport.addTo(recyclerViewDrawer); itemClickSupport.setOnItemClickListener(new ItemClickSupport.OnItemClickListener() { @Override public void onItemClick(RecyclerView parent, View view, int position, long id) { TypedValue typedValue = new TypedValue(); MainActivity.this.getTheme().resolveAttribute(R.attr.colorAccent, typedValue, true); final int color = typedValue.data; //TODO Icon and text colors for (int i = 0; i < drawerTitles.length; i++){ if (i == position){ ImageView imageViewDrawerIcon = (ImageView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.imageViewDrawerIcon); TextView textViewDrawerTitle = (TextView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.textViewDrawerItemTitle); imageViewDrawerIcon.setColorFilter(color); if(Build.VERSION.SDK_INT > 15){ imageViewDrawerIcon.setImageAlpha(255); }else{ imageViewDrawerIcon.setAlpha(255); } textViewDrawerTitle.setTextColor(color); RelativeLayout relativeLayoutDrawerItem = (RelativeLayout) recyclerViewDrawer.getChildAt(i).findViewById(R.id.relativeLayoutDrawerItem); relativeLayoutDrawerItem.setFocusableInTouchMode(true); }else{ ImageView imageViewDrawerIcon = (ImageView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.imageViewDrawerIcon); TextView textViewDrawerTitle = (TextView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.textViewDrawerItemTitle); imageViewDrawerIcon.setColorFilter(getResources().getColor(R.color.md_text)); if(Build.VERSION.SDK_INT > 15){ imageViewDrawerIcon.setImageAlpha(138); }else{ imageViewDrawerIcon.setAlpha(138); } textViewDrawerTitle.setTextColor(getResources().getColor(R.color.md_text)); RelativeLayout relativeLayoutDrawerItem = (RelativeLayout) recyclerViewDrawer.getChildAt(i).findViewById(R.id.relativeLayoutDrawerItem); relativeLayoutDrawerItem.setFocusableInTouchMode(false); } } //TODO Fragments (closedrawers before setfragment) final Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { // Do something after some time } }, 250); mDrawerLayout.closeDrawers(); } }); 

Resolví finalmente con esta ( fuente ):

 recyclerViewDrawer.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { ImageView imageViewDrawerIcon = (ImageView) recyclerViewDrawer.getChildAt(0).findViewById(R.id.imageViewDrawerIcon); TextView textViewDrawerTitle = (TextView) recyclerViewDrawer.getChildAt(0).findViewById(R.id.textViewDrawerItemTitle); imageViewDrawerIcon.setColorFilter(color); if (Build.VERSION.SDK_INT > 15) { imageViewDrawerIcon.setImageAlpha(255); } else { imageViewDrawerIcon.setAlpha(255); } textViewDrawerTitle.setTextColor(color); RelativeLayout relativeLayoutDrawerItem = (RelativeLayout) recyclerViewDrawer.getChildAt(0).findViewById(R.id.relativeLayoutDrawerItem); relativeLayoutDrawerItem.setFocusableInTouchMode(true); // unregister listener (this is important) recyclerViewDrawer.getViewTreeObserver().removeGlobalOnLayoutListener(this); } }); 

Por cierto, si alguien tiene una solución mejor me gustaría saberlo.

En mi caso, es un trabajo como un encanto

 View viewItem = recycleView.getLayoutManager().findViewByPosition(position); View icon = viewItem.findViewById(R.id.view); 

Usar findViewHolderForAdapterPosition () o findViewByPosition ( ) en lugar de otro para encontrar la opinión de la raíz en ese índice. Sin embargo, la forma de asegurar que los datos se cargan depende de usted.

Esto funcionó para mí.

 recyclerView.post(new Runnable() { @Override public void run() { View viewItem = recycleView.getLayoutManager().findViewByPosition(position); View icon = viewItem.findViewById(R.id.view); } }); 
  • GetAdapterPosition () no devuelve la posición del elemento en RecyclerView
  • Android: Cómo implementar una galería de imágenes con RecyclerView
  • RecyclerView falta
  • ¿Cómo centrar los elementos de una revista de reciclaje?
  • Android RecyclerView crea y enlaza todas las vistas en el cambio de conjunto de datos
  • Animar transiciones de elementos compartidos usando fragmentos de Android parece ser una pesadilla
  • RecyclerView ItemTouchHelper borrar eliminar animación
  • StaggeredGridLayoutManager y elementos en movimiento
  • ¿Cómo desplazarse a la parte inferior de un RecyclerView? ScrollToPosition no funciona
  • "RecyclerView: No hay adaptador conectado; Omitir el diseño "para recyclerview en el fragmento
  • Quitar todos los artículos de RecyclerView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.