Autore Topic: maledette listview  (Letto 899 volte)

Offline djdedo

  • Utente normale
  • ***
  • Post: 209
  • Respect: +15
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
maledette listview
« il: 03 Marzo 2013, 13:30:50 CET »
0
Ragazzi sto avendo un problema stranissimo su una listview con custom layout che non sto riuscendo a risolvere. La cosa strana è che sul mio cellulare che uso di solito per lo sviluppo (samsung GS2) funziona tutto regolarmente, mentre su altri cellulari su cui ho provato no.
Praticamente nel layout della riga di questa listview ho inserito un HorizontalScrollView di cui setto le dimensioni a runtime nel getView perchè mi serve la dimensione dello schermo in larghezza. Quello che succede è che su alcuni telefoni è come se non si aggiornasse la view di qualche riga (nemmeno tutte) cosa che si risolve effettuando lo scroll della lista, anche se ogni tanto qualche riga non si visualizza lo stesso e rimane bianca.
Sto letteralmente impazzendo, le ho provate tutte ma senza risultato. La cosa che mi fa imbestialire è che sul mio cell va quindi non sto capendo proprio cosa sia.
Comunque sicuramente ho pasticciato parecchio con il getView e volevo da voi dei consigli su come scriverlo correttamente.
Posto 2 classi (adapter e cache) per farvi avere un'idea ed anche il layout della riga

Adapter:
Codice (Java): [Seleziona]
public class ListaSmsPerCategoriaAdapter extends ArrayAdapter<Sms> {

        private int resource;
        private LayoutInflater inflater;
        private Handler uiActionHandler = null;

        public ListaSmsPerCategoriaAdapter(Context context, int textViewResourceId,
                        List<Sms> objects) {
                super(context, textViewResourceId, objects);
                this.resource = textViewResourceId;
                this.inflater = LayoutInflater.from(context);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
                final Sms sms = getItem(position);
                ListaSmsPerCategoriaCache viewCache;
                final HorizontalScrollView hsv;
               
                if (convertView == null) {
                        convertView = ( LinearLayout ) inflater.inflate( resource, null );
            viewCache = new ListaSmsPerCategoriaCache(convertView);
            convertView.setTag( viewCache );
                } else {
                        convertView = ( LinearLayout ) convertView;
            viewCache = ( ListaSmsPerCategoriaCache ) convertView.getTag();
                }
               
                TextView smsTextView;
                if (sms.isInviato()) {
                        viewCache.getTextviewTestoSms().setVisibility(View.GONE);
                        smsTextView = viewCache.getTextviewTestoSmsInviato();
                } else {
                        viewCache.getTextviewTestoSmsInviato().setVisibility(View.GONE);
                        smsTextView = viewCache.getTextviewTestoSms();
                }
               
                smsTextView.setVisibility(View.VISIBLE);
                smsTextView.setText(sms.getTesto());
               
                LayoutParams params = new LayoutParams(getDisplayWidth(), viewCache.getTextviewTestoSms().getLayoutParams().height);
                viewCache.getLayoutNonPiace().setLayoutParams(params);
                viewCache.getLayoutContent().setLayoutParams(params);
                viewCache.getLayoutInvio().setLayoutParams(params);
               
                hsv = viewCache.getHorizontalScrollView();
                hsv.post(new Runnable() {
                       
                        @Override
                        public void run() {
                                hsv.scrollTo(getDisplayWidth(), 0);
                                hsv.setVisibility(View.VISIBLE);
                        }
                });
               
                hsv.setOnTouchListener(new OnTouchListener() {
                       
                        @Override
                        public boolean onTouch(final View v, MotionEvent ev) {
                                switch (ev.getAction()) {
                                case MotionEvent.ACTION_UP:
                                        if (v.getScrollX() < (getDisplayWidth() / 3)) {
                                                Toast.makeText(getContext(), "non mi piace", Toast.LENGTH_SHORT).show();
                                        } else if (v.getScrollX() > ((5 * getDisplayWidth()) / 3)) {
                                                sendMessageToUI(SmsPerCategoriaActivity.ACTION_INVIO_SMS, sms);
                                        }
                                       
                                        v.post(new Runnable() {
                                               
                                                @Override
                                                public void run() {
                                                        v.scrollTo(getDisplayWidth(), 0);
                                                }
                                        });
                                        return true;

                                default:
                                        return false;
                                }
                        }
                });
               
                return convertView;
        }
       
