【问题标题】:Android ListView how to disable multi clickAndroid ListView如何禁用多点点击
【发布时间】:2014-10-20 07:09:55
【问题描述】:

我有一个列表视图,其中包含列表中每一行的文本视图和删除图像按钮。我使用自定义适配器填充了这个列表视图并覆盖了 getView 方法。但是,我还为每个文本视图分配了 onClick 侦听器,以打开一个用于编辑文本的对话框(以及用于在列表视图中删除该行的图像按钮。)

我的问题是当用户“不小心”同时用两根手指点击两行时,它会弹出两个对话框,一个隐藏在另一个后面。用户可以简单地忽略两者,但我想通过不让它发生来避免这个故障。

这是来自 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;
}

【问题讨论】:

  • 当您单击一次进入时,您可以在此处的适配器中简单地设置一个静态标志,检查它并在您关闭时重置标志。

标签: android listview dialog


【解决方案1】:

简单,首先不要在getView() 中创建AlertDialog 对象。在自定义适配器的构造函数中创建它。

现在只需将 Textview 的值分配给 getView() 中的 AlertDialog 的 EditText,以便按照类级别使用 AlertDialog 的 EditText 的引用。

即使ib.setOnClickListener(),也仅将 AlertDialog 的所有内容放入自定义适配器的构造函数中。

现在在ib.setOnClickListener() 中,如果对话框不可见,则使用isVisible()isShown() 方法和dismiss() 如果它已经可见,则显示它。

(我不记得方法)。

【讨论】:

  • 那么,如果用户不小心触摸了两行,这个解决方案实际上只会显示一个包含最新触摸行数据的对话框吗?我会测试你的想法,然后再回来。
  • 它只是用最近点击的行 TextView 的值更新你的 EditText 的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-12
  • 2013-04-12
  • 2011-02-23
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多