2012-03-27 5 views
2

Я реализовал ArrayAdapter для ListView, где каждая строка содержит TextView и ImageButton. Фоновое изображение 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, файл загружается, и мне нужно изменить соответствующее изображение. Проблема заключается в том, что 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 для отображения его нового фонового изображения?

ответ

1

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

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

EDIT: На самом деле вам нужно позвонить notifyDataSetChanged в методе onPostExecute для AsyncTask, который вы используете, а не в прослушивателе onClick.

+0

Brilliant, thanks –

1

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

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

+1

My arrayAdapter изменен LazyAdapter. Он загружает изображения правильно, проблема заключается в динамическом изменении изображения и недействительности. –

0

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

new DownloadFileAsync(imButton).execute(url); 

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

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

Я пробовал, но кнопка не была аннулирована. Я полагаю, что метод getView должен быть программным образом вызван для этого. –