Android ListView-Header占据第一位置(位置(0))

时间:2016-07-13 19:01:01

标签: android arrays listview indexoutofboundsexception

我有一个带标题的ListView。我知道标题会在我的ListView中使用position == 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();

然而,由于Header占据了第一个位置,当我点击第三个条目时,我在我的应用程序中获得了一个强制关闭。

我要感谢我对问题的每一个答案。

这是整个Click 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();
             }

         }
     });
 }

我得到的错误是:

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)

1 个答案:

答案 0 :(得分:0)

基本上,您将ListView位置/长度与array长度混合

<强>失败

正如您在问题中所说,您的ListView中有一个标题。然后,您的列表视图可能具有以下位置:

  • [0] - 标题
  • [1] - 第1项
  • [2] - Item2
  • [3] - Item3

但是,变量array可能只包含了项目。所以,你的数组就像:

  • [0] - 第1项
  • [1] - Item2
  • [2] - Item3

这样,如果下面的(array [position] == array [3])行会产生ArrayIndexOutOfBoundsException,因为array没有元素[3]。

<强>修正

您可以通过不同方式修复代码,例如:

  • 使用array创建lenght == 4并忽略位置[0]。

    这不好。您的数组将与ListView位置匹配。但是,您使用了不必要的内存。

  • 更改您的if / else

始终认为array从0变为2(而不是0到3)。它没有像ListView那样的4个元素。

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