2013-06-13 18 views
6

Sto provando a programmare un'attività che mostra un viewpager con alcune immagini e una lista di sotto con alcuni dati .. ma il mio problema è che posso scorrere solo il listview sull'ultima parte di lo schermo volevo fare il viewpager scorrevole con ListView così ho pensato di metterlo come intestazione .. ecco il mio file XMLaggiungendo Viewpager come intestazione ad una listaView

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context=".MainActivity" > 

<com.devsmart.android.ui.HorizontalListView 
    android:id="@+id/sectionsList" 
    android:layout_width="wrap_content" 
    android:layout_height="25dp" 
    android:background="@drawable/menu_bg" /> 

<include layout="@layout/main_screen_components" /> 

<ListView 
    android:id="@+id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" /> 

e scrivo questo nella mia classe

@Override 
    protected void onPostExecute(List<News> result) { 
     Utils.pagerNews(result); 
     Utils.listNews(result); 

     ImagePagerAdapter pAdapter = new ImagePagerAdapter(
       appManager.getPagerNews()); 
     pager.setAdapter(pAdapter); 

     View headerView = getLayoutInflater().inflate(R.layout.main_screen_components , null , false); 

     NewsListAdapter adapter = new NewsListAdapter(getBaseContext(), 
       appManager.getListNews()); 
     listView.addHeaderView(headerView); 
     listView.setAdapter(adapter); 
     progress.dismiss(); 
    } 

quando eseguo questo codice mi dà un cercapersone duplicato .. risolto uno con i dati e uno vuoto come un'intestazione del mio listview .. quando rimuovo che include il mio cercapersone si blocca quando provo a impostare un adattatore per il cercapersone .. qualche idea ?

risposta

20

appena impostato di viewPager onTouchListener, in questo modo:

viewPager.setOnTouchListener(new OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
    PointF downP = new PointF(); 
    PointF curP = new PointF(); 
    int act = event.getAction(); 
    if(act == MotionEvent.ACTION_DOWN || act == MotionEvent.ACTION_MOVE || act == MotionEvent.ACTION_UP){ 
     ((ViewGroup) v).requestDisallowInterceptTouchEvent(true); 
     if (downP.x == curP.x && downP.y == curP.y) { 
     return false; 
     } 
    } 
    return false; 
    } 
+0

hai salvato la giornata! Funziona come un fascino. – Antonio

+0

Hai salvato anche la mia giornata! Funziona benissimo ~ – daimajia

+0

@eric Sto affrontando un problema a capire questa funzione. Questa funzione riguarda meno l'azione restituisce false. E dowp e curP sono appena inizializzati ma non hanno alcun cambiamento nei loro valori, il che significa che x, y di dowp e curP sono 0 e quindi sempre uguali. –

0

Utilizzare la classe sotto viewpager personalizzato:

public class CustomViewPager extends ViewPager { 
boolean xScored = false, yScored = false; 

public CustomViewPager(Context context) { 
    super(context); 
} 

public CustomViewPager(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    mGestureDetector.onTouchEvent(ev); 
    if (ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == MotionEvent.ACTION_CANCEL) { 
     xScored = false; 
     yScored = false; 
     requestDisallowInterceptTouchEvent(false); 
    } 
    return super.onTouchEvent(ev); 
} 

GestureDetector.SimpleOnGestureListener mOnGestureListener = new GestureDetector.SimpleOnGestureListener() { 
    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 
     if (!yScored && Math.abs(distanceX) > Math.abs(distanceY)) { 
      xScored = true; 
      yScored = false; 
     } 
     if (xScored) { 
      requestDisallowInterceptTouchEvent(true); 
     } else if (!xScored && Math.abs(distanceY) > Math.abs(distanceX)) { 
      xScored = false; 
      yScored = true; 
      requestDisallowInterceptTouchEvent(false); 
     } 
     return true; 
    } 

}; 
GestureDetector mGestureDetector = new GestureDetector(getContext(), mOnGestureListener); 
} 
Problemi correlati