2012-12-24 105 views
1

我在OnCreate方法上調用以下方法setupAdapter();無法在列表視圖中添加標題Android

private void setupAdapter() { 

    // set the list adapter 
    JSONArray returnArray = null; 
    try { 
     returnArray = getQuickViewContents(); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

    JSONObject obj0 = null; 
    if (returnArray != null) { 
     try { 
      obj0 = returnArray.getJSONObject(0); 

     } catch (JSONException e) { 
      e.printStackTrace(); 

     } 
    } 
    try { 
     getCreditCardDetails(); 
    } catch (JSONException e3) { 
     e3.printStackTrace(); 
    } 

    JSONArray productArray = null; 
    try { 
     productArray = obj0.getJSONArray("Content"); 
    } catch (JSONException e2) { 
     e2.printStackTrace(); 
    } 

    ArrayList<HashMap<String, String>> productList = new ArrayList<HashMap<String, String>>(); 



    if (productArray != null) { 

     ListView lv = (ListView) findViewById(android.R.id.list); 

     for (int i = 0; i < productArray.length(); i++) { 

      // creating new HashMap 
      HashMap<String, String> map = new HashMap<String, String>(); 

      // adding each child node to HashMap 
      try { 
       map.put(KEY_BRAND, 
         productArray.getJSONObject(i).getString("Brand")); 
       map.put(KEY_QUANTITY_NAME, productArray.getJSONObject(i) 
         .getString("Quantity") 
         + " X " 
         + productArray.getJSONObject(i).getString("Name")); 
       map.put(KEY_PRICE, Currency.britishPound 
         + productArray.getJSONObject(i) 
           .getString("MinCost")); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

      // adding HashList to ArrayList 
      productList.add(map); 


      adapter = new APIQuickCheckoutProductProvider(APIQuickCheckout.this, productList); 
      lv.addHeaderView(headerMethod()); 


      lv.setAdapter(adapter); 
      adapter.notifyDataSetChanged(); 

     } 
    } 
} 

private View headerMethod() { 

    View header = getLayoutInflater().inflate(R.layout.api_quick_checkout_header, null); 
    card_cvv = (EditText) header.findViewById(R.id.api_quick_checkout_card_cvv); 

    Button edit_payment_details = (Button) header.findViewById(R.id.edit_button_payment); 
    edit_payment_details.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      final Intent i = new Intent(APIQuickCheckout.this,APIPaymentDetails.class); 
      startActivity(i); 
     } 
    }); 

    // set the payment info layout 
    TextView card_number = (TextView) header.findViewById(R.id.api_quick_checkout_card_number); 
    TextView card_expiry = (TextView) header.findViewById(R.id.api_quick_checkout_card_expiry); 
    try { 
     card_number.setText(CheckoutManager.getInstance().getSelectedPaymentCard().getString("cardNumber")); 
     card_expiry.setText(CheckoutManager.getInstance().getSelectedPaymentCard().getString("expDate")); 
    } catch (Exception e1) { 
     e1.printStackTrace(); 
    } 

    return header; 

} 

而且堆棧跟蹤

12-24 17:31:17.805: E/AndroidRuntime(31051): FATAL EXCEPTION: main 
12-24 17:31:17.805: E/AndroidRuntime(31051): java.lang.RuntimeException: Unable to start  activity ComponentInfo{apicheckout.APIQuickCheckout}: java.lang.IllegalStateException: Cannot add header view to list -- setAdapter has already been called. 
12-24 17:31:17.805: E/AndroidRuntime(31051): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 
12-24 17:31:17.805: E/AndroidRuntime(31051): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
12-24 17:31:17.805: E/AndroidRuntime(31051): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
12-24 17:31:17.805: E/AndroidRuntime(31051): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
12-24 17:31:17.805: E/AndroidRuntime(31051): at android.os.Handler.dispatchMessage(Handler.java:99) 
12-24 17:31:17.805: E/AndroidRuntime(31051): at android.os.Looper.loop(Looper.java:130) 
12-24 17:31:17.805: E/AndroidRuntime(31051): at android.app.ActivityThread.main(ActivityThread.java:3683) 
12-24 17:31:17.805: E/AndroidRuntime(31051): at java.lang.reflect.Method.invokeNative(Native Method) 
12-24 17:31:17.805: E/AndroidRuntime(31051): at java.lang.reflect.Method.invoke(Method.java:507) 
12-24 17:31:17.805: E/AndroidRuntime(31051): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
12-24 17:31:17.805: E/AndroidRuntime(31051): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
12-24 17:31:17.805: E/AndroidRuntime(31051): at dalvik.system.NativeStart.main(Native Method) 
12-24 17:31:17.805: E/AndroidRuntime(31051): Caused by: java.lang.IllegalStateException: Cannot add header view to list -- setAdapter has already been called. 
12-24 17:31:17.805: E/AndroidRuntime(31051): at android.widget.ListView.addHeaderView(ListView.java:279) 
12-24 17:31:17.805: E/AndroidRuntime(31051): at android.widget.ListView.addHeaderView(ListView.java:302) 
12-24 17:31:17.805: E/AndroidRuntime(31051): at apicheckout.APIQuickCheckout.setupAdapter(APIQuickCheckout.java:192) 
12-24 17:31:17.805: E/AndroidRuntime(31051): at apicheckout.APIQuickCheckout.onCreate(APIQuickCheckout.java:121) 
12-24 17:31:17.805: E/AndroidRuntime(31051): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
12-24 17:31:17.805: E/AndroidRuntime(31051): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 
12-24 17:31:17.805: E/AndroidRuntime(31051): ... 11 more 

所有我想要做的是增加作爲報頭中的headerMethod的內容。我究竟做錯了什麼?

+0

你在循環中使用setAdapter,得到它的循環。 – Talha

回答

3

把這些代碼行出來的for循環

adapter = new APIQuickCheckoutProductProvider(APIQuickCheckout.this, productList); 
lv.addHeaderView(headerMethod()); 
lv.setAdapter(adapter); 
adapter.notifyDataSetChanged(); 
2

因爲你試圖給你打電話setAdapter(...)後,因爲for循環它們運行不止一次內添加頁眉錯誤被拋出。