Autore Topic: ViewPager dentro ListView  (Letto 611 volte)

Offline elfo83

  • Utente normale
  • ***
  • Post: 283
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
ViewPager dentro ListView
« il: 15 Settembre 2013, 16:26:15 CEST »
0
Ciao a tutti, ho un piccolo problema con una listView e ViewPager. In pratica ho complessa listView con 4 tipi diversi di item. In un tipo di elemento della lista ho un ViewPager che ovviamente può essere sfogliato. Ovviamente ci sono dei problemi di intercettazione dell'evento onTouch() tra il viewPager e la lista. Inizialmente, per risolvere il problema ho creato un viewPager personalizzato il quale ha una variabile boleana chiamata "isPagingEnabled". Se la variabile è true allora il view pager disattiva la possibilità di intercettare gli eventi a gli altri componenti dell'attività:

Codice (Java): [Seleziona]
package com.qriket.qriket.utils;

import java.lang.reflect.Field;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.animation.Interpolator;

public class CustomViewPager extends ViewPager {

    private boolean isPagingEnabled;
    private ScrollerCustomDuration mScroller;
       
        public CustomViewPager(Context context, AttributeSet attrs) {
                super(context, attrs);
                this.isPagingEnabled=true;
                postInitViewPager();
        }
        public CustomViewPager(Context context) {
                super(context);
        postInitViewPager();

        }
       
         @Override
            public boolean onTouchEvent(MotionEvent event){
                 
                 if(isPagingEnabled)
                 {
                requestDisallowInterceptTouchEvent(true);
                return super.onTouchEvent(event);
                 }
                 return false;
            }
         
       
         @Override
            public boolean onInterceptTouchEvent(MotionEvent event) {
                if (this.isPagingEnabled) {
                    return super.onInterceptTouchEvent(event);
                }

                return false;
            }
         
          public void setPagingEnabled(boolean b) {
                this.isPagingEnabled = b;
            }
         
          private void postInitViewPager() {
                try {
                    Class<?> viewpager = ViewPager.class;
                    Field scroller = viewpager.getDeclaredField("mScroller");
                    scroller.setAccessible(true);
                    Field interpolator = viewpager.getDeclaredField("sInterpolator");
                    interpolator.setAccessible(true);

                    mScroller = new ScrollerCustomDuration(getContext(),
                            (Interpolator) interpolator.get(null));
                    scroller.set(this, mScroller);
                } catch (Exception e) {
                }
            }

            /**
             * Set the factor by which the duration will change
             */

            public void setScrollDurationFactor(double scrollFactor) {
                mScroller.setScrollDurationFactor(scrollFactor);
            }

}

In questo modo funziona tutto bene, ma ovviamente se quella variabile è settata a true, la lista non scorre correttamente, perchè nel momento in cui il mio dito è sulla parte del display in cui c'è il viewPager la listView non intercetta l'evento di scroll. Al contrario, se uso il classico viewPager, la listView funziona correttamente, mentre il viewPager no. Per far funzionare bene il viewpager devo aspettare che la lista sia ferma e con il dito devo eseguire un movimento piuttosto preciso in orizzontale sul viewpager.Se il movimento non è preciso, vedo che la prima pagina inizia a scorrere e poi torna ovviamente nella posizione di partenza. Inoltre ho un ulteriore problema: nella prima pagina del viewpager non c'è nulla, infatti il layout è dichiarato in questo modo:

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"
   android:background="@android:color/transparent"
   android:id="@+id/sharefirst_root"
   >

</LinearLayout>

sotto il view pager c'è un'immagine che può essere cliccata. Al click apro una webview. Ovviamente, dato che il viewpager è sopra l'immagine, quest'ultima non può essere cliccata ma se provo a settare un clicklistener sulla prima pagina del viewpager, il click non viene intercettato.

Questo è quello che faccio all'interno del listAdapter:

Codice (Java): [Seleziona]
 wrapShare.getViewPager().findViewById(R.id.sharefirst_root).setOnClickListener(new OnClickListener(){

                                                                        @Override
                                                                        public void onClick(View v) {
                                                                                openWebView(m_url,m_title);
                                                                                progress.setVisibility(View.VISIBLE);
                                                                                Log.d("CLICCATO","OK");
                                                                        }
                                                                       
                                                                });