        public int getDisplayWidth() {
                WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
                Display display = wm.getDefaultDisplay();
                return display.getWidth();
        }
       
        public void setUiActionListener(Handler h) {
                this.uiActionHandler = h;
        }
       
        public void sendMessageToUI(int what, Object obj) {
                if (uiActionHandler != null) {
                        if (obj != null) {
                                Message msg = new Message();
                                msg.what = what;
                                msg.obj = obj;
                                uiActionHandler.sendMessage(msg);
                        } else {
                                uiActionHandler.sendEmptyMessage(what);
                        }
                }
        }
}

View cache:
Codice (Java): [Seleziona]
public class ListaSmsPerCategoriaCache {

        private View baseview;
        private TextView textviewTestoSms;
        private TextView textviewTestoSmsInviato;
        private HorizontalScrollView horizontalScrollView;
        private LinearLayout layoutNonPiace;
        private LinearLayout layoutContent;
        private LinearLayout layoutInvio;
       
        public ListaSmsPerCategoriaCache(View v) {
                this.baseview = v;
        }

        public TextView getTextviewTestoSms() {
                if (this.textviewTestoSms == null)
                        this.textviewTestoSms = (TextView) this.baseview.findViewById(R.id.textview_list_smspercategoria_item_testo);
                return this.textviewTestoSms;
        }
       
        public TextView getTextviewTestoSmsInviato() {
                if (this.textviewTestoSmsInviato == null)
                        this.textviewTestoSmsInviato = (TextView) this.baseview.findViewById(R.id.textview_list_smspercategoria_item_testo_inviato);
                return this.textviewTestoSmsInviato;
        }

        public HorizontalScrollView getHorizontalScrollView() {
                if (this.horizontalScrollView == null)
                        this.horizontalScrollView = (HorizontalScrollView) this.baseview.findViewById(R.id.horizontalScrollView_list_smspercategoria);
                return this.horizontalScrollView;
        }

        public LinearLayout getLayoutNonPiace() {
                if (this.layoutNonPiace == null)
                        this.layoutNonPiace = (LinearLayout) this.baseview.findViewById(R.id.linearlayout_swipe_non_piace);
                return this.layoutNonPiace;
        }

        public LinearLayout getLayoutContent() {
                if (this.layoutContent == null)
                        this.layoutContent = (LinearLayout) this.baseview.findViewById(R.id.linearlayout_swipe_content);
                return this.layoutContent;
        }

        public LinearLayout getLayoutInvio() {
                if (this.layoutInvio == null)
                        this.layoutInvio = (LinearLayout) this.baseview.findViewById(R.id.linearlayout_swipe_invio);
                return this.layoutInvio;
        }
}

Layout della riga:
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical" >
   
    <HorizontalScrollView
       android:id="@+id/horizontalScrollView_list_smspercategoria"
       android:layout_height="80dp"
       android:layout_width="wrap_content"
       android:scrollbars="none"
       android:visibility="invisible" >
       
        <LinearLayout
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:orientation="horizontal" >
       
                <LinearLayout
                    android:id="@+id/linearlayout_swipe_non_piace"
                    android:layout_width="wrap_content"
                    android:layout_height="80dp"
                    android:background="#B20000"
                    android:orientation="horizontal"
                    android:gravity="right|center_vertical" >
                   
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="non piace"
                        android:textSize="16dp"
                        android:textStyle="bold"
                        android:textColor="#FFFFFF"
                        android:paddingRight="10dp"
                        android:layout_weight="0" />
                   
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="&gt;"
                        android:textSize="16dp"
                        android:textStyle="bold"
                        android:textColor="#FFFFFF"
                        android:paddingRight="5dp"
                        android:layout_weight="0" />
                   
                </LinearLayout>
               
                <LinearLayout
                    android:id="@+id/linearlayout_swipe_content"
                    android:layout_width="wrap_content"
                    android:paddingLeft="10dp"
                    android:paddingRight="10dp"
                    android:layout_height="80dp" >
                   
                    <TextView
                                android:id="@+id/textview_list_smspercategoria_item_testo"
                                android:layout_width="match_parent"
                                android:layout_height="80dp"
                                android:layout_weight="1"
                                android:gravity="center_vertical" />
                           
                            <TextView
                                android:id="@+id/textview_list_smspercategoria_item_testo_inviato"
                                android:layout_width="match_parent"
                                android:layout_height="80dp"
                                android:layout_weight="1"
                                android:gravity="center_vertical"
                                android:background="@android:color/darker_gray"
                                android:visibility="gone" />
                   
                </LinearLayout>
               
                <LinearLayout
                    android:id="@+id/linearlayout_swipe_invio"
                    android:layout_width="wrap_content"
                    android:layout_height="80dp"
                    android:background="#00A86B"
                    android:orientation="horizontal"
                    android:gravity="left|center_vertical" >
                           
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="&lt;"
                        android:textSize="16dp"
                        android:textStyle="bold"
                        android:textColor="#FFFFFF"
                        android:paddingLeft="5dp"
                        android:layout_weight="0" />
                           
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="invia"
                        android:textSize="16dp"
                        android:textStyle="bold"
                        android:textColor="#FFFFFF"
                        android:paddingLeft="10dp"
                        android:layout_weight="0" />
                           
                </LinearLayout>
       
        </LinearLayout>
       
    </HorizontalScrollView>

