varias usar trucos seleccionar proteger para lista hacer google desplegable dependiente como celular celdas android expandablelistview indicator

usar - seleccionar varias celdas en excel android



Vista de lista desplegable mueve el indicador de icono de grupo a la derecha (16)

Con respecto a la vista de lista expandible, el indicador de icono de grupo está ubicado en el lado izquierdo, ¿puedo mover el indicador y colocarlo a la derecha? Gracias.

EDITADO: dado que no quiero extender la vista, obtuve esta solución para obtener el ancho de manera dinámica. Solo compartiendo mi solución.

Display newDisplay = getWindowManager().getDefaultDisplay(); int width = newDisplay.getWidth(); newListView.setIndicatorBounds(width-50, width);


El setIndicatorBounds(int left, int right) se utiliza para establecer los límites del indicador para la vista de grupo de un ExpandableListView .

explvList.setIndicatorBounds(width-GetDipsFromPixel(35), width-GetDipsFromPixel(5));

Aquí ancho significa ancho del dispositivo.

Convertir píxel a inmersión:

public int GetDipsFromPixel(float pixels){ // Get the screen''s density scale final float scale = getResources().getDisplayMetrics().density; // Convert the dps to pixels, based on density scale return (int) (pixels * scale + 0.5f); }


Encontrado de esta manera para obtener el indicador en el lado derecho.

<ExpandableListView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/expandableListView" android:indicatorLeft="320dp" />


Escriba este código en el adaptador de base ampliable.

@Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { ImageView imgs; String headerTitle = (String) getGroup(groupPosition); if (convertView == null) { LayoutInflater infalInflater = (LayoutInflater) this._context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = infalInflater.inflate(R.layout.list_group, null); } TextView lblListHeader = (TextView) convertView .findViewById(R.id.lblListHeader); imgs = (ImageView) convertView .findViewById(R.id.img_list); lblListHeader.setTypeface(null, Typeface.BOLD); lblListHeader.setText(headerTitle); if (isExpanded) { imgs.setImageResource(R.drawable.up_arrow); } else { imgs.setImageResource(R.drawable.downs_arrow); } return convertView; }

  • Artículo de lista

Estoy utilizando la siguiente pieza corta inspirada en esta muestra que requiere dos elementos dibujables en la carpeta:

if (isExpanded) { ListHeader.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.up, 0); } else { ListHeader.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.down, 0); }

De todos modos, tuve que adoptar la solución de goodKode "para deshacerme" de las flechas predeterminadas.

Por lo tanto, le aconsejo que se quede con la solución simple que se proporcionó anteriormente, ya que es el enfoque más minimalista y preciso.


Intenté usar setIndicatorBounds y setIndicatorBoundsRelative, pero el ícono no se mostró tan bien como esperaba. Así que cambio mi código de la siguiente manera:

crea un diseño de grupo:

<?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="48dp" android:background="@drawable/header_selector" > <ImageView android:id="@+id/icon" android:layout_width="25dp" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:layout_marginLeft="12dp" android:layout_marginRight="12dp" android:contentDescription="@string/desc_list_item_icon" android:src="@drawable/ic_home" /> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_toRightOf="@id/icon" android:gravity="center_vertical" android:minHeight="?android:attr/listPreferredItemHeightSmall" android:paddingRight="40dp" android:textAppearance="?android:attr/textAppearanceListItemSmall" android:textColor="@color/list_item_title" /> <TextView android:id="@+id/counter" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginRight="8dp" android:background="@drawable/counter_bg" android:textColor="@color/counter_text_color" /> <ImageView android:id="@+id/icon_expand" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="200dp" android:layout_toRightOf="@+id/counter" android:contentDescription="@string/desc_list_item_icon" android:src="@drawable/navigation_expand" android:visibility="visible" /> <ImageView android:id="@+id/icon_collapse" android:layout_width="25dp" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="200dp" android:layout_toRightOf="@+id/counter" android:contentDescription="@string/desc_list_item_icon" android:src="@drawable/navigation_collapse" android:visibility="gone" /> </RelativeLayout>

y usando este diseño en la clase de adaptador dentro del método getGroupView:

@Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { NavDrawerItem itemHeader = (NavDrawerItem) getGroup(groupPosition); LayoutInflater inflater = (LayoutInflater) this.context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = null; if (convertView == null) { view = (View) inflater.inflate(R.layout.drawer_header_item, null); } else { view = convertView; } ImageView icon = (ImageView) view.findViewById(R.id.icon); if (itemHeader.isIconVisible()) { icon.setImageResource(itemHeader.getIcon()); } else { icon.setVisibility(View.GONE); } TextView textTitle = (TextView) view.findViewById(R.id.title); textTitle.setText(" " + itemHeader.getTitle()); TextView textCount = (TextView) view.findViewById(R.id.counter); if (itemHeader.getCounterVisibility()) { textCount.setText(itemHeader.getCount()); } else { textCount.setVisibility(View.GONE); } ImageView iconExpand = (ImageView) view.findViewById(R.id.icon_expand); ImageView iconCollapse = (ImageView) view .findViewById(R.id.icon_collapse); if (isExpanded) { iconExpand.setVisibility(View.GONE); iconCollapse.setVisibility(View.VISIBLE); } else { iconExpand.setVisibility(View.VISIBLE); iconCollapse.setVisibility(View.GONE); } if (getChildrenCount(groupPosition) == 0) { iconExpand.setVisibility(View.GONE); iconCollapse.setVisibility(View.GONE); } return view; }

Con este método, puede ajustar la posición del icono expandir / colapsar correctamente. Espero eso ayude.


Intente esto ... este código para ajustar el indicador del grupo ExpandableList en el lado derecho de la vista.

private ExpandableListView expandableListView; DisplayMetrics metrics; int width; metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); width = metrics.widthPixels; expandableListView = (ExpandableListView) findViewById(R.id.expandableListView1); expandableListView.setIndicatorBounds(width - GetDipsFromPixel(50), width - GetDipsFromPixel(10));

Y llama a este método,

public int GetDipsFromPixel(float pixels) { // Get the screen''s density scale final float scale = getResources().getDisplayMetrics().density; // Convert the dps to pixels, based on density scale return (int) (pixels * scale + 0.5f); }

El resultado es..


La mejor forma de hacerlo es a continuación, pero no con toda la versión de Android. Utilice el segundo o tercer método especificado a continuación.

ViewTreeObserver vto = mExpandableListView.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { mExpandableListView.setIndicatorBounds(mExpandableListView.getRight()- 40, mExpandableListView.getWidth()); } });

o esto:

@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); mExpandableListView.setIndicatorBounds(mExpandableListView.getRight()- 40, mExpandableListView.getWidth()); }

moverá ese indicador a la derecha de la vista de lista incluso en el dispositivo y en la pestaña también.

o puedes hacer esto en un hilo post retrasado.

(new Handler()).post(new Runnable() { @Override public void run() { mExpandableListView.setIndicatorBounds(mExpandableListView.getRight()- 40, mExpandableListView.getWidth()); } });


Primero configure android: groupIndicator = "@ null" en su lista desplegable de la siguiente manera:

luego en el diseño de su encabezado como se muestra a continuación:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="@dimen/screen_margin" android:paddingRight="@dimen/screen_margin" android:paddingTop="@dimen/dot_margin" android:paddingBottom="@dimen/dot_margin" android:orientation="vertical"> <TextView android:id="@+id/tvQuestion" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="what is jodi?" android:textColor="@color/textColor" android:textSize="@dimen/font_large" app:customFont="@string/font_toolbar" android:layout_toLeftOf="@+id/imgDropDown" android:layout_marginRight="@dimen/margin" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imgDropDown" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:src="@drawable/right_arrow"/> </RelativeLayout>

Por último, agregue esto en su adaptador en el método getGroupView a continuación:

TextView lblListHeader = (TextView) convertView.findViewById(R.id.tvQuestion); lblListHeader.setText(headerTitle); ImageView img=convertView.findViewById(R.id.imgDropDown); if (isExpanded) { img.setImageResource(R.drawable.down_arrow); lblListHeader.setTextColor(_context.getResources().getColor(R.color.colorPrimary)); } else { img.setImageResource(R.drawable.right_arrow); lblListHeader.setTextColor(_context.getResources().getColor(R.color.textColor)); }


