2013-03-18 258 views
1

我有一个视图,它使用AsyncTask来制作动态表格。唯一的麻烦是在这期间我创建了一些复选框,但是一旦用户检查了它们,我想禁用该框。但由于它们被创建的动态方式,我无法获得将它们设置为禁用的参考。刷新视图?

因此,这里是我如何在一个循环中创建的按钮:

while(it.hasNext()){ 
       if(checkStatus(it.next())){ 
        myCheckbox.setChecked(true); 
        myCheckbox.setEnabled(false); 
       }else{ 
        myCheckbox.setOnClickListener(new OnClickListener() { 

          public void onClick(View v) { 
          buyU asyncTask = new buyU(); 
          asyncTask.execute("value1"); 
          } 
        }); 

       } 
} 

所以当按钮被按下我的AsyncTask运行。但我无法修改复选框,因为我没有它的参考。我不能传递引用我不认为,因为我使用传递参数发送一个字符串与几个值。所以我想最简单的方法就是再次刷新整个页面。

这样做的好方法是什么?

或者,我还可以将按钮作为对象传递给asyncTask以及字符串,并将它们转换回另一端的类型?

回答

1

您可以通过Object,只需添加一个实例变量和一个构造函数。由于我们是从onClick()执行此,我们将投vCheckBox

Checkbox c; 

public buyU (CheckBox checkbox) 
{ 
    c = checkbox; 
} 

@Override 
protected void onPostExecute (Result result) 
{ 
    c.setChecked (false); 
    c.setEnabled (false); 
} 

然后调用:

CheckBox check = (CheckBox) v; 
buyU asyncTask = new buyU(check); 
asyncTask.execute("value1"); 

如果你确保CheckBox应当在点击被禁用,您可以跳过AsyncTask参数传递,只需在onClick()中将CheckBox设置为禁用。

public void onClick(View v) { 
    ((CheckBox)v).setChecked (false); 
    v.setEnabled (false); 
    buyU asyncTask = new buyU(); 
    asyncTask.execute("value1"); 
} 

我也会厌倦那个封闭循环,确保它在UI线程中运行时不会长时间运行。与往常一样,Java类以大写字母开头,buyU不符合该规范。

+0

这是天才,我不知道你可以做到这一点。我知道你可以在其他类上做,但由于某种原因,从来没有想过用Async。感谢所有的建议,你是明星! – 2013-03-18 17:06:38

+0

此循环在asyncTask中的postExcute中运行,并且在执行时会显示进度对话框,因此它不应该成为UI的问题? – 2013-03-18 17:10:08

+0

@EricBanderhide如果一个循环在UI线程中运行,即使你有一个对话框,你仍然阻塞该线程。 Android应该仍然提供关闭应用程序*如果它是一个长时间运行的循环。你应该做一些测试并亲自看看。 – 2013-03-18 19:56:18