</LinearLayout>

Attendo suggerimenti e consigli  :-)

Post unito: 04 Marzo 2013, 18:05:50 CET
Nessuno? :(
« Ultima modifica: 04 Marzo 2013, 18:05:50 CET da djdedo, Reason: Merged DoublePost »

Offline djdedo

  • Utente normale
  • ***
  • Post: 209
  • Respect: +15
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
Re:maledette listview
« Risposta #1 il: 06 Marzo 2013, 17:13:01 CET »
0
Possibile non ci sia nessuno che mi sappia aiutare?

Offline elfo83

  • Utente normale
  • ***
  • Post: 287
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:maledette listview
« Risposta #2 il: 06 Marzo 2013, 17:15:51 CET »
0
Stasera cerco di risponderti ora sto lavorando.Probabilmente leggerai la mia risposta stanotte o domani perché sono 6 ore indietro l'Italia :).

Offline djdedo

  • Utente normale
  • ***
  • Post: 209
  • Respect: +15
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
Re:maledette listview
« Risposta #3 il: 06 Marzo 2013, 17:17:04 CET »
0
ok attendo con ansia, io ancora non ne sono venuto a capo :)

Offline elfo83

  • Utente normale
  • ***
  • Post: 287
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:maledette listview
« Risposta #4 il: 06 Marzo 2013, 17:18:59 CET »
0
Ok, spero di poterti aiutare..a più tardi.

Post unito: 07 Marzo 2013, 06:05:08 CET
Premesso che è difficile diagnosticare quali sono gli errori se non si può testare il codice, comunque iniziamo con chiarire alcune cose...
tu dici :"un HorizontalScrollView di cui setto le dimensioni a runtime nel getView perchè mi serve la dimensione dello schermo in larghezza"..
dal quello che ho capito, il contenuto di ogni cella della tua listView può essere + largo della larghezza del telefono e questo è il motivo per cui usi una horizontalScrollView. Nel file xml secondo me ci sono degli errori:
-attributo layout_height:match_parent del primo linearLayout. Se quella è una cella della lista perchè devi settare l'altezza match_parent? Ti conviene specificare un valore in dip oppure, se sai che l'altezza di tutte le celle è sempre la stessa puoi scegliere wrap_content. Io comunque ti consiglio di fissare un valore in dip.
-attributo layout_height:wrap_content dell'horizontalScrollView. Se hai deciso di usare questo widget, probabilmente il contenuto di alcune celle della lista sarà + grande in larghezza della larghezza delle celle. Non hai postato il file .xml della tua activity, ma nel caso la lista occupa tutto lo schermo, l'attributo layout_height dell'horizontalScrollView dovresti settarlo a match_parent.

