0

私はデータベースから取得した場所のリスト ビューを持っています。アイテムに OnItemLongClickListener を作成しました。長いクリックの後、アイテムに関するデータベースから取得したメッセージ本文でアラート ダイアログがアクティブになります。クリックしました。ダイアログには 3 つのボタン (Call、Map it、View Photo) があり、正常に動作しています。ダイアログは最初の 8 項目で機能しますが、ダイアログが開かず、残りの項目で適用強制が終了します。理由はわかりません!

手伝ってくれませんか?

すべてのホテルのリストを表示するコードは次のとおりです。

List<Hotel> values = datasource.getAllHotels();
            if (values.isEmpty())
            {
                Toast.makeText(this, "No results found!", Toast.LENGTH_LONG).show();
                Intent i1 = new Intent(hotelSearchList.this, hotelSearch.class);
                startActivity(i1);
            }
            ArrayAdapter<Hotel> adapter = new ArrayAdapter<Hotel>(this,
                    android.R.layout.simple_list_item_1, values);
            setListAdapter(adapter);
            ListView lv = getListView();
            lv.setOnItemLongClickListener(this);

これは onItemLongClickListener のコードです。

public boolean onItemLongClick(final AdapterView<?> parent, final View view, int position,
        long id) {
    // TODO Auto-generated method stub
    String hotelName = (String) ((TextView)parent.getChildAt(position)).getText();
    final List<Hotel> location = datasource.getHotelLocation(hotelName);
    String loc = "Location: " + TextUtils.join(", ", location);
    List<Hotel> address = datasource.getHotelAddress(hotelName);
    String add = "Address: " + TextUtils.join(", ", address);
    List<Hotel> rating = datasource.getHotelRating(hotelName);
    String rat = "Rating: " + TextUtils.join(", ", rating);
    List<Hotel> phone = datasource.getHotelPhone(hotelName);
    final String phoneN = "Phone: " + TextUtils.join(", ", phone);
    List<Hotel> latitude = datasource.getHotelLat(hotelName);
    final String lat = latitude.get(0).toString();
    List<Hotel> longitude = datasource.getHotelLon(hotelName);
    final String lon = longitude.get(0).toString();
    List<Hotel> photo = datasource.getHotelPhoto(hotelName);
    final String pho = photo.get(0).toString();
    //Toast.makeText(hotelSearchList.this, "The hotel clicked is " + hotelName, Toast.LENGTH_LONG).show();
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Information About " + hotelName);
    builder.setMessage(loc + "\n" + add + "\n" + rat + "\n" + phoneN + "\n");

    builder.setPositiveButton("Call", new DialogInterface.OnClickListener() {

        public void onClick(DialogInterface dialog, int which) {
            // TODO Auto-generated method stub
            Intent i = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + phoneN));
            startActivity(i);
        }
    });
    builder.setNegativeButton("View Photo", new DialogInterface.OnClickListener() {

        public void onClick(DialogInterface dialog, int which) {
            // TODO Auto-generated method stub
            Intent i = new Intent(hotelSearchList.this, imageV.class);
            i.putExtra("photo", pho);
            startActivity(i);
        }
    });
    builder.setNeutralButton("Map it", new DialogInterface.OnClickListener() {

        public void onClick(DialogInterface arg0, int arg1) {
            // TODO Auto-generated method stub
            Intent i = new Intent(hotelSearchList.this, mapActivity.class);
            i.putExtra("latitude", lat);
            i.putExtra("longitude", lon);
            startActivity(i);
        }
    });

    builder.setCancelable(true);
    builder.show();
    return false;
}

丸太の猫は次のとおりです。

04-28 19:47:15.159: E/AndroidRuntime(384): FATAL EXCEPTION: main
04-28 19:47:15.159: E/AndroidRuntime(384): java.lang.NullPointerException
04-28 19:47:15.159: E/AndroidRuntime(384):  at egypt.interfaceAct.touristicASearchList.onItemLongClick(touristicASearchList.java:134)
04-28 19:47:15.159: E/AndroidRuntime(384):  at android.widget.AbsListView.performLongPress(AbsListView.java:1753)
04-28 19:47:15.159: E/AndroidRuntime(384):  at android.widget.AbsListView.access$600(AbsListView.java:72)
04-28 19:47:15.159: E/AndroidRuntime(384):  at android.widget.AbsListView$CheckForLongPress.run(AbsListView.java:1711)
04-28 19:47:15.159: E/AndroidRuntime(384):  at android.os.Handler.handleCallback(Handler.java:587)
04-28 19:47:15.159: E/AndroidRuntime(384):  at android.os.Handler.dispatchMessage(Handler.java:92)
04-28 19:47:15.159: E/AndroidRuntime(384):  at android.os.Looper.loop(Looper.java:123)
04-28 19:47:15.159: E/AndroidRuntime(384):  at android.app.ActivityThread.main(ActivityThread.java:4627)
04-28 19:47:15.159: E/AndroidRuntime(384):  at java.lang.reflect.Method.invokeNative(Native Method)
04-28 19:47:15.159: E/AndroidRuntime(384):  at java.lang.reflect.Method.invoke(Method.java:521)
04-28 19:47:15.159: E/AndroidRuntime(384):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
04-28 19:47:15.159: E/AndroidRuntime(384):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-28 19:47:15.159: E/AndroidRuntime(384):  at dalvik.system.NativeStart.main(Native Method)
4

2 に答える 2

0

最初の 8 回は、スクロールせずに画面に表示される項目を意味するのではないでしょうか。

私たちがあなたを助けるために、いくつかのコードを投稿する必要があります.

于 2012-04-28T16:40:44.940 に答える
0

これは、いくつかのブレークポイントを設定しonItemLongClick()てデバッガーを使用する絶好の機会です。null 値を見つけるか、少なくともクラッシュする行を見つけるのに役立ちます。

ダイアログが開く回数は無関係だと思います.8番目のエントリは不発だと思います. 最初に 8 番目のエントリをクリックすると、クラッシュしますか? その場合、データベースを確認します。8 番目の行には、要求しhotelNameすべてのフィールドが含まれていますか、または 1 つ (または複数) の列にnull値が含まれていますか?

添加

リストがスクロールされ、次の行を使用する場合:

String hotelName = (String) ((TextView)parent.getChildAt(position)).getText();

位置が範囲外でnullを返し、NullPointerException を引き起こします。これは、親の子のみが表示されているためです。代わりに、より高速で単純なアプローチを試してください。

String hotelname = ((TextView) view).getText().toString();
于 2012-04-28T17:11:37.860 に答える