再次单击 Listview 的项目时,AlertDialog 损坏

Posted

技术标签:

【中文标题】再次单击 Listview 的项目时,AlertDialog 损坏【英文标题】:The AlertDialog broken when click the item of Listview again 【发布时间】:2018-04-27 12:17:33 【问题描述】:

我想在列表视图上显示新工作服务器的信息。当我点击某个项目时,它会再次搜索网络,返回一些数据,在对话框中显示它们。我使用了两个 AsyncTasks 来实现它。但是,当我单击该项目两次(单击该项目一次即可)时,它坏了。我调试后发现,第二次它甚至根本没有进入 itemclicklistener 方法。无法修复错误...非常感谢任何帮助。 这是部分代码。首先是onitemclicklistener

private class lvVoteItemOnItemClickListener implements AdapterView.OnItemClickListener 
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                                long arg3) 
            HashMap<String, String> map = (HashMap<String, String>) lvVoteItem.getItemAtPosition(arg2);
            if (clickID != Integer.parseInt(map.get("id"))) 
                clickID = Integer.parseInt(map.get("id"));
                new VoteAccountTask().execute(map.get("id"));
             else 
                new AlertDialog.Builder(VoteSummaryActivity.this).setTitle(res)
                        .setIcon(null)
                        .setView(null)
                        .show();
                String temp = "";
            

        
    

其次,显示对话框AsyncTask

public class VoteAccountTask extends AsyncTask<String, Void, String> 

    protected String doInBackground(String... param) 
            return searchVoteAccountWebservice(Integer.parseInt(param[0]));
    

    @Override
    protected void onPostExecute(String result) 
        //votedetail.itemID + signal + votedetail.vID + signal + votedetail.itemName + signal + votedetail.ifUserDefine + signal + votedetail.creater +signal + votedetail.createDate
        super.onPostExecute(result);
        res = setStringsByWebString(result, VoteSummaryActivity.this.getString(R.string.datasetserStr1), VoteSummaryActivity.this.getString(R.string.datasetserStr2));
        new AlertDialog.Builder(VoteSummaryActivity.this).setTitle(res)
                .setIcon(null)
                .setView(null)
                .show();
    

【问题讨论】:

放你的logcat 【参考方案1】:

Asynctask 被简单地执行而不检查之前的执行。不阻塞用户界面。因此,您的按钮、textView 或任何可点击的东西都可以在您每次点击时触发异步任务。

在相同的情况下我会采用两种方法;

    Show Progress Dialog 在 preExecute 方法中设置 item clickable=false,然后在 postExecute 中设置为 true

【讨论】:

Serhat Türkman,感谢您的帮助。我试过你的建议。设置项目可点击=false。但问题仍然存在。我无法在几秒钟内单击该项目。第一次点击会弹出对话框,几秒就退出Activity。 Asynctask的onPostExecute弹出AlertDialog,却发现无法再次弹出对话框。还是没找到原因。

以上是关于再次单击 Listview 的项目时,AlertDialog 损坏的主要内容,如果未能解决你的问题,请参考以下文章

在活动之间保留 ListView 项目

Listview 项目在单击时突出显示(不需要)

单击 Listview 中的项目时,如何在新活动中从 Firebase 检索数据?

单击 ListView 项目时如何加载 Firebase DB 值的详细活动

C# Wpf 如何使用其中的按钮更改 Listviewitem 的高度?

Listview自定义过滤器在过滤列表中单击错误的项目