Nel costruttore dell'adapter devi inizializzare la lista:
Codice (Java): [Seleziona]
Codice (Java): [Seleziona]
public class ListaSmsPerCategoriaAdapter extends ArrayAdapter<Sms> {
       Activity context;
        private Handler uiActionHandler = null;
        private ArrayList<Sms> lista ;
        public ListaSmsPerCategoriaAdapter(Context context, int textViewResourceId,
                        List<Sms> objects) {
                super(context, textViewResourceId, objects);
               this.context=context;
             this.lista=objects;
        }

nel getView:

Codice (Java): [Seleziona]
 @Override
        public View getView(int position, View convertView, ViewGroup parent) {
View rowView = convertView;
 ListaSmsPerCategoriaCache viewCache=null;
         if (rowView == null)
                        {
                                LayoutInflater vi =  context.getLayoutInflater();
                                rowView = vi.inflate(R.layout.cellaListView, null);    
                               viewCache=new ListaSmsPerCategoriaCache(rowView);
                                rowView.setTag(viewCache);
                               
                        }
else
{
viewCache=(ListaSmsPerCategoriaCache)rowView.getTag();
}

final Sms sms = getItem(position);
if(sms != null)
{
//fai l'altra roba
}

Diciamo che ho dato un'occhiata + o - fino a qui. Ad essere sincero non ho ben chiaro cosa vuoi fare all'interno del getView()...tipo perchè usi un Runnable per scrollare l'horizzontalScrollView tutta a destra...
Comunque inizia a riflettere su quesllo che ti ho scritto e dimmi cosa ne pensi..
« Ultima modifica: 07 Marzo 2013, 06:05:08 CET da elfo83, Reason: Merged DoublePost »

Offline djdedo

  • Utente normale
  • ***
  • Post: 209
  • Respect: +15
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
Re:maledette listview
« Risposta #5 il: 12 Marzo 2013, 19:21:44 CET »
0
Ti chiedo scusa se non ho risposto finora ma non avevo visto la risposta non essendomi arrivata la notifica.
Allora ti rispondo subito che implementerò le migliorie che mi hai scritto, ma come mai devo inizializzare la lista di oggetti? Non me lo posso richiamare col getItem? O questo può creare problemi?
Si per ora la activity contiene soltanto la lista, per questo non ho postato il suo layout.
Uso un runnable per scrollare la horizontalScrollView perchè altrimenti il metodo scrollTo non funziona.
Ti ringrazio per la risposta e ti faccio sapere al più presto quando ho aggiornato il codice ;)

Post unito: 13 Marzo 2013, 11:07:19 CET
Ciao ho modificato il codice con i tuoi suggerimenti ma non è cambiato nulla.
Ho da chiederti alcune delucidazioni, ad esempio questo passaggio non l'ho capito


Citazione
-attributo layout_height:wrap_content dell'horizontalScrollView. Se hai deciso di usare questo widget, probabilmente il contenuto di alcune celle della lista sarà + grande in larghezza della larghezza delle celle. Non hai postato il file .xml della tua activity, ma nel caso la lista occupa tutto lo schermo, l'attributo layout_height dell'horizontalScrollView dovresti settarlo a match_parent.
cosa dovrei fare?


Poi tu hai inizializzato una lista nel costruttore che poi non utilizzi nel getView ma utilizzi invece il getItem. Ho provato ad utilizzare invece la lista inizializzata ma la situazione non cambia.
Aggiungo anche che se nell'activity non inserisco questo "escamotage" la prima volta che visualizzo la lista gli item sono completamente bianchi, e si iniziano a settare come dovrebbero solo quando si inizia a scrollare
Codice (Java): [Seleziona]
listview_sms.post(new Runnable() {
                                       
                                        @Override
                                        public void run() {
                                                listview_sms.setSelection(listview_sms.getCount() - 1);
                                                listview_sms.setSelection(0);
                                        }
                                });

Post unito: 13 Marzo 2013, 12:02:52 CET
Aggiungo che ho modificato l'ordine di alcune istruzioni nel getView mettendo lo scrollTo alla fine e rimuovendo l' "escamotage" dalla activity.
Quello che succede ora è che visualizzo la prima parte di ogni HorizontalScrollView quindi in sostanza non sta funzionando ora il metodo scrollTo nel Runnable.
Posto il getView modificato:
Codice (Java): [Seleziona]
@Override
        public View getView(int position, View convertView, final ViewGroup parent) {
                View rowView = convertView;
                final Sms sms = this.listaSms.get(position);
                ListaSmsPerCategoriaCache viewCache = null;
                final HorizontalScrollView hsv;
               
                if (rowView == null) {
                        LayoutInflater inflater = this.context.getLayoutInflater();
                        rowView = inflater.inflate( resource, null );
            viewCache = new ListaSmsPerCategoriaCache(rowView);
            rowView.setTag( viewCache );
                } else {
            viewCache = ( ListaSmsPerCategoriaCache ) rowView.getTag();
                }
               
                if (sms != null) {
               
                        TextView smsTextView;
                        if (sms.isInviato()) {
                                viewCache.getTextviewTestoSms().setVisibility(View.GONE);
                                smsTextView = viewCache.getTextviewTestoSmsInviato();
                        } else {
                                viewCache.getTextviewTestoSmsInviato().setVisibility(View.GONE);
                                smsTextView = viewCache.getTextviewTestoSms();
                        }
                       
                        smsTextView.setVisibility(View.VISIBLE);
                        smsTextView.setText(sms.getTesto());
                       
                        LayoutParams params = new LayoutParams(getDisplayWidth(), viewCache.getTextviewTestoSms().getLayoutParams().height);
                        viewCache.getLayoutNonPiace().setLayoutParams(params);
                        viewCache.getLayoutContent().setLayoutParams(params);
                        viewCache.getLayoutInvio().setLayoutParams(params);
                       
                        hsv = viewCache.getHorizontalScrollView();
                        hsv.setVisibility(View.VISIBLE);
                       
                        hsv.setOnTouchListener(new OnTouchListener() {
                               
                                @Override
                                public boolean onTouch(final View v, MotionEvent ev) {
                                        switch (ev.getAction()) {
                                        case MotionEvent.ACTION_MOVE:
                                                ((ListView) v.getParent().getParent()).requestDisallowInterceptTouchEvent(!gestureDetector.onTouchEvent(ev));
                                                return false;
                                       
                                        case MotionEvent.ACTION_UP:
                                                if (v.getScrollX() < (getDisplayWidth() / 3)) {
                                                        Toast.makeText(getContext(), "non mi piace", Toast.LENGTH_SHORT).show();
                                                } else if (v.getScrollX() > ((5 * getDisplayWidth()) / 3)) {
                                                        sendMessageToUI(SmsPerCategoriaActivity.ACTION_INVIO_SMS, sms);
                                                }
                                               
                                                v.post(new Runnable() {
                                                       
                                                        @Override
                                                        public void run() {
                                                                v.scrollTo(getDisplayWidth(), 0);
                                                        }
                                                });
                                                ((ListView) v.getParent().getParent()).requestDisallowInterceptTouchEvent(false);
                                                direction = 0;
                                                return true;
       
                                        default:
                                                return false;
                                        }
                                }
                        });
                       
                        hsv.post(new Runnable() {
                               
                                @Override
                                public void run() {
                                        hsv.scrollTo(getDisplayWidth(), 0);
                                }
                        });
                }
               
                return rowView;
        }

Post unito: 13 Marzo 2013, 16:50:29 CET

Continuo ad aggiornare perchè ovviamente continuo a fare prove, ho modificato il getview come segue
Codice (Java): [Seleziona]
@Override
        public View getView(int position, View convertView, final ViewGroup parent) {
                Log.d("adapter position", String.valueOf(position));
                View rowView = convertView;
                final Sms sms = this.listaSms.get(position);
                ListaSmsPerCategoriaCache viewCache = null;
                final HorizontalScrollView hsv;
               
                if (rowView == null) {
                        rowView = inflater.inflate( resource, null );
            viewCache = new ListaSmsPerCategoriaCache(rowView);
            rowView.setTag( viewCache );
           
            LayoutParams params = new LayoutParams(getDisplayWidth(), viewCache.getTextviewTestoSms().getLayoutParams().height);
                        viewCache.getLayoutNonPiace().setLayoutParams(params);
                        viewCache.getLayoutContent().setLayoutParams(params);
                        viewCache.getLayoutInvio().setLayoutParams(params);
                } else {
            viewCache = ( ListaSmsPerCategoriaCache ) rowView.getTag();
                }
               
                if (sms != null) {
               
                        TextView smsTextView;
                        if (sms.isInviato()) {
                                viewCache.getTextviewTestoSms().setVisibility(View.GONE);
                                smsTextView = viewCache.getTextviewTestoSmsInviato();
                        } else {
                                viewCache.getTextviewTestoSmsInviato().setVisibility(View.GONE);
                                smsTextView = viewCache.getTextviewTestoSms();
                        }
                       
                        smsTextView.setVisibility(View.VISIBLE);
                        smsTextView.setText(sms.getTesto());
                       
                        hsv = viewCache.getHorizontalScrollView();
                        hsv.setOnTouchListener(new OnTouchListener() {
                               
                                @Override
                                public boolean onTouch(final View v, MotionEvent ev) {
                                        switch (ev.getAction()) {
                                        case MotionEvent.ACTION_MOVE:
                                                ((ListView) v.getParent().getParent()).requestDisallowInterceptTouchEvent(!gestureDetector.onTouchEvent(ev));
                                                return false;
                                       
                                        case MotionEvent.ACTION_UP:
                                                if (v.getScrollX() < (getDisplayWidth() / 3)) {
                                                        Toast.makeText(getContext(), "non mi piace", Toast.LENGTH_SHORT).show();
                                                } else if (v.getScrollX() > ((5 * getDisplayWidth()) / 3)) {
                                                        sendMessageToUI(SmsPerCategoriaActivity.ACTION_INVIO_SMS, sms);
                                                }
                                               
                                                v.post(new Runnable() {
                                                       
                                                        @Override
                                                        public void run() {
                                                                v.scrollTo(getDisplayWidth(), 0);
                                                        }
                                                });
                                                ((ListView) v.getParent().getParent()).requestDisallowInterceptTouchEvent(false);
                                                direction = 0;
                                                return true;
       
                                        default:
                                                return false;
                                        }
                                }
                        });
                       
                        OnGlobalLayoutListener layoutListener = new OnGlobalLayoutListener() {
                               
                                @Override
                                public void onGlobalLayout() {
                                        hsv.scrollTo(getDisplayWidth(), 0);
                                        hsv.setVisibility(View.VISIBLE);
                                }
                        };
                        viewCache.getGlobalLayout().getViewTreeObserver().addOnGlobalLayoutListener(layoutListener);
                }
               
                return rowView;
        }


Ho aggiunto un globalLayoutListener al linear layout principale ed in questo modo, sempre avendo rimosso l' "escamotage" nell'activity inizia a funzionare bene, tranne però per il fatto che il primo item NON visibile non viene customizzato, quindi con intervalli regolari nella lista mi ritrovo un item completamente bianco.
« Ultima modifica: 13 Marzo 2013, 16:50:29 CET da djdedo, Reason: Merged DoublePost »

Offline djdedo

