2012-06-28 33 views
1

我在一個活動中出現問題,該活動返回一個ListView或幾個ListViews的組合,並與Commonsware的MergeAdapter合併在一起。這是一項搜索活動,基於搜索查詢將返回1個或多個不同類別的結果。 當類別大於1時,我插入一個標題,這是另一個只有一行的ListView - 類別的名稱。帶有標題和MergeAdapter的可點擊ListView使應用程序崩潰onListItemClick

一些代碼:

public class FirstAdapter extends ArrayAdapter<Address> { 
public FirstAdapter (Context context, int resource, 
     int textViewResourceId, List<Address> objects) { 
    super(context, resource, textViewResourceId, objects); 
} 

public View getView (int position, View convertView, ViewGroup parent) { 
    View view = super.getView(position, convertView, parent); 
    Address location = this.getItem(position); 

    TextView textView = (TextView) view.findViewById(R.id.SearchResultTextAddress); 
    textView.setText(location.address); 

    return view; 
} 

}

然後,我有一個頭適配器:

public class HeaderAdapter extends ArrayAdapter<String> { 
private String header; 

public HeaderAdapter(Context context, int resource, 
     int textViewResourceId, String header) { 
    super(context, resource, textViewResourceId, new ArrayList<String>()); 

    this.header = header; 
} 

public void setVisible(boolean visible) { 
    if (visible) show(); 
    else hide(); 
} 

public void show() { 
    clear(); 
    add(this.header); 
} 

public void hide() { 
    clear(); 
} 

public View getView (int position, View convertView, ViewGroup parent) { 
    return super.getView(position, convertView, parent); 
} 

public String getHeader() { 
    return header; 
} 

public void setHeader(String header) { 
    this.header = header; 
} 

@Override 
public boolean isEnabled(int position) { 
    return false; 
} 

}

正如你可以看到只有在需要的時候顯示。 在我非常活動我有一個onListItemClick覆蓋:

@Override 
protected void onListItemClick(ListView listview, View view, int position, long id) { 
    super.onListItemClick(listview, view, position, id); 

    if (this.firstAdapter.getCount() > 0) { 
     position--; 
     if (position < this.firstAdapter.getCount()) onRepClick(this.firstAdapter.getItem(position)); 
     position = position - this.firstAdapter.getCount(); 
    } 

    if (this.secondAdapter.getCount() > 0) { 
     position--; 
     if (position < this.secondAdapter.getCount()) onAusschussClick(this.secondHeader.getItem(position)); 
     position = position - this.secondAdapter.getCount(); 
    } 

所以,一切工作正常,當我從一個適配器只有一個類別。當我有兩個結果的時候,我得到一個ArrayIndexOutOfBoundsException。我認爲我得到職位的邏輯是不正確的。任何想法將不勝感激,謝謝。

這裏是堆棧跟蹤:

06-28 12:56:54.291: E/AndroidRuntime(3963): FATAL EXCEPTION: main 
06-28 12:56:54.291: E/AndroidRuntime(3963): java.lang.ArrayIndexOutOfBoundsException 
06-28 12:56:54.291: E/AndroidRuntime(3963):  at java.util.ArrayList.get(ArrayList.java:313) 
06-28 12:56:54.291: E/AndroidRuntime(3963):  at android.widget.ArrayAdapter.getItem(ArrayAdapter.java:298) 
06-28 12:56:54.291: E/AndroidRuntime(3963):  at com.jasamer.callarep.SearchActivity.onListItemClick(SearchActivity.java:136) 
06-28 12:56:54.291: E/AndroidRuntime(3963):  at android.app.ListActivity$2.onItemClick(ListActivity.java:319) 
06-28 12:56:54.291: E/AndroidRuntime(3963):  at android.widget.AdapterView.performItemClick(AdapterView.java:284) 
06-28 12:56:54.291: E/AndroidRuntime(3963):  at android.widget.ListView.performItemClick(ListView.java:3513) 
06-28 12:56:54.291: E/AndroidRuntime(3963):  at android.widget.AbsListView$PerformClick.run(AbsListView.java:1849) 
06-28 12:56:54.291: E/AndroidRuntime(3963):  at android.os.Handler.handleCallback(Handler.java:587) 
06-28 12:56:54.291: E/AndroidRuntime(3963):  at android.os.Handler.dispatchMessage(Handler.java:92) 
06-28 12:56:54.291: E/AndroidRuntime(3963):  at android.os.Looper.loop(Looper.java:130) 
06-28 12:56:54.291: E/AndroidRuntime(3963):  at android.app.ActivityThread.main(ActivityThread.java:3835) 
06-28 12:56:54.291: E/AndroidRuntime(3963):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-28 12:56:54.291: E/AndroidRuntime(3963):  at java.lang.reflect.Method.invoke(Method.java:507) 
06-28 12:56:54.291: E/AndroidRuntime(3963):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847) 
06-28 12:56:54.291: E/AndroidRuntime(3963):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) 
06-28 12:56:54.291: E/AndroidRuntime(3963):  at dalvik.system.NativeStart.main(Native Method) 
+1

「我得到一個ArrayIndexOutOfBoundsException」 - 請發佈整個堆棧跟蹤。 – CommonsWare

+0

忘記將它添加到首位。現在編輯。 –

回答

1

那麼,解決方案出來是不同的,更簡單。在if語句,我不得不改變:if (position < this.firstAdapter.getCount())到follwing: if ((position < this.firstAdapter.getCount() && position >= 0))

這樣,我會確保沒有負數將有可能和指數就總是正確的,不管有多少頭有。

0

我想你需要一些elseonListItemClick()return邏輯。

假設position1firstAdapter.getCount()回報383,並secondAdapter.getCount()返回27。您將通過第一個if區塊(383大於0),您從position(現在爲0)中減去一個並對其進行處理。然後,您將通過第二個塊(27大於0),從position(現在爲-1)中減去一個塊,並且您將嘗試獲取-1元素。由於只有一行由position標識,因此只能在其中一個適配器中,而您現有的代碼不能處理該情況。

相關問題