Wie implementiere ich ein anderes Verhalten, wenn der Benutzer in einer ListView auf verschiedene Ansichten klickt?

StackOverflow https://stackoverflow.com/questions/6392788

Frage

Ich bin neu in der Android-Entwicklung, daher ist dies eine grundlegende Frage.

Ich möchte das gleiche Verhalten wie in der Kontakte-App implementieren.Sie haben eine ListView mit einer Reihe von Kontakten |Telefonsymbole.Dort haben Sie ein Verhalten, wenn Sie auf den Kontaktnamen klicken, und ein anderes Verhalten, wenn Sie auf das Telefonsymbol klicken.

Hier ist mein Code. Jede Hilfe wird sehr geschätzt.

Zusammenfassend, was ist mit dem Ansatz falsch

switch (v.getId ()) { case R.id.imageButtonAction:

Aktivitätsklasse

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;
            }**

        }
    });

}

Aktivitäts-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>

Zeilen-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>

War es hilfreich?

Lösung 2

Neuer, viel besserer Ansatz, um dieses Problem elegant und mit weniger Code zu lösen !!!

Mit den folgenden Änderungen reagiert die Benutzeroberfläche viel schneller und es treten keine Doppelklickprobleme mehr auf.:)

Viel, viel weniger Code, der einfach funktioniert!

Änderungen an Zeile xml

Fügen Sie ein lineares Layout ein, um beide zu umbrechen Fügen Sie in dieses lineare Layout ein Tag mit dem Namen android ein: onClick="editCompanyClick" Dies ist der Klick-Handler, der in der Aktivität aufgerufen wird.

Fügen Sie ein lineares Layout ein, um das zu umbrechen Fügen Sie in dieses lineare Layout ein Tag mit dem Namen android ein: onClick="dialClick" Dies ist der Klick-Handler, der in der Aktivität aufgerufen wird.

Änderungen an der Aktivitätsklasse

Entfernen Sie den vorherigen Code

   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));
                }
            });
        }

Geben Sie den Code ein

public void dialClick(View v) {
        startActivity(new Intent(app, InstructionsActivity.class));
    }

    public void editCompanyClick(View v) {
        startActivity(new Intent(app, EditMenuNavigationActivity.class));
record
    }

Zeilen-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>

Andere Tipps

Ihr onItemClick () - Rückruf empfängt sowohl die spezifische Ansicht als auch deren Position (0-basiert). Jede dieser Informationen kann Ihnen bei der Entscheidung helfen, auf welche Ansicht geklickt wurde.Die Position ist ein Index für die Elemente, die Sie hinzugefügt haben. Für kompliziertere Szenarien können Sie set.ag (Objekt o) anzeigen und getTag () verwenden, um es aus Ihrem Rückruf abzurufen.

Ich habe endlich eine Lösung gefunden. Dies löst das Problem.Fügt aber noch einen hinzu.Wie erwartet verhält sich die ListView jetzt anders, wenn der Benutzer auf verschiedene Ansichten klickt (entweder TextView oder ImageView). Aber es scheint nicht zu reagieren.Ich muss "doppelklicken", um entweder company.setOnClick oder dial.setOnClick auszulösen.Irgendwelche Vorschläge?

// Aktionen zur Benutzerinteraktion hinzufügen

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));
                }
            });
        }

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top