2016-07-13 21 views
0

Ich habe eine ListView mit einer Kopfzeile. Ich weiß, dass Header in meinem ListView position == 0 übernehmen wird.Android ListView-Header nimmt erste Position (Position (0))

In meinem Array habe ich 3 Strings. Wenn der Header die erste Position einnimmt. Es sind 2 übrig für meine Arrays.

Normalerweise würden Sie schreiben:

if (array[position] == array[0]) { 
    Toast.makeText(UserAreaActivity.this, "You've selected the first Array-String, Toast.LENGTH_SHORT).show(); 

aber ich habe dies schreiben:

if (array[position] == array[1]) { 
    Toast.makeText(UserAreaActivity.this, "You've selected the first Array-String, Toast.LENGTH_SHORT).show(); 

Da jedoch Kopf die erste Position nimmt, habe ich eine Force Close in meiner app bekommen, wenn ich klicken auf dem dritten Eintrag.

Ich wäre dankbar für jede einzelne Antwort auf meine Frage.

Das ist das ganze Klick-Listener

private void addDrawerItems() { 
    final String[] array = { "Earn Coins", "Get Likes", "Logout"}; 
    mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, array); 

    View header = getLayoutInflater().inflate(R.layout.header, null, false); 
    mDrawerList.addHeaderView(header, "null", false); 
    mDrawerList.setAdapter(mAdapter); 

    mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      if(array[position]==array[1]){ 
       Toast.makeText(UserAreaActivity.this, "You've selected Earn Coins!", Toast.LENGTH_SHORT).show(); 
       Intent intent = new Intent(UserAreaActivity.this, UserAreaActivity.class); 
       UserAreaActivity.this.startActivity(intent); 
      }else if(array[position]==array[2]){ 
       Toast.makeText(UserAreaActivity.this, "You've selected Get Likes!", Toast.LENGTH_SHORT).show(); 
       Intent intent = new Intent(UserAreaActivity.this, GetLikesActivity.class); 
       UserAreaActivity.this.startActivity(intent); 
      }else if(array[position]==array[3]){ 
       Toast.makeText(UserAreaActivity.this, "You've selected Logout!", Toast.LENGTH_SHORT).show(); 
       Intent intent = new Intent(UserAreaActivity.this,LoginActivity.class); 
       UserAreaActivity.this.startActivity(intent); 
      }else{ 
       Toast.makeText(UserAreaActivity.this,"Whatever..",Toast.LENGTH_SHORT).show(); 
      } 

     } 
    }); 
} 

Der Fehler ich erhalte, ist dies:

java.lang.ArrayIndexOutOfBoundsException: length=3; index=3 
    at de.enesak.likelounge.UserAreaActivity$1.onItemClick(UserAreaActivity.java:59) 
    at android.widget.AdapterView.performItemClick(AdapterView.java:299) 
    at android.widget.AbsListView.performItemClick(AbsListView.java:1113) 
    at android.widget.AbsListView$PerformClick.run(AbsListView.java:2904) 
    at android.widget.AbsListView$3.run(AbsListView.java:3638) 
    at android.os.Handler.handleCallback(Handler.java:733) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5017) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
    at dalvik.system.NativeStart.main(Native Method) 

Antwort

0

Grundsätzlich mischen Sie die ListView Position/Länge mit array Länge

Fehler

Wie Sie in Ihrer Frage informiert haben, haben Sie einen Header in Ihrem ListView. Dann wahrscheinlich, hat Ihre Listenansicht folgende Positionen:

  • [0] - Kopf
  • [1] - element1
  • [2] - Element2
  • [3] - Item3

Allerdings hat die Variable array wahrscheinlich nur die Items. Also, Ihr Array ist wie:

  • [0] - element1
  • [1] - Element2
  • [2] - Item3

diese Weise, wenn (array [Position] = = array [3]) Zeile unten erzeugt ArrayIndexOutOfBoundsException weil array kein Element [3] hat.

Fix

Sie Ihren Code auf unterschiedliche Weise beheben können, wie:

  • ein array mit lenght == 4 Erstellen und Position ignorieren [0].

    Das ist nicht gut. Ihr Array wird mit der ListView-Position übereinstimmen. Sie haben jedoch einen unnötigen Speicher verwendet.

  • Ihre ändern if/else

Einfach immer der Meinung, dass array von 0 bis 2 geht (und nicht von 0 bis 3). Es hat nicht 4 Elemente wie Ihr ListView.

if(array[position]==array[0]){ 
    // code 
} else if(array[position]==array[1]){ 
    // code 
} if(array[position]==array[2]){ 
    // code 
} else { 
    // code 
} 

Richtige Lösung für Ihr Problem

Sie müssen nur die Position von Benutzer und nehmen Sie die Aktion geklickt konsultieren, die Sie möchten ... Sie müssen nicht mit Ihrem Array zu vergleichen. Also, aktualisieren Sie Ihren Code wie folgt:

mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

      switch (position) { 
      case 1: { 
       Toast.makeText(UserAreaActivity.this, "You've selected Earn Coins!", Toast.LENGTH_SHORT).show(); 
       Intent intent = new Intent(UserAreaActivity.this, UserAreaActivity.class); 
       UserAreaActivity.this.startActivity(intent); 
       break; 
      } 
      case 2: { 
       Toast.makeText(UserAreaActivity.this, "You've selected Get Likes!", Toast.LENGTH_SHORT).show(); 
       Intent intent = new Intent(UserAreaActivity.this, GetLikesActivity.class); 
       UserAreaActivity.this.startActivity(intent); 
       break; 
      } 
      case 3: { 
       Toast.makeText(UserAreaActivity.this, "You've selected Logout!", Toast.LENGTH_SHORT).show(); 
       Intent intent = new Intent(UserAreaActivity.this,LoginActivity.class); 
       UserAreaActivity.this.startActivity(intent); 
       break; 
      } 
      default: 
       // Header 
       Toast.makeText(UserAreaActivity.this,"Whatever..",Toast.LENGTH_SHORT).show(); 
       break; 
     } 
    } 
}); 
+0

Hey! Danke für deine Antwort. Durch die Verwendung deines Codes erhalte ich den Fehler nicht mehr, aber jetzt ist es egal, auf welchen Gegenstand ich klicke, jeder Fall wird wahr. – Ketarr

+0

Entschuldigung .. Ich habe vergessen, Pause ... Ich habe die Antwort aktualisiert – W0rmH0le

+0

Perfekt! Mit der Bruchlinie funktioniert es. Ich danke dir sehr. Könnten Sie mir vielleicht sagen, warum Ihre Methode funktioniert und meine nicht? Wäre wirklich hilfreich für mich. – Ketarr