2012-01-13 74 views
0

我有一个列表元素的列表视图。当我点击一次时,会向我的服务器发出一个请求,并且在响应进入时显示吐司,然后在响应进入时显示另一个吐司。我希望在发生这种情况时禁用列表视图进行单击。什么是最好的方式来做到这一点?我尝试了一个简单的布尔值,但不知怎的,它总是在来自服务器的响应进入之前返回到其原始状态。还尝试禁用布局元素,并且不会去。建议?停用onclick listview元素后的监听器:android

//beginning of my FirstClass 
static boolean wait = false; 

//...some code 

setListAdapter(new ArrayAdapter<String>(this, R.layout.main, arraylist)); 

     lv.setOnItemClickListener(new OnItemClickListener() { 

      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       if(!wait){ 
        wait = true; 
        Toast.makeText(getApplicationContext(), "Processing...",Toast.LENGTH_SHORT).show(); 
        String URL = "myurl"; 
        new RequestTask(getApplicationContext()).execute(URL); 
       } 
      } 
     }); 

,然后在我的RequestTask类

@Override 
protected void onPostExecute(String result) { 
    super.onPostExecute(result); 
    Toast.makeText(this.context, result,Toast.LENGTH_SHORT).show(); 
    FirstClass.wait = false; // turn it back to false? 
} 

回答

0

我认为最好的方法是禁用,你必须// start disable,然后在RequestTask禁用。请求任务可能正在另一个线程的后台执行。这意味着您创建RequestTask后不久就会执行您的代码(这可能是为什么布尔值在请求结束前回到启用状态的原因)。但是,如果您通过请求任务对您正在讨论的布尔值(通过构造函数)进行引用,则可以允许RequestTask在其HTTP请求完成时解锁。

所以基本上,给RequestTask一个你正在使用的布尔值的引用,当它的HTTP请求完成时,将其设置为启用。或者,在您的活动enableListView()(或可能是backgroundRequestComplete())中定义一个函数,该函数实际将布尔值切换为启用。然后为RequestTask提供对您的活动的引用,并在完成后调用enableListView()方法。

+0

是啊,这是有道理的,但我应该能够做到这一点没有引用我的布尔内的请求任务否?我添加了一些代码来展示我如何试图使它工作,但即使在响应从服务器进入之前,它仍然会恢复为false。我不明白这是怎么可能的,因为onPostExecute应该在最后发生(对于那个吐司来说,这是真的) – 2012-01-14 15:46:14

0

我不完全知道你做了什么,有什么,但对像:

lv.setOnItemClickListener(null); 

对不起,如果我得到你的问题错了..