1

OnCreateメソッドを次のメソッドsetupAdapter();で呼び出します。

  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のコンテンツをヘッダーとして追加することだけです。私は何が間違っているのですか?

4

2 に答える 2

3

これらのコード行をforループから外します

adapter = new APIQuickCheckoutProductProvider(APIQuickCheckout.this, productList);
lv.addHeaderView(headerMethod());
lv.setAdapter(adapter);
adapter.notifyDataSetChanged();
于 2012-12-24T17:52:09.487 に答える
2

呼び出し後にヘッダーを追加しようとしているため、エラーがスローされます。これは、ヘッダーsetAdapter(...)が内部にあるforループが複数回実行されているためです。

于 2012-12-24T18:29:57.830 に答える