Autore Topic: Refresh di una listview personalizzata  (Letto 812 volte)

Offline terenz84

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
Refresh di una listview personalizzata
« il: 22 Dicembre 2010, 10:06:45 CET »
0
SAlve a tutti

Tramite una classe che estende BaseAdapter ho creato una listview avente un icona e un bottone

All'interno del metodo getView, ho:

Codice (Java): [Seleziona]
holder.buttonLine.setOnClickListener(new OnClickListener() {
          private int pos = position;

          @Override
          public void onClick(View v) {
}
}

L'evento click su ogni riga viene eseguito correttamente.

Ora vorrei fare in modo che mi aggiorni anche la listview.

Ad esempio cambiare il colore del bottone:

Qualcuno puö aiutarmi???

Grazie in anticipo
« Ultima modifica: 23 Dicembre 2010, 14:43:25 CET da terenz84 »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Refresh di una listview personalizzata
« Risposta #1 il: 22 Dicembre 2010, 10:58:15 CET »
0
Ma tu vuoi cambiare colore premendo sull'intera riga oppure premendo il bottone?
Dal codice che hai postato sembra vuoi fare la seconda...

Offline terenz84

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
Re:Refresh di una listview personalizzata
« Risposta #2 il: 22 Dicembre 2010, 12:30:23 CET »
0
Esatto... premendo il bottone..

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Refresh di una listview personalizzata
« Risposta #3 il: 22 Dicembre 2010, 12:32:34 CET »
0
Dovresti postare anche il codice del layout e dell'adapter...

Offline terenz84

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
Re:Refresh di una listview personalizzata
« Risposta #4 il: 22 Dicembre 2010, 12:46:18 CET »
0
layout degli elementi :

Codice: [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
 
<RelativeLayout android:id="@+id/lineItem"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:gravity="center_vertical">
 
    <ImageView android:id="@+id/iconLine"
            android:layout_width="48dip"
        android:layout_height="48dip"
        android:layout_alignParentLeft="true" />
 
    <Button android:id="@+id/buttonLine"
            android:gravity="center"
        android:layout_height="wrap_content"
        android:layout_width="100px"
        android:layout_alignParentRight="true"
        android:text="Upload" />
         
</RelativeLayout>

codice adapter:

Codice (Java): [Seleziona]
public class ImageListAdapter extends BaseAdapter implements Filterable {
    private List<Image> imagelist;
    private LayoutInflater mInflater;
    private Bitmap image;
    private Context context;
    private PicasaWSUtils picasa;
    private DataBaseHelper myDbHelper;
    private String albumId;
    private ProgressDialog dialog;

    public ImageListAdapter(Context context, List<Image> imageList, String albumId) {
      mInflater = LayoutInflater.from(context);
      this.context = context;
      this.imagelist = imageList;
      this.albumId = albumId;
      picasa = MyApplication.picasa;
      myDbHelper = MyApplication.myDbHelper;
    }

    public View getView(final int position, View convertView, ViewGroup parent) {
      ViewHolder holder;

      if (convertView == null) {
        convertView = mInflater.inflate(R.layout.picturelist_item, null);

        holder = new ViewHolder();
        holder.iconLine = (ImageView) convertView.findViewById(R.id.iconLine);
        holder.buttonLine = (Button) convertView.findViewById(R.id.buttonLine);
        if(imagelist.get(position).Upload){
                holder.buttonLine.setText("Upload");
        }
        else{
                holder.buttonLine.setClickable(false);
                holder.buttonLine.setEnabled(false);
                holder.buttonLine.setText("Uploaded");
               
        }
       
       
        convertView.setOnClickListener(new OnClickListener() {
          private int pos = position;

          @Override
          public void onClick(View v) {
            Toast.makeText(context, "Click-" + String.valueOf(pos), Toast.LENGTH_SHORT).show();    
          }
        });

        holder.buttonLine.setOnClickListener(new OnClickListener() {
          private int pos = position;

          @Override
          public void onClick(View v) {
                  dialog = ProgressDialog.show(context, "", "Photo Upload, please wait for few seconds...", true);
                  new Thread(){
                        public void run(){
                                byte[] image_data = Util.GetImageInByte(imagelist.get(position).AbsolutePath);
                                picasa.addPicture(image_data , albumId);
                                myDbHelper.insertImagePath(imagelist.get(position).AbsolutePath);                              
                               
                               
                                dialog.dismiss();    
                               
                        }
                  }.start();
          }
        });

        convertView.setTag(holder);
      } else {
        holder = (ViewHolder) convertView.getTag();
      }
     
      image =  BitmapFactory.decodeFile(imagelist.get(position).AbsolutePath);

      holder.iconLine.setImageBitmap(image);

      return convertView;
    }

    static class ViewHolder {
      ImageView iconLine;
      Button buttonLine;
    }

    @Override
    public Filter getFilter() {
      return null;
    }

    @Override
    public long getItemId(int position) {
      return 0;
    }

    @Override
    public int getCount() {
      return imagelist.size();
    }

    @Override
    public Object getItem(int position) {
                return null;
    }

  }
« Ultima modifica: 23 Dicembre 2010, 14:43:56 CET da terenz84 »

Offline terenz84

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
Re:Refresh di una listview personalizzata
« Risposta #5 il: 23 Dicembre 2010, 14:29:15 CET »
0
Non riesco proprio a trovare una soluzione...
Nessuno ha avuto qualcosa del genere??

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Refresh di una listview personalizzata
« Risposta #6 il: 23 Dicembre 2010, 14:34:59 CET »
0
Scusa mi ero dimenticato di questa conversazione.
Il toast viene visualizzato correttamente?

Offline terenz84

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
Re:Refresh di una listview personalizzata
« Risposta #7 il: 23 Dicembre 2010, 14:40:10 CET »
0
Si funziona tutto correttamente.... esegue anche la dialog e il thread all'interno in maniere corretta

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Refresh di una listview personalizzata
« Risposta #8 il: 23 Dicembre 2010, 14:46:19 CET »
0
Non ti basta mettere al posto del toast un codice tipo questo?

Codice (Java): [Seleziona]
((RelativeLayout) convertView).setBackgroundColor(..)
Devi anche salvare da qualche parte che l'item è stato "selezionato" (altrimenti scrollando la lista si perde questa informazione) e se è già stato selezionato setti manualmente il colore.


Offline terenz84

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
Re:Refresh di una listview personalizzata
« Risposta #9 il: 23 Dicembre 2010, 14:53:45 CET »
0
Forse mi sono espresso male:

Quello di cui ho bisogno è che quando premo il bottone presente nella lisview, fà delle operazioni (che già funzionano) e al termine cambia il colore del bottone, il testo e lo rende non clicckabile.
Il codice relativo al bottone è questo
Codice (Java): [Seleziona]
holder.buttonLine.setOnClickListener(new OnClickListener() {
          private int pos = position;

          @Override
          public void onClick(View v) {
                  dialog = ProgressDialog.show(context, "", "Photo Upload, please wait for few seconds...", true);
                  new Thread(){
                        public void run(){
                                byte[] image_data = Util.GetImageInByte(imagelist.get(position).AbsolutePath);
                                picasa.addPicture(image_data , albumId);
                                myDbHelper.insertImagePath(imagelist.get(position).AbsolutePath);                              
                                dialog.dismiss();    
                               
                        }
                  }.start();
          }
        });

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Refresh di una listview personalizzata
« Risposta #10 il: 23 Dicembre 2010, 15:58:38 CET »
0
Ok scusa ho capito male.
Non credo sia possibile fare quello che ti serve se utilizzi il caching della convertView perchè dovresti "passarla" in qualche modo al tuo thread in modo tale che quando ha finito cambi il colore ma essendo che essa viene riutilizzata se ne perderebbe il riferimento.
« Ultima modifica: 23 Dicembre 2010, 16:00:12 CET da Ricky` »

Offline terenz84

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
Re:Refresh di una listview personalizzata
« Risposta #11 il: 24 Dicembre 2010, 07:53:47 CET »
0
Quindi che tipo di soluzione devo adottare?