2016-07-13 2 views
0

У меня есть ListView с заголовком. Я знаю, что заголовок возьмет position == 0 в моем ListView.Android ListView-Header занимает первое место (позиция (0))

В моем массиве у меня есть 3 строки. Если заголовок занимает первое положение. Осталось 2 для моих массивов.

Обычно можно было бы написать:

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

, но я должен написать это:

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

Однако, поскольку заголовок занимает первую позицию, я получаю Force Close в мое приложение, когда я нажимаю на третьей записи.

Буду благодарен за каждый ответ на мой вопрос.

Это весь Нажмите Слушатель

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

     } 
    }); 
} 

Ошибка я получаю это:

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) 

ответ

0

В принципе, вы смешивание ListView положение/длину с длиной array

Сбой

Как вы сообщили в своем вопросе, у вас есть заголовок в вашем ListView. Тогда, вероятно, ваш вид списка имеет следующие позиции:

  • [0] - заголовок
  • [1] - Элемент1
  • [2] - Элемент2
  • [3] - Item3

Тем не менее, вы, переменная array, вероятно, имеют только предметы. Таким образом, ваш массив, как:

  • [0] - Элемент1
  • [1] - Элемент2
  • [2] - Item3

Таким образом, если (массив [положение] = = array [3]) приведет к созданию ArrayIndexOutOfBoundsException, так как array не имеет элемента [3].

Fix

Вы можете исправить свой код по-разному, например:

  • Создание array с lenght == 4 и игнорировать позицию [0].

    Это не хорошо. Ваш массив будет соответствовать позиции ListView. Тем не менее, вы используете ненужную память.

  • Измените ваши, если/еще

Просто всегда считают, что array от 0 до 2 (а не от 0 до 3). В нем нет 4 элементов, таких как ListView.

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

Правильное решение для вашего выпуска

Вам просто нужно обратиться к позиции щелкнул пользователем и принять меры, которые вы хотите ... Вам не нужно сравнивать с массивом. Итак, обновите свой код, как показано ниже:

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

Эй! Спасибо за Ваш ответ. Используя свой код, я больше не получаю ошибку, но теперь не имеет значения, какой элемент я нажимаю, каждый случай становится правдой. – Ketarr

+0

Извините .. Я забыл вставить перерыв ... Я обновил ответ – W0rmH0le

+0

Отлично! С линией прерывания он работает. Огромное спасибо. Не могли бы вы сказать мне, почему ваш метод работает, а мой не так ли? Было бы очень полезно для меня. – Ketarr

Смежные вопросы