3

実行時にアイテムのリストを表示するアプリケーションがあります。ユーザーが を押すとButton、選択されたすべてのアイテムが削除されます (選択は によって決定されCheckBoxます)。ポートレートモードではすべて正常に動作しますが、行数が 3 を超える場合にランドスケープ モードに切り替えると、削除ボタンを押すForce Close Exceptionとスタック トレースを出力できません。3 行以下の場合は完全に機能します。layout(ポートレート) とlayout-landディレクトリ の両方のレイアウトを作成しました。コードとレイアウトは次のとおりです。

削除ボタンのハンドラーは次のとおりです。

   Button DeleteGoods=(Button)findViewById(R.id.DeleteSelectedGoodsButton);
   DeleteGoods.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            CheckBox cbx = (CheckBox)listView.findViewById(R.id.ChkOrder);
            int firstPosition = listView.getFirstVisiblePosition();
                for (int i = firstPosition; i < listView.getCount(); i++) {

                    View v1 = listView.getChildAt(i);

                    cbx = (CheckBox)v1.findViewById(R.id.ChkOrder);
                    if(cbx.isChecked())
                        checkedItemPosition=i;                  
                }
                try {

                    DeleteCheckedItem(checkedItemPosition);

                    Toast.makeText(getApplicationContext(),"The selected order has been deleted successfully.", Toast.LENGTH_SHORT).show();

                    finish();
                    startActivity(getIntent());
                } catch (Exception e) {

                    Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show();
                }


        }

    });

ランドスケープモードでのレイアウトは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>

    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="#000000" >
        <Button 
            android:id="@+id/DeleteSelectedGoodsButton"
            android:layout_width="150dp"
            android:layout_height="45dp"
            android:text="@string/DeleteSelectedGoods"
            android:layout_alignParentTop="true"
            android:layout_alignParentLeft="true" />
        <Button 
            android:id="@+id/ConfirmDelete"
            android:layout_width="150dp"
            android:layout_height="45dp"
            android:text="@string/ConfirmDeleteButton"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true" />
        <Button 
            android:id="@+id/CancelButton"
            android:layout_width="150dp"
            android:layout_height="45dp"
            android:text="@string/CancelButton"
            android:layout_alignParentTop="true"
            android:layout_alignParentRight="true" />
        <TextView 
            android:id="@+id/aa"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:layout_below="@id/CancelButton" />

        <TextView 
            android:id="@+id/GOODNAME_CELL"
            android:layout_width="180dp"
            android:layout_height="wrap_content"
            android:background="@drawable/border"
            android:textSize="18dp"
            android:text="Order"
            android:paddingLeft="5dp"
            android:layout_below="@id/aa"
            android:layout_alignParentLeft="true" />
         <TextView 
            android:id="@+id/GOODUNITPRICE_CELL"
            android:layout_width="180dp"
            android:layout_height="wrap_content"
            android:background="@drawable/border"
            android:textSize="18dp"
            android:text="Unit Price"
            android:paddingLeft="5dp"
            android:layout_below="@id/aa"
            android:layout_toRightOf="@id/GOODNAME_CELL" />
         <TextView 
            android:id="@+id/QUANTITYCELL"
            android:layout_width="120dp"
            android:layout_height="wrap_content"
            android:background="@drawable/border"
            android:textSize="18dp"
            android:text="Quantity"
            android:paddingLeft="5dp"
            android:layout_below="@id/aa"
            android:layout_toRightOf="@id/GOODUNITPRICE_CELL" />
         <ListView 
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        style="@style/CodeFont"
        android:layout_alignParentLeft="true"
        android:layout_below="@id/GOODUNITPRICE_CELL" />

         <TextView
            android:id="@+id/TotalPriceTextview"
            android:layout_width="600dp"
            android:layout_height="wrap_content"
            android:text=""
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:background="@drawable/back"
            android:textColor="#FFFFFF"
            android:textSize="20dp" />

    </RelativeLayout>

これは私が得ている例外です:

02-19 10:07:11.398: E/AndroidRuntime(4335): FATAL EXCEPTION: main
02-19 10:07:11.398: E/AndroidRuntime(4335): java.lang.NullPointerException
02-19 10:07:11.398: E/AndroidRuntime(4335):     at com.example.nfc.PrepopSqliteDbActivity$1.onClick(PrepopSqliteDbActivity.java:117)
02-19 10:07:11.398: E/AndroidRuntime(4335):     at android.view.View.performClick(View.java:2552)
02-19 10:07:11.398: E/AndroidRuntime(4335):     at android.view.View$PerformClick.run(View.java:9229)
02-19 10:07:11.398: E/AndroidRuntime(4335):     at android.os.Handler.handleCallback(Handler.java:587)
02-19 10:07:11.398: E/AndroidRuntime(4335):     at android.os.Handler.dispatchMessage(Handler.java:92)
02-19 10:07:11.398: E/AndroidRuntime(4335):     at android.os.Looper.loop(Looper.java:138)
02-19 10:07:11.398: E/AndroidRuntime(4335):     at android.app.ActivityThread.main(ActivityThread.java:3701)
02-19 10:07:11.398: E/AndroidRuntime(4335):     at java.lang.reflect.Method.invokeNative(Native Method)
02-19 10:07:11.398: E/AndroidRuntime(4335):     at java.lang.reflect.Method.invoke(Method.java:507)
02-19 10:07:11.398: E/AndroidRuntime(4335):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
02-19 10:07:11.398: E/AndroidRuntime(4335):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
02-19 10:07:11.398: E/AndroidRuntime(4335):     at dalvik.system.NativeStart.main(Native Method)
02-19 10:07:11.408: W/ActivityManager(1768):   Force finishing activity com.example.nfc/.PrepopSqliteDbActivity
02-19 10:07:11.909: W/ActivityManager(1768): Activity pause timeout for HistoryRecord{40b2ed78 com.example.nfc/.PrepopSqliteDbActivity}
02-19 10:07:16.353: I/InputDispatcher(1768): Application is not responding: Window{40a73e60 com.example.nfc/com.example.nfc.PrepopSqliteDbActivity paused=false}.  5004.7ms since event, 5004.4ms since wait started
02-19 10:07:16.353: I/InputDispatcher(1768): Dropping event because the pointer is not down.
02-19 10:07:16.353: I/InputDispatcher(1768): Dropping event because the pointer is not down.
02-19 10:07:16.353: I/WindowManager(1768): Input event dispatching timed out sending to com.example.nfc/com.example.nfc.PrepopSqliteDbActivity
02-19 10:07:16.353: I/ActivityManager(1768): Crashing app skipping ANR: ProcessRecord{40a1b188 4335:com.example.nfc/10003} keyDispatchingTimedOut
02-19 10:07:21.428: W/ActivityManager(1768): Launch timeout has expired, giving up wake lock!
02-19 10:07:21.908: W/ActivityManager(1768): Activity idle timeout for HistoryRecord{40a1b7d8 com.example.nfc/.Buy}
02-19 10:07:26.963: I/touchd(1518): 'ab8500_usb' is online
02-19 10:07:26.963: I/touchd(1518): handling_uevent: event is 1

