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:
- RecyclerView con CollapsingToolbarLayout se desplaza mal cuando se lanza
- Horizontal RecyclerView interior vertical ScrollView
- Sdk mínimo para recycleview y pros / contras de reemplazar listas con ella
- Endless RecyclerView con ProgressBar para paginación
- ¿Deberíamos usar RecyclerView para reemplazar ListView?
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(); } });
- Efecto de ondulación de Android anulado por el estado seleccionado
- Marshmallow (23) + RecyclerView (23.1.0) el desplazamiento desordena el contenido de arriba después de eliminar el elemento (notifyItemRemoved)
- "LayoutManager ya está conectado a un RecyclerView" error
- Expandiendo / Colapsando CardView con un gesto de clic o de deslizamiento (Android)?
- Wrap_content en recycleview, toma altura del elemento (lista horizontal)
- ¿Hay alguna forma de habilitar las barras de desplazamiento para RecyclerView en código?
- Cómo ordenar Strings en un Android RecyclerView?
- Recyclerview con fondo de desplazamiento
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); } });
- Error de generación con Android Studio 3.0 Canary 4
- android: establece textColor con el atributo textAppearance