警告对话框不会为列表
我的,我从数据库中获取的地点列表视图的所有项目的工作,我对项目作出了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)
这是一个很好的时间来设置一些断点在onItemLongClick()
和使用调试器。它将帮助您找到空值或至少找到崩溃的行。
我愿意猜测打开的对话框中的次数是不相关的,我认为有一个哑弹的第八入口。如果你先点击第8项,它还会崩溃吗?如果是这样,你检查你的数据库,第8 hotelName
行有所有您所请求的字段或一个(或多个)列有空值值?
加成
当列表滚动了,你用这个行:
String hotelName = (String) ((TextView)parent.getChildAt(position)).getText();
的位置超出返回空导致您的NullPointerException异常,因为父母唯一的孩子界可见的,而不是尝试更快,更简单的方法:
String hotelname = ((TextView) view).getText().toString();
问题出在这一行: String hotelName =(String)((TextView)parent.getChildAt(position))。getText(); 但我不确定为什么它适用于第一个项目,而不是这个,我无法弄清楚,而调试! 如果我先点击第8项,它仍会崩溃。 – MahaK 2012-04-28 17:32:03
非常好,通过设置该行上的断点,您是否验证过:'position'和'parent'的值在'position'处有一个孩子? – Sam 2012-04-28 17:42:19
我不明白你的意思,当我调试并单击列表中的第8个元素时,尽管我按下了“Resume”按钮两次,然后“ZygoteInit $ MethodAndArgsCaller.run()”,调试器保持在同一行上。在这种情况下打开“源未找到” – MahaK 2012-04-28 18:03:27
通过前8次,你可能指的是屏幕上显示的项目,而无需滚动,对不对?
你需要发布一些代码,以便我们来帮助你。
是的,我认为这与所显示的项目有关!我现在会发布一些代码 – MahaK 2012-04-28 16:44:09
请发布相关的代码和你的logcat错误,以便我们可以看到发生了什么。 – Sam 2012-04-28 16:38:07
代码被添加 – MahaK 2012-04-28 16:46:51
随着日志猫 – MahaK 2012-04-28 16:49:23