Sé que es demasiado tarde, pero aquí hay una solución para poner el indicador a la derecha de forma programática, simple y fácil de usar:

expandableListView = (ExpandableListView) findViewById(R.id.expandableListView); Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int width = size.x; Resources r = getResources(); int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, r.getDisplayMetrics()); if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { expandableListView.setIndicatorBounds(width - px, width); } else { expandableListView.setIndicatorBoundsRelative(width - px, width); }

donde expandableListView es su ExpandableListview


si está en Fragment - onViewCreated ()

ViewTreeObserver vto = Expnlist.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Expnlist.setIndicatorBounds(Expnlist.getMeasuredWidth() - 80, Expnlist.getMeasuredWidth()); } });

¡me funciona! ¡Aclamaciones!


¡Toda la solución XML! Encontré una mejor manera de abordar este problema. Esto no requiere que te metas con las métricas de la pantalla, no hay necesidad de hackearlo programáticamente.

Esto es lo que necesitas hacer:

1) establecer la dirección del diseño de derecha a izquierda

<ExpandableListView ... android:layoutDirection="rtl" />

2) asegúrese de que el diseño de su elemento de lista incluye esto (sí, necesitará un diseño personalizado):

android:gravity="left" //to adjust the text to align to the left again android:layoutDirection="ltr" //OR this line, based on your layout

¡Y estás listo para ir!


Expandable list view move group icon indicator to right

El setIndicatorBounds(int left, int right) se utiliza para establecer los límites del indicador para la vista de grupo de una vista de lista expandable .

explvList.setIndicatorBounds(width-GetDipsFromPixel(35), width-GetDipsFromPixel(5));

Aquí ancho significa ancho del dispositivo.

/Convert pixel to dip public int GetDipsFromPixel(float pixels) { // Get the screen''s density scale final float scale = getResources().getDisplayMetrics().density; // Convert the dps to pixels, based on density scale return (int) (pixels * scale + 0.5f); }

FYI : El ancho es igual al ancho especificado en el setBounds method . Aquí en mi fragmento es 35. Otro sabio el icono está perturbado. Para más detalles, puede visitar aquí

https://developer.android.com/reference/android/widget/ExpandableListView.html#setIndicatorBounds(int , int)

https://developer.android.com/reference/android/widget/ExpandableListView.html#setIndicatorBoundsRelative(int , int)


setIndicatorBounds (int, int) no funciona correctamente para Android 4.3. Introdujeron un nuevo método setIndicatorBoundsRelative (int, int) que funciona bien para 4.3.

@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { mExpandableListView.setIndicatorBounds(myLeft, myRight); } else { mExpandableListView.setIndicatorBoundsRelative(myLeft, myRight); } }


De acuerdo con el código fuente de ExpandableListView , la única forma de mover un indicador hacia el lado derecho es cambiar sus límites usando el método ExpandableListView.setIndicatorBounds() . Puede calcular el límite en el método onSizeChanged() , por ejemplo.


DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); int width = metrics.widthPixels; mExpandableList = (ExpandableListView)findViewById(R.id.expandable_list); mExpandableList.setIndicatorBounds(width - GetPixelFromDips(50), width - GetPixelFromDips(10)); public int GetPixelFromDips(float pixels) { // Get the screen''s density scale final float scale = getResources().getDisplayMetrics().density; // Convert the dps to pixels, based on density scale return (int) (pixels * scale + 0.5f); }

este funcionó para mí


FIX:

Introdujeron un nuevo método en la API 18 en adelante, un método llamado setIndicatorBoundsRelative (int, int). Debes consultar la versión de Android y usar los métodos respectivos con la API:

expListView = (ExpandableListView) v.findViewById(R.id.laptop_list); metrics = new DisplayMetrics(); getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics); width = metrics.widthPixels; if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { expListView.setIndicatorBounds(width - GetDipsFromPixel(50), width - GetDipsFromPixel(10)); } else { expListView.setIndicatorBoundsRelative(width - GetDipsFromPixel(50), width - GetDipsFromPixel(10)); }