tutorial studio personalizado elementos ejemplo dinamico desplegable crear con botones agregar java android

java - elementos - listview personalizado android studio ejemplo



Android ListView personalizado no puede hacer clic en los elementos (4)

El problema es que Android no te permite seleccionar elementos de la lista que tengan elementos que puedan enfocarse. Modifiqué la casilla de verificación en el elemento de la lista para tener un atributo como ese:

android:focusable="false"

Ahora mis elementos de lista que contienen casillas de verificación (funciona también para botones) son "seleccionables" en el sentido tradicional (se iluminan, puede hacer clic en cualquier parte de la lista y se disparará el controlador "onListItemClick", etc.).

EDITAR: Como una actualización, un comentarista mencionó "Solo una nota, después de cambiar la visibilidad del botón tuve que desactivar el foco de nuevo programáticamente".

Entonces tengo un objeto ListView personalizado. Los elementos de la lista tienen dos textviews apiladas una encima de la otra, más una barra de progreso horizontal que quiero permanecer oculto hasta que realmente haga algo. En el extremo derecho, hay una casilla de verificación que solo quiero mostrar cuando el usuario necesite descargar actualizaciones a sus bases de datos. Cuando deshabilito la casilla de verificación configurando la visibilidad en Visibility.GONE, puedo hacer clic en los elementos de la lista. Cuando la casilla de verificación está visible, no puedo hacer clic en ningún elemento de la lista, excepto las casillas de verificación. He hecho algunas búsquedas pero no he encontrado nada relevante para mi situación actual. Encontré esta pregunta pero estoy usando un ArrayAdapter reemplazado ya que estoy usando ArrayLists para contener la lista de bases de datos internamente. ¿Solo necesito obtener la vista de LinearLayout y agregar un onClickListener como lo hizo Tom? No estoy seguro.

Aquí está el XML de diseño de fila de la vista de lista:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="?android:attr/listPreferredItemHeight" android:padding="6dip"> <LinearLayout android:orientation="vertical" android:layout_width="0dip" android:layout_weight="1" android:layout_height="fill_parent"> <TextView android:id="@+id/UpdateNameText" android:layout_width="wrap_content" android:layout_height="0dip" android:layout_weight="1" android:textSize="18sp" android:gravity="center_vertical" /> <TextView android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="1" android:id="@+id/UpdateStatusText" android:singleLine="true" android:ellipsize="marquee" /> <ProgressBar android:id="@+id/UpdateProgress" android:layout_width="fill_parent" android:layout_height="wrap_content" android:indeterminateOnly="false" android:progressDrawable="@android:drawable/progress_horizontal" android:indeterminateDrawable="@android:drawable/progress_indeterminate_horizontal" android:minHeight="10dip" android:maxHeight="10dip" /> </LinearLayout> <CheckBox android:text="" android:id="@+id/UpdateCheckBox" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>

Y aquí está la clase que extiende ListActivity. Obviamente, todavía está en desarrollo, así que perdona las cosas que faltan o que pueden quedar por ahí:

public class UpdateActivity extends ListActivity { AccountManager lookupDb; boolean allSelected; UpdateListAdapter list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); lookupDb = new AccountManager(this); lookupDb.loadUpdates(); setContentView(R.layout.update); allSelected = false; list = new UpdateListAdapter(this, R.layout.update_row, lookupDb.getUpdateItems()); setListAdapter(list); Button btnEnterRegCode = (Button)findViewById(R.id.btnUpdateRegister); btnEnterRegCode.setVisibility(View.GONE); Button btnSelectAll = (Button)findViewById(R.id.btnSelectAll); btnSelectAll.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { allSelected = !allSelected; for(int i=0; i < lookupDb.getUpdateItems().size(); i++) { lookupDb.getUpdateItem(i).setSelected(!lookupDb.getUpdateItem(i).isSelected()); } list.notifyDataSetChanged(); // loop through each UpdateItem and set the selected attribute to the inverse } // end onClick }); // end setOnClickListener Button btnUpdate = (Button)findViewById(R.id.btnUpdate); btnUpdate.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { } // end onClick }); // end setOnClickListener lookupDb.close(); } // end onCreate @Override protected void onDestroy() { super.onDestroy(); for (UpdateItem item : lookupDb.getUpdateItems()) { item.getDatabase().close(); } } @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); UpdateItem item = lookupDb.getUpdateItem(position); if (item != null) { item.setSelected(!item.isSelected()); list.notifyDataSetChanged(); } } private class UpdateListAdapter extends ArrayAdapter<UpdateItem> { private List<UpdateItem> items; public UpdateListAdapter(Context context, int textViewResourceId, List<UpdateItem> items) { super(context, textViewResourceId, items); this.items = items; } @Override public View getView(int position, View convertView, ViewGroup parent) { View row = null; if (convertView == null) { LayoutInflater li = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); row = li.inflate(R.layout.update_row, null); } else { row = convertView; } UpdateItem item = items.get(position); if (item != null) { TextView upper = (TextView)row.findViewById(R.id.UpdateNameText); TextView lower = (TextView)row.findViewById(R.id.UpdateStatusText); CheckBox cb = (CheckBox)row.findViewById(R.id.UpdateCheckBox); upper.setText(item.getName()); lower.setText(item.getStatusText()); if (item.getStatusCode() == UpdateItem.UP_TO_DATE) { cb.setVisibility(View.GONE); } else { cb.setVisibility(View.VISIBLE); cb.setChecked(item.isSelected()); } ProgressBar pb = (ProgressBar)row.findViewById(R.id.UpdateProgress); pb.setVisibility(View.GONE); } return row; } } // end inner class UpdateListAdapter }

editar: todavía tengo este problema. Estoy engañando y agregando controladores de Click a las vistas de texto, pero parece extremadamente estúpido que mi función onListItemClick () no se llame cuando no hago clic en mi casilla de verificación.


En caso de que tenga ImageButton dentro del elemento de la lista, debe establecer el valor de descendantFocusability en ''blocksDescendants'' en el elemento elemento de la lista raíz.

android:descendantFocusability="blocksDescendants"

Y el indicador ImageButton en true en la vista de ImageButton .

android:focusableInTouchMode="true"


Tuve un problema similar y descubrí que el CheckBox es bastante quisquilloso en un ListView. Lo que sucede es que impone su voluntad en todo el ListItem, y reemplaza el onListItemClick. Es posible que desee implementar un manejador de clics para eso y también establecer la propiedad de texto para el CheckBox, en lugar de usar TextViews.

Yo diría que miren también este objeto View, puede funcionar mejor que el CheckBox

Vista de texto revisado


use esta línea en la vista raíz del elemento de la lista

android: descenddantFocusability = "bloquesDescendientes"