Android: динамически меняйте фон ImageButton и показывайте его - PullRequest
2 голосов
/ 27 марта 2012

Я реализовал ArrayAdapter для ListView, где каждая строка содержит TextView и ImageButton.Фоновое изображение 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 ]

1 голос
/ 27 марта 2012

Вы можете вызвать notifyDataSetChanged в прослушивателе onClick для принудительного обновления списка.Хотя я не пробовал, поэтому я не уверен, что он будет работать без внесения каких-либо явных изменений в адаптер (т. Е. Добавления, удаления или обновления элементов в нем).

Я проверю этопозже и напишите любые дальнейшие предложения, если это не работает из коробки.

РЕДАКТИРОВАТЬ: На самом деле вам нужно вызвать notifyDataSetChanged в методе onPostExecute AsyncTask, который вы используете, а не вслушатель onClick.

1 голос
/ 27 марта 2012

Попробуйте это: https://github.com/thest1/LazyList

И после нажатия кнопки загрузите изображение в определенный ImageView, используя ссылку в getView.

0 голосов
/ 27 марта 2012

вы можете попробовать перейти к вашему AsyncTask, представление Button кликнуло к вашему AsyncTask:

new DownloadFileAsync(imButton).execute(url);

, а затем, в вашем методе onPostExecute(), вы можете вызвать:

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