ListView点击后弹出AlertDialog无内容问题排查
这种情况我之前做Android项目时也碰到过,大概率是你在获取条目数据或者构建AlertDialog的环节出了问题,咱们一步步排查可能的原因:
没有正确获取点击条目的完整数据
点击ListView条目时,首先得确保你拿到了当前条目的完整数据。比如用CursorAdapter的话,要在onItemClick里正确取出对应Cursor的数据:@Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 获取当前位置的Cursor对象 Cursor cursor = (Cursor) parent.getItemAtPosition(position); // 根据DBHelper里定义的列名取出对应字段值 String name = cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_NAME)); String phone = cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_PHONE)); // 后续用这些值填充对话框 }要是用自定义对象的Adapter,直接获取对象即可:
YourDataModel model = (YourDataModel) parent.getItemAtPosition(position);,再取对象的属性值。AlertDialog的内容填充逻辑错误
很多时候对话框空内容,是因为没把数据正确绑定到对话框的控件上:
如果用自定义布局的对话框,要确保加载布局后找到控件并设置数据:// 加载自定义对话框布局 View dialogLayout = getLayoutInflater().inflate(R.layout.dialog_detail, null); // 找到布局里的文本控件 TextView tvName = dialogLayout.findViewById(R.id.tv_dialog_name); TextView tvInfo = dialogLayout.findViewById(R.id.tv_dialog_info); // 把拿到的数据设置进去 tvName.setText(name); tvInfo.setText(phone); // 构建并显示对话框 new AlertDialog.Builder(this) .setTitle("条目详情") .setView(dialogLayout) .setPositiveButton("确定", (dialog, which) -> dialog.dismiss()) .show();如果用默认的消息文本,要保证
setMessage()传入的不是空字符串:String detailContent = "姓名:" + name + "\n联系电话:" + phone; new AlertDialog.Builder(this) .setTitle("条目详情") .setMessage(detailContent) .setPositiveButton("确定", null) .show();Cursor字段索引错误或数据库数据为空
检查一下从Cursor取数据时的列名是否和DBHelper里定义的完全一致,比如cursor.getColumnIndex(DBHelper.COLUMN_NAME)如果列名写错,会返回-1,getString(-1)会拿到空值;另外也要确认数据库中这条数据的字段本身是否有值,要是数据库里就是空的,对话框自然没内容。Adapter数据绑定不完整
要是你的Adapter在getView方法里只绑定了部分字段,或者数据源本身就没包含完整的条目信息,那点击时拿到的数据也是不完整的,对话框自然显示空内容。
如果补全你的onItemClick方法和AlertDialog构建代码,能更精准定位问题,但按照上面几点排查,应该能解决大部分情况。
内容的提问来源于stack exchange,提问作者Algirdas Žarkaitis

