Android:动态更改ImageButton的背景并显示它

时间:2012-03-27 09:17:17

标签: android background imagebutton invalidation

我为ListView实现了ArrayAdapter,其中每行包含TextViewImageButton。 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后,文件会下载,我需要更改相应的图片。 问题是只有当用户向下滚动getView直到此ListView从屏幕消失然后向后滚动时,才会调用ImageButton。显示带有新背景图像的按钮后。

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

我使用此类进行异步下载:http://www.java-samples.com/showtutorial.php?tutorialid=1521

我尝试在函数

中创建类似currentbutton.invalidate()的内容
@Override
protected void onPostExecute(String unused) {
       activity.dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
}

但没有成功。

如何使ImageButton无效以显示其新的背景图片?

3 个答案:

答案 0 :(得分:1)

试试这个: https://github.com/thest1/LazyList

按下按钮后,将图像加载到特定的ImageView,并在getView中引用。

答案 1 :(得分:1)

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

我会稍后检查,如果不能开箱即可写下任何进一步的建议。

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

答案 2 :(得分:0)

您可以尝试转到AsyncTaskButton视图点击了AsyncTask

new DownloadFileAsync(imButton).execute(url);

然后,在您的方法onPostExecute()中,您可以致电:

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