Come implementare un comportamento diverso quando l'utente fa clic su visualizzazioni diverse in un ListView?
-
29-10-2019 - |
Domanda
Non conosco lo sviluppo di Android, quindi questa è una specie di domanda di base.
Vorrei implementare lo stesso comportamento dell'app Contatti.Hai un ListView con una serie di contatti |icone del telefono.Lì hai un comportamento quando fai clic sul nome del contatto e un altro quando fai clic sull'icona del telefono.
Ecco il mio codice. Qualsiasi aiuto è molto apprezzato.
In sintesi, cosa c'è di sbagliato nell'approccio
switch (v.getId ()) { case R.id.imageButtonAction:
Corso di attività
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;
}**
}
});
}
Attività xml
<!-- 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>
Riga 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>
Soluzione 2
Nuovo approccio molto migliore per risolvere questo problema in modo elegante e con meno codice !!!
Con le seguenti modifiche, l'interfaccia utente è molto più reattiva, senza più problemi di doppio clic.:)
Molto, molto meno codice che semplicemente funziona!
Modifiche alla riga xml
Inserisci un layout lineare per racchiudere entrambi i file In questo layout lineare, inserisci un tag denominato android: onClick="editCompanyClick" Questo è il gestore dei clic che verrà chiamato nell'attività.
Inserisci un layout lineare per avvolgere il file In questo layout lineare, inserisci un tag denominato android: onClick="dialClick" Questo è il gestore dei clic che verrà chiamato nell'attività.
Modifiche alla classe di attività
Rimuovi il codice precedente
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));
}
});
}
Inserisci il codice
public void dialClick(View v) {
startActivity(new Intent(app, InstructionsActivity.class));
}
public void editCompanyClick(View v) {
startActivity(new Intent(app, EditMenuNavigationActivity.class));
record
}
Riga 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>
Altri suggerimenti
Il tuo callback onItemClick () riceve sia la vista specifica che la sua posizione (basata su 0), ognuna di queste può aiutarti a decidere quale vista è stata cliccata.La posizione è un indice degli elementi che hai aggiunto e per scenari più complicati puoi visualizzare.setTag (Object o) e utilizzare getTag () per recuperarlo dalla tua richiamata.
Ho finalmente trovato una soluzione. Questo risolve il problema.Ma ne aggiunge un altro.Come previsto, ListView ora si comporta in modo diverso quando l'utente fa clic su visualizzazioni diverse (TextView o ImageView). Ma sembra non rispondere.Devo "fare doppio clic" per attivare company.setOnClick o dial.setOnClick.Qualche suggerimento?
// Aggiungi azioni all'interazione dell'utente
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));
}
});
}