Autore Topic: Controllo elemento inserito Listview  (Letto 298 volte)

Offline °Agodie°

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S3 Neo
  • Sistema operativo:
    Windows 8.1
Controllo elemento inserito Listview
« il: 17 Maggio 2014, 18:07:48 CEST »
0
Salve a tutti  :D
Sto lavorando con una listview personalizzata che viene popolata in modo asincrono da un asynctask.
Ho la necessita di eseguire un controllo durante la popolazione della listview, mi spiego meglio: durante l'esecuzione dell'asynctask devo verificare che l'ultimo elemento abbia determinate caratteristiche e se tali sono verificate devo cambiare il colore della riga della listview.

Ho pensato di effettuare tale controllo durante l'onProgressUpdate dell'AsyncTask e tramite log riesco a vedere che, effettivamente, tale controllo viene eseguito con successo, ma quando provo a cambiare (nello stesso metodo) il colore della riga, non cambia assolutamente nulla...

Questo è il codice che mi setta l'adapter alla listview, BackgroundWorker è la classe Asynctask che popola la listview:
Codice (Java): [Seleziona]
private void Refresh(){
                listView = (ListView) findViewById(R.id.listView1);
                memoAdapter = new MemoAdapter(getApplicationContext(), R.layout.listview_memo,
                                        new ArrayList<MemoObject>(), this);
                listView.setAdapter(memoAdapter);
                new BackgroundWorker().execute();
        }

Questo è l'AsyncTask:
Codice (Java): [Seleziona]
private class BackgroundWorker extends AsyncTask<Void, MemoObject, Void> {
                private Cursor c;
                @Override
        protected void onPreExecute() {
                // cleans the adapter
                                dbHelper = new DatabaseHelper(getApplicationContext());
                                memoAdapter.clear();
                super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... params) {
         
            MemoObject memo = null;
            c = dbHelper.getMemoDay(Date);
                        try
                        {
                                while (c.moveToNext())
                                {
                                        memo = new MemoObject(
                                                        c.getString(c.getColumnIndex("Name")), //Name
                                                        c.getString(c.getColumnIndex("Description")), //Description
                                                        c.getString(c.getColumnIndex("Date")), //Date
                                                        c.getString(c.getColumnIndex("Time")), //Hour
                                                        c.getString(c.getColumnIndex("IdMemPk")), //IdMemPk
                                                        c.getString(c.getColumnIndex("Viewed")) //Viewed
                                                        );
                                       
                                                 // Publishing the progress
                                 publishProgress(memo);
                                }
                        }
                        finally
                        {
                                c.close();
                        }
            return null;
        }
       
        @Override
        protected void onProgressUpdate(MemoObject... values) {
                //Insert the memo progress
                        memoAdapter.add(values[0]);
                        if (values[0].getHour().equalsIgnoreCase("null") != true){
                                String          currentDate             = GLOBAL.GetDay("yyyy-MM-dd HH:mm:ss");
                                Timestamp       now                             = GLOBAL.GetTimestamp(currentDate);
                                String          memoDate                = values[0].getDate() + " " +values[0].getHour();
                                Timestamp       memoTimestamp   = GLOBAL.GetTimestamp(memoDate);
                               
                                if (now.compareTo(memoTimestamp) > 0){
                                        Log.d("verifica controllo", "eseguito");

                                        //qua ho cercato di trovare il modo per cambiare colore alla riga della listview
                                        memoAdapter.getView(listView.getCount()-1,
                                                                                listView.getChildAt(listView.getCount()-1),
                                                                                listView).setBackgroundColor(
                                                                                new Color().RED);
                               }                                       
                        }      
                super.onProgressUpdate(values);
        }
       
       @Override
       protected void onPostExecute(Void params){
                if (c != null) {
                        c.close();             
                }
                dbHelper.close();
                super.onPostExecute(params);
       }

}

Grazie in anticipo  ;-)

Post unito: 17 Maggio 2014, 20:38:05 CEST
Ok sono riuscito a risolvere, mi mancava una nozione teorica  :-P
Insomma... non sapevo che il metodo getView viene richiamato in automatico per gestire il layout (in effetti questa cosa mi lasciava un pò dubbioso).
Quindi una volta scoperto questo processo è stato facile fare ciò che chiedevo:
Codice (Java): [Seleziona]
public View getView(int position, View v, ViewGroup parent) {

            // retrieving the objects belonging to this position
            memo = getItem(position);

            MemoObjectCache holder;

            if (v == null) {
                    v = inflater.inflate(resource, parent, false);
                    holder = new MemoObjectCache(v);
                    v.setTag(holder);
            } else {
                holder = (MemoObjectCache) v.getTag();
            }
           
            final ImageView ivViewed = holder.getImageViewViewed();
                ivViewed.setImageResource( memo.getViewedReference());

                TextView tvName = holder.getTextViewName();
                tvName.setText( memo.getName() );

            ivViewed.setTag(memo);
           ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
           if (memo.getHour().equalsIgnoreCase("null") != true){
                        String          currentDate     = GLOBAL.GetDay("yyyy-MM-dd HH:mm:ss");
                        Timestamp       now                             = GLOBAL.GetTimestamp(currentDate);
                        String          memoDate                = memo.getDate() + " " +memo.getHour();
                        Timestamp       memoTimestamp   = GLOBAL.GetTimestamp(memoDate);
                       
                        if (now.compareTo(memoTimestamp) > 0){
                                Log.d("Tadaaa", "funzica!");
                                v.setBackgroundColor(new Color().RED);
                        }                              
                }else{
                        v.setBackgroundColor(new Color().WHITE);
                }
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            ivViewed.setOnClickListener(new OnClickListener() {
                    public void onClick(View view) {
                        if (    ((MemoObject)view.getTag()).getViewedReference() == R.drawable.eye_close        )
                                ((MemoObject)view.getTag()).setViewed("1");
                        else
                                ((MemoObject)view.getTag()).setViewed("0");
                        Intent upMemo = new Intent(MyActivity, UpdateMemoActivity.class);  
                       MyActivity.startActivityForResult(upMemo, GLOBAL.SEND_MOD_MEMO_CODE);
                       
                    }
            });
            holder = ( MemoObjectCache) v.getTag();
            return v;
}
Scusatemi  O:-)
« Ultima modifica: 17 Maggio 2014, 20:38:05 CEST da °Agodie°, Reason: Merged DoublePost »