2012-03-27 61 views
2

我为ListView实施了ArrayAdapter,其中每行包含TextViewImageButton。 的ImageButton的背景图像取决于一些条件,有两种选择:Android:动态更改ImageButton的背景并显示它

public View getView(int position, View convertView, ViewGroup parent) { 
      View vi=convertView; 
      if(convertView==null) 
       vi = inflater.inflate(R.layout.item_with_button, null); 

      File f = new File(PATH_TO_FILE); 
      if(f.exists()){ 
       imbutton =(ImageButton)vi.findViewById(R.id.btn_image); 
       imbutton.setBackgroundResource(R.drawable.done); 
      }else 
      { 
       imbutton =(ImageButton)vi.findViewById(R.id.btn_image); 
       imbutton.setBackgroundResource(R.drawable.download); 
       imbutton.setOnClickListener(new View.OnClickListener() {   
        public void onClick(View v) { 
         String url = URL; 
         new DownloadFileAsync(pos).execute(url); 
        } 
       }); 
      } 
... 
return vi; 
} 

如果文件存在,那么我把“做”形象的ImageButton。如果文件不存在,我设置“下载”图像。

用户点击ImageButton后,文件下载,我需要更改各自的图像。 问题是仅当用户滚动ListView直到此ImageButton从屏幕上消失并且然后向后滚动时才调用getView。在那个按钮出现后,新的背景图像。

但是,我无法使按钮无效以显示新的图像。

我用这个类异步下载:http://www.java-samples.com/showtutorial.php?tutorialid=1521

我试图制造类似currentbutton.invalidate()在功能

@Override 
protected void onPostExecute(String unused) { 
     activity.dismissDialog(DIALOG_DOWNLOAD_PROGRESS); 
} 

但没有成功。

我怎样才能使ImageButton无效显示其新的背景图像?

回答

1

你可以称之为notifyDataSetChanged在onClick监听器中强制刷新列表。 虽然我还没有尝试过,所以我不确定它是否能在没有对适配器进行任何明确更改的情况下工作(即添加,删除或更新其上的项目)。

我会稍后再检查一下,如果它没有开箱即用,请再写一些建议。

编辑:其实你需要在你使用的AsyncTask的onPostExecute方法中调用notifyDataSetChanged,而不是在onClick监听器中。

+0

辉煌,谢谢 – 2012-03-27 09:52:20

1

试试这个:你在getView引用 https://github.com/thest1/LazyList

,并按下后的按钮图像加载到一个特定的ImageView。

+1

我的arrayAdapter被修改了LazyAdapter。它正确地加载图像,问题是动态更改图像并使之无效 – 2012-03-27 09:34:43

0

你可以尝试传给你AsyncTask,该Button视图中点击您的AsyncTask

new DownloadFileAsync(imButton).execute(url); 

,然后在你的方法onPostExecute(),您可以拨打:

this.btnClicked.setBackgroundResource(R.drawable.done); 
+1

我试过了,但按钮没有失效。我想'getView'方法应该以某种方式通过编程方式调用.. – 2012-03-27 09:47:50