編集

これは117行目です:

DeleteCheckedItem(checkedItemPosition);

これがメソッドの本体です。

private void DeleteCheckedItem(int chkPosition)
{   
    String strName=goods.get(chkPosition).get(GOOD_NAME);
    String strPrice=goods.get(chkPosition).get(GOOD_UNITPRICE);
    String strQuantity=goods.get(chkPosition).get(QUANTITY);
    String whereClause = "GOOD_NAME = ? AND GOOD_UNITPRICE= ? AND QUANTITY= ?";
    String[] whereArgs = {strName,strPrice,strQuantity};
    database.delete(TABLE_NAME, whereClause, whereArgs);
}
4

6 に答える 6

4

またはですか?checkedItemPosition_intInteger

私の推測では、Integerに初期化された an ですnull

回転すると、アクティビティが再作成され、checkedItemPositionに再初期化されnullます。

次に、for ループに入りますが、どのCheckboxビューもチェックされていないため、checkedItemPositionまだnull.

プリミティブと出来上がりを期待している間DeleteItemCheckedに aを呼び出そうとします。nullintNullPointerException

解決策: に初期化checkedItemPosition0ます。

于 2013-03-01T16:22:15.407 に答える
2

私はこの種の問題に遭遇しました。私の理論はシャディの観察に関連しています

ポートレートモードでは、ランドスケープモードよりも多くの行を表示できます。そして、リストビューのアイテム数を繰り返して、その位置のビューを取得しようとします。リストビューのビューまたはアイテムがウィンドウ/電話スクリーンに表示されていない場合。null値を取得できる可能性があります。アダプターのgetView()メソッドは、スクロールごとに呼び出されます。これは、リストビュー項目の初期化または再作成がgetView()で行われ、getView()メソッドを適切に呼び出さずに、ウィンドウ/電話画面に表示されない項目が初期化されないためです。リストビューのメソッドgetLastVisiblePosition()を使用して、リストビューに反復するアイテムの数を制限できます。

これがお役に立てば幸いです。よろしく。

于 2013-02-28T08:29:09.517 に答える
0

コードを見ると、削除が押されても何もチェックされていない場合はどうなりますか?

質問になりますが、削除を押すとチェック項目が表示されなくなる可能性はありますか?その場合、ビューのリサイクル(恐ろしい、賢い場合)のため、削除ボタンコードに到達したときに実際には存在しない可能性があるため、その時点でビューのクエリに注意する必要があります。削除が押されたときにビューを照会する必要がなくなるように、選択が行われる(および行われない)ときに「現在選択されているリスト」を作成する方が賢明かもしれません。

余談ですが、最初にチェックした項目だけが削除されるようですが、何か見落としている可能性があります。

于 2013-03-01T21:13:39.727 に答える
0

問題が発生し、解決策は次のとおりです。画面を回転させると、アダプタが再び初期化され、以前のアレイが消去されます。できることはonConfigurationChange()、 をアクティビティに入れて、出力を確認することです。

于 2013-03-01T06:06:02.533 に答える
0

databaseorのように見えTABLE_NAMEますnull。次の行を 117 行目の前に追加してテストします。

if (strName == null)
    Log.w("Test", "strName is NULL");
if (strPrice == null)
    Log.w("Test", "strPrice is NULL");
if (strQuantity == null)
    Log.w("Test", "strQuantity is NULL");
if (TABLE_NAME == null)
    Log.w("Test", "TABLE_NAME is NULL");
if (whereClause == null)
    Log.w("Test", "whereClause is NULL. WTF!");
if (whereArgs == null)
    Log.w("Test", "whereArgs is NULL. WTF!");
if (database == null)
    Log.w("Test", "database is NULL");
于 2013-02-26T20:58:56.957 に答える
-1

マニフェスト ファイルで構成変更の処理を指定しましたか。そうでない場合はandroid:configChanges="keyboardHidden|orientation、アクティビティに次を追加してください。

詳細情報を提供するlogcatを貼り付けてください..頑張ってください..

于 2013-02-19T05:49:23.667 に答える