¿Cómo implementar un comportamiento diferente cuando el usuario hace clic en diferentes vistas en un ListView?
-
29-10-2019 - |
Pregunta
Soy nuevo en el desarrollo de Android, así que esta es una pregunta básica.
Me gustaría implementar el mismo comportamiento que en la aplicación Contactos.Tiene un ListView con una serie de Contactos |iconos de teléfono.Ahí tienes un comportamiento cuando haces clic en el nombre del contacto y otro comportamiento cuando haces clic en el ícono del teléfono.
Aquí está mi código. Cualquier ayuda es muy apreciada.
En resumen, cuál es el problema del enfoque
switch (v.getId ()) { case R.id.imageButtonAction:
Clase de actividad
public class CompaniesActivity extends Activity {
MyApp app;
ListView listCompanies;
Cursor cursor;
// Adapter and its corresponding FROM and TO statements. The number and sequence of the arguments must match in FROM / TO arguments.
SimpleCursorAdapter adapter;
static final String[] FROM = { MenuNavigationData.C_COMPANY, MenuNavigationData.C_DESCRIPTION};
static final int[] TO = { R.id.textCompany, R.id.textDescription }; //
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.companies);
//Gets a reference to the application
app = (MyApp) getApplication();
// Find your views
listCompanies = (ListView) findViewById(R.id.listCompanies);
addButton = (Button) findViewById(R.id.buttonAdd);
// Add actions to user interaction
listCompanies.setOnItemClickListener(new OnItemClickListener() {
@Override
**public void onItemClick(AdapterView<?> arg0, View v, int position, long id) {
switch (v.getId()) {
case R.id.imageButtonAction:
startActivity(new Intent(app, InstructionsActivity.class));
break;
default:
int i = adapter.getItemViewType(position);
startActivity(new Intent(app, EditMenuNavigationActivity.class));
break;
}**
}
});
}
xml de actividad
<!-- Companies ListView-->
<ListView android:id="@+id/listView1" android:layout_height="wrap_content" android:layout_width="match_parent"></ListView>
<ListView
android:id="@+id/listCompanies"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:layout_weight="1"
android:background="#5555"/>
</LinearLayout>
Fila xml
android:background="#ffff"
android:padding="6dip">
<!-- Company TextView -->
<TextView
android:id="@+id/textCompany"
android:text="TIM"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:singleLine="true"
android:ellipsize="marquee"
android:textColor="#c000"
android:textStyle="bold"
android:textSize="25sp"/>
<!-- Description TextView -->
<TextView
android:id="@+id/textDescription"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_below="@id/textCompany"
android:layout_alignWithParentIfMissing="true"
android:layout_alignParentLeft="true"
android:singleLine="true"
android:ellipsize="marquee"
android:textColor="#c000"></TextView>
<!-- Action ImageView -->
<ImageView
android:id="@+id/imageButtonAction"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_gravity="right"
android:background="@drawable/icon"/>
</RelativeLayout>
Solución 2
¡¡¡Un nuevo enfoque mucho mejor para resolver este problema de forma elegante y con menos código !!!
Con las siguientes modificaciones, la interfaz de usuario es mucho más receptiva, no más problemas de doble clic.:)
¡Mucho, mucho menos código que simplemente funciona!
Modificaciones a Row xml
Inserte un diseño lineal para envolver tanto el En este diseño lineal, inserte una etiqueta llamada android: onClick="editCompanyClick" Este es el controlador de clics que se llamará en la actividad.
Inserte un diseño lineal para envolver el En este diseño lineal, inserte una etiqueta llamada android: onClick="dialClick" Este es el controlador de clics que se llamará en la actividad.
Modificaciones a la clase de actividad
Eliminar el código anterior
listCompanies.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView arg0, View v, int position, long id) {
TextView company = (TextView) v.findViewById(R.id.textCompany);
ImageView dial = (ImageView) v.findViewById(R.id.imageButtonDTMFDial);
company.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(app, EditMenuNavigationActivity.class));
}
});
dial.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(app, InstructionsActivity.class));
}
});
}
Inserta el código
public void dialClick(View v) {
startActivity(new Intent(app, InstructionsActivity.class));
}
public void editCompanyClick(View v) {
startActivity(new Intent(app, EditMenuNavigationActivity.class));
record
}
Fila 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="?android:attr/listPreferredItemHeight"
android:padding="6dip" android:orientation="horizontal">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/linearLayout1"
android:orientation="vertical"
android:onClick="editCompanyClick"
android:layout_weight="1">
<!-- Company TextView -->
<TextView android:singleLine="true" android:text="TIM" android:id="@+id/textCompany" android:ellipsize="marquee" android:layout_height="wrap_content" style="@android:style/TextAppearance.Medium" android:layout_width="match_parent" android:gravity="top"></TextView>
<!-- Description TextView -->
<TextView android:singleLine="true" android:text="Chamar atendente" android:id="@+id/textDescription" android:ellipsize="marquee" android:layout_height="wrap_content" style="@android:style/TextAppearance.Small" android:layout_width="match_parent" android:gravity="bottom"></TextView>
</LinearLayout>
<LinearLayout
android:layout_height="match_parent"
android:id="@+id/linearLayout2"
android:onClick="dialClick"
android:layout_width="wrap_content" android:layout_gravity="right">
<!-- DTMFDial ImageView -->
<ImageView android:layout_height="wrap_content" android:background="@drawable/icon" android:id="@+id/imageButtonDTMFDial" android:layout_gravity="right" android:layout_width="wrap_content"></ImageView>
</LinearLayout>
</LinearLayout>
Otros consejos
Su devolución de llamada onItemClick () recibe tanto la vista específica como su posición (basada en 0), cada una de estas puede ayudarlo a decidir en qué vista se hizo clic.La posición es un índice de los elementos que ha agregado y, para escenarios más complicados, puede ver.setTag (Objeto o) y usar getTag () para recuperarlo de su devolución de llamada.
Finalmente encontré una solución. Esto resuelve el problema.Pero agrega otro.Como era de esperar, ListView ahora se comporta de manera diferente cuando el usuario hace clic en diferentes vistas (TextView o ImageView). Pero parece que no responde.Tengo que "hacer doble clic" para activar company.setOnClick o dial.setOnClick.¿Alguna sugerencia?
// Agregue acciones a la interacción del usuario
listCompanies.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View v, int position, long id) {
TextView company = (TextView) v.findViewById(R.id.textCompany);
ImageView dial = (ImageView) v.findViewById(R.id.imageButtonDTMFDial);
company.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(app, EditMenuNavigationActivity.class));
}
});
dial.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(app, InstructionsActivity.class));
}
});
}