Il click sulla pagina non viene intercettato, infatti nel loggat non riesco a stampare il messaggio CLICCATO OK.

Le mie domande quindi sono 2:
1) come posso scrollare la listView anche quando eseguo movimenti verticali sul viewPager e nello stesso tempo fare correttamente lo swipe del viewpager?
2) come posso far funzionare il click sulla prima pagina del viewPager?

Grazie

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:ViewPager dentro ListView
« Risposta #1 il: 15 Settembre 2013, 21:47:43 CEST »
0
Mi sembra un layout molto complesso e abbastanza complicato all'uso pratico dell'utente.
Perchè vuoi inserire un ViewPager dentro un elemento della ListView?

Offline elfo83

  • Utente normale
  • ***
  • Post: 283
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:ViewPager dentro ListView
« Risposta #2 il: 16 Settembre 2013, 05:08:41 CEST »
0
Si è abbastanza complesso. La tua domanda vorrei porla anche io al mio boss.

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:ViewPager dentro ListView
« Risposta #3 il: 16 Settembre 2013, 12:25:44 CEST »
0
io mi son fermato al titolo, perchè un view pager dentro la listview non s'ha da fare per vari motivi:
1- come gestisci il riciclo delle view e tutta la serie di allocazioni che deve fare il device mentre scorri in alto e in basso?
2- generalmente si fa il contrario (listview dentro viewpager)
3- se ti serve che gli elementi della listview abbiano l'azione di swipe, puoi usare la libreria di romannurik (Swipe-List-View dovrebbe chiamarsi)
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline elfo83

  • Utente normale
  • ***
  • Post: 283
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:ViewPager dentro ListView
« Risposta #4 il: 16 Settembre 2013, 16:28:31 CEST »
0
Innanzitutto grazie per le risposte.
Citazione
1- come gestisci il riciclo delle view e tutta la serie di allocazioni che deve fare il device mentre scorri in alto e in basso?

Un viewPager, nonostante sia un elemento abbastanza complesso, lo interpreto una view come tutte le altre. Quindi, utilizzando il pattern holder per gli elementi delle listview, lo inserisco come una semplice view:

Codice (Java): [Seleziona]
public class WrapperView
{
....
private ViewPager pager= null;

//e poi farò

private ViewPager getPager()
{
if(pager==null)
{
pager=(ViewPager)base.findViewById(R.id.pager);
}
return pager.
}
}

e poi nell'adapter della listView lo inizializzo. Mi rendo conto che è un'operazione abbastanza assurda.

Citazione
2- generalmente si fa il contrario (listview dentro viewpager)

Ad essere onesto non l'ho mai visto. Perchè dovrei mettere una listview dentro un viewpager?(stessa domanda potresti farmi tu ma non l'ho deciso io :) )

Citazione
3- se ti serve che gli elementi della listview abbiano l'azione di swipe, puoi usare la libreria di romannurik (Swipe-List-View dovrebbe chiamarsi)

non la conosco. Vado subito a vedere. Grazie mille

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:ViewPager dentro ListView
« Risposta #5 il: 16 Settembre 2013, 16:44:35 CEST »
0

Ad essere onesto non l'ho mai visto. Perchè dovrei mettere una listview dentro un viewpager?(stessa domanda potresti farmi tu ma non l'ho deciso io :) )

Lo vedi tutti i giorni quando apri il play store.... :D
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline elfo83

  • Utente normale
  • ***
  • Post: 283
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:ViewPager dentro ListView
« Risposta #6 il: 16 Settembre 2013, 17:32:08 CEST »
0
Giusto. Ho appena dato un'occhiata alla libreria che mi hai suggerito e andrebbe bene, solo credo che ci voglia parecchio tempo per implementarla nel mio progetto. Non so se la userò, forse cercherò di convincere il boss che non è una cosa buona da fare. Ho visto il video dimostrativo e mi sembra che lo swipe sia circolare, nel senso che il tipo fa lo swipe illimitatamente verso sinistra il view pager continua a scrollare senza arrivare ad un'ultima pagina. Non so se sia un'opzione che si può modificare.