[英]Alert Dialog does not work for all items of the list
我有一個從數據庫獲得的位置的列表視圖,我對項目進行了OnItemLongClickListener的操作,長按后,在消息正文中激活了帶有某些信息的警報對話框,這是我從數據庫中獲得的有關該項目的信息點擊。 該對話框有3個按鈕(調用,映射和查看照片),它們工作正常。 該對話框適用於前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)
前8次您可能是指屏幕上顯示的項目而無需滾動,對嗎?
您需要發布一些代碼,以便我們為您提供幫助。
這是在onItemLongClick()
設置一些斷點並使用調試器的絕佳時機。 這將幫助您找到空值或至少找到崩潰的行。
我願意猜測對話框打開的次數是無關緊要的,我假設您的第8個條目具有無效值。 如果您首先單擊第8個條目,它仍然會崩潰? 如果是這樣,則檢查數據庫,第8個hotelName
的行是否具有您請求的所有字段,或者一(或多個)列的值為空 ?
加成
當列表滾動后,您將使用以下行:
String hotelName = (String) ((TextView)parent.getChildAt(position)).getText();
該位置超出范圍,該位置返回null,導致NullPointerException,因為父級的唯一子級是可見的,而是嘗試一種更快,更簡單的方法:
String hotelname = ((TextView) view).getText().toString();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.