我有一个 ListView ,其中包含一个 TextView 和一个删除列表中每一行的图像按钮。我使用自定义适配器填充此 ListView 并覆盖 getView 方法。但是,我还为每个 TextView 分配了 onClick 监听器,以打开一个用于编辑文本的对话框(以及用于删除 ListView 中该行的图像按钮。)
我的问题是当用户“不小心”同时用两根手指点击两行时,会弹出两个对话框,一个隐藏在另一个对话框后面。用户可以简单地关闭两者,但我想通过根本不让它发生来避免这个故障。
这是 getView 的代码:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ListItem li = getItem(position);
ViewHolder viewHolder;
if(convertView == null) {
viewHolder = new ViewHolder();
convertView = LayoutInflater.from(getContext()).inflate(R.layout.pref_sqlite_table_row, parent, false);
viewHolder.imageButton = (ImageButton) convertView.findViewById(R.id.pref_remove_button);
viewHolder.textView = (TextView) convertView.findViewById(R.id.pref_text_view);
//we need to update adapter once we finish with editing
convertView.setTag(viewHolder);
}
else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.imageButton.setTag(li.getId());
// imageButton onClick to remove row
viewHolder.textView.setText(li.getData());
viewHolder.textView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
TextView tv = (TextView) v;
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
View vw = ((Activity) mContext).getLayoutInflater().inflate(R.layout.pref_sqlite_table_dialog, null);
mNewChangeDialogEditText = (EditText) vw.findViewById(R.id.pref_edit_text);
mNewChangeDialogEditText.setText(tv.getText());
ImageButton ib = (ImageButton) vw.findViewById(R.id.pref_accept_button);
ib.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// update data
mNewChangeDialog.dismiss();
}
});
builder.setView(vw);
mNewChangeDialog = builder.create();
mNewChangeDialog.show();
}
});
return convertView;
}
最佳答案
很简单,首先不要在getView()
中创建AlertDialog 对象。在自定义适配器的构造函数中创建它。
现在只需在 getView() 中将 Textview 的值分配给 AlertDialog 的 EditText,以便根据类级别使用 AlertDialog 的 EditText 引用。
即使 ib.setOnClickListener()
也只将 AlertDialog 的所有内容放在自定义适配器的构造函数中。
现在在 ib.setOnClickListener()
中,如果使用 isVisible()
或 isShown()
方法和 不可见,则只显示对话框>dismiss()
如果它已经可见。
(我不记得方法了)。
关于Android ListView如何禁用多点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25514625/