  • Utente normale
  • ***
  • Post: 209
  • Respect: +15
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
Re:maledette listview
« Risposta #6 il: 15 Marzo 2013, 13:35:28 CET »
0
Ciao, credo di aver risolto. Ho impostato 2 listener di cui ignoravo completamente l'esistenza che mi sono stati di grande aiuto.
In sostanza quello che non si riusciva a gestire bene era lo scrollTo della horizontalscrollview molto probabilmente perchè android andava in pappa con il runnable dopo aver restituito la view.
Il getview è ora scritto così nella prima parte


Codice (Java): [Seleziona]
if (convertView == null) {
                        convertView = inflater.inflate( resource, null );
            viewCache = new ListaSmsPerCategoriaCache(convertView);
           
            LayoutParams params = new LayoutParams(getDisplayWidth(), viewCache.getTextviewTestoSms().getLayoutParams().height);
                        viewCache.getLayoutNonPiace().setLayoutParams(params);
                        viewCache.getLayoutContent().setLayoutParams(params);
                        viewCache.getLayoutInvio().setLayoutParams(params);
                       
                        final HorizontalScrollView h = viewCache.getHorizontalScrollView();
                       
                        OnGlobalLayoutListener layoutListener = new OnGlobalLayoutListener() {
                               
                                @Override
                                public void onGlobalLayout() {
                                        h.scrollTo(getDisplayWidth(), 0);
                                }
                        };
                       
                        OnPreDrawListener preDrawListener = new OnPreDrawListener() {
                               
                                @Override
                                public boolean onPreDraw() {
                                        if (h.getScrollX() == 0) {
                                                h.scrollTo(getDisplayWidth(), 0);
                                        }
                                        return true;
                                }
                        };
                       
                        viewCache.getGlobalLayout().getViewTreeObserver().addOnGlobalLayoutListener(layoutListener);
                        viewCache.getGlobalLayout().getViewTreeObserver().addOnPreDrawListener(preDrawListener);
           
            convertView.setTag( viewCache );
                } else {
            viewCache = ( ListaSmsPerCategoriaCache ) convertView.getTag();
                }


Diciamo che i nomi dei listener sono autoesplicativi, quindi vengono applicati sul linearlayout root dell'item. In particolare il OnPreDrawListener mi aiuta a risolvere il problema che si verificava con le ultime modifiche, cioè che il primo item NON visibile non veniva scrollato correttamente. Ora lo fa :)

Offline elfo83

  • Utente normale
  • ***
  • Post: 287
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:maledette listview
« Risposta #7 il: 15 Marzo 2013, 15:38:25 CET »
0
hai risolto quindi?

Offline djdedo

  • Utente normale
  • ***
  • Post: 209
  • Respect: +15
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
Re:maledette listview
« Risposta #8 il: 15 Marzo 2013, 15:54:22 CET »
0
sembrerebbe di si, provatu su diversi device e non mi sta dando problemi