2008-11-20 15 views
32

Estoy completamente perplejo en este caso. Tengo tres listas diferentes que deben mostrarse en la pantalla. Es completamente posible que las listas se extiendan más allá del borde inferior de la pantalla, así que necesitaría desplazarse.Desplazamiento con múltiples ListViews para Android

He intentado usar un ScrollView con un niño LinearLayout, y poner mi ListViews en el LinearView, pero todos de la cerradura ListViews a una altura fija con barras de desplazamiento. Usar otros tipos de diseños significa no desplazarse.

¿Alguien tiene alguna sugerencia o tendré que agregar los elementos de la lista programáticamente a algún diseño y esperar lo mejor?

Respuesta

6

No he hecho esto todavía, pero he estado pensando en ello ya que probablemente necesite hacerlo. Puedo pensar en tres opciones: usar solo una lista con el contenido de todas las listas. Puede hacer un ListAdapter que lo haga e inserte algún tipo de encabezado. Esto probablemente podría ser algo muy reutilizable.

La otra idea es hacer una lista de listas. Pero eso suena como pedir problemas.

+2

¿Cuál es la tercera opción? Porque también estoy interesado en ese tema e intenté hacer ListViews en un enfoque de ListView para la pregunta http://stackoverflow.com/questions/1526831/android-scrollview-layout-problem (aunque no he visto tu respuesta antes de). Hablar con los chicos en # android-dev, poner ListViews en un ListView es incluso peor que ponerlos en ScrollView. (Y también lo fueron mis resultados.) Debido a su post guerra escrita hace bastante tiempo, ¿ya ha probado la solución todo en una lista? – svens

6

tuve un problema similar excepto que tenía dos GridViews y un ListView para desplazarse. Lo resuelto por la configuración manual de la altura de la listviews y GridView:

ListAdapter listAdapter = listView.getAdapter(); 

    int rows = listAdapter.getCount()/columns; 
    int height = 60 * rows; // Insert the general cell height plus the dividers. 

    ViewGroup.LayoutParams params = listView.getLayoutParams(); 
    params.height = height; 
    listView.setLayoutParams(params); 
    listView.requestLayout(); 

Esperanza pudiera ayudar a alguien.

11

Reenviar evento táctil desde touched ver a otras vistas. Todas sus vistas se sincronizarán expandir/colapsar también.

OnTouchListener mOnTouch = new OnTouchListener() 
    { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) 
     {    
      MotionEvent newEvent = MotionEvent.obtain(event); 
      switch(event.getAction()){ 
      case MotionEvent.ACTION_MOVE: 
       if(mTouched == null){ 
        mTouched = v; 
       } 
       mMovingFlag = true; 
       break; 
      case MotionEvent.ACTION_UP: 
       if(mMovingFlag==false){ 
        newEvent.setAction(MotionEvent.ACTION_CANCEL); 
       } 
       mMovingFlag = false; 
       break; 
      default: 
       mMovingFlag = false; 
       if(mTouched != null && mTouched.equals(v)){ 
        mTouched = null; 
       } 
       break; 

      } 
      if(mTouched == null || mTouched.equals(v)){ 
       int items = mLayoutWithListViews.getChildCount(); 
       for(int list=0; list<items; list++){ 
        AbsListView listView =mLayoutWithListViews.getChildAt(list)); 
        if(listView != v){ 
         listView.onTouchEvent(newEvent); 
        } 
       } 
      } 
      return false; 
     } 
    }; 
+0

Ojalá pudiera votar más de una vez. –

+1

Lo siento, pero no sé cómo implementar esta respuesta. se mTouched, mMovingFlag variables globales? ¿Pertenecen a las otras listas? ¿Es en este ejemplo mLayoutWithListViews la otra vista de lista que queremos sincronizar? Gracias. – Graph

+0

de verdad. Incluye todo el código por favor .................... –

3

Aunque esta respuesta es para la vista de desplazamiento en lugar de la vista de lista, el problema es el mismo y esta solución funcionó bien para mí. Al desplazarse por la vista de desplazamiento izquierda, se desplazará la vista de desplazamiento hacia la derecha y viceversa.

public class MainActivity extends Activity implements OnTouchListener { 
    private ScrollView scrollViewLeft; 
    private ScrollView scrollViewRight; 
    private static String LOG_TAG = MainActivity.class.getName(); 
    private boolean requestedFocus = false; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     scrollViewLeft = (ScrollView) findViewById(R.id.scrollview_left); 
     scrollViewRight = (ScrollView) findViewById(R.id.scrollview_right); 

     scrollViewLeft.setOnTouchListener(this); 
     scrollViewRight.setOnTouchListener(this); 

     scrollViewLeft.setFocusableInTouchMode(true); 
     scrollViewRight.setFocusableInTouchMode(true); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onTouch(View view, MotionEvent motionEvent) { 
     Log.d(LOG_TAG, "--> View, event: " + view.getId() + ", " + motionEvent.getAction() + ", " + view.isFocused()); 
     Log.d(LOG_TAG, "--> " + scrollViewLeft.isFocused() + ", " + scrollViewRight.isFocused()); 

     if (motionEvent.getAction() == MotionEvent.ACTION_DOWN && requestedFocus == false){ 
      view.requestFocus(); 
      requestedFocus = true; 
     }else if (motionEvent.getAction() == MotionEvent.ACTION_UP){ 
      requestedFocus = false; 
     } 

     if (view.getId() == R.id.scrollview_left && view.isFocused()){ 
      scrollViewRight.dispatchTouchEvent(motionEvent); 
     }else if (view.getId() == R.id.scrollview_right && view.isFocused()){ 
      scrollViewLeft.dispatchTouchEvent(motionEvent); 
     } 

     return super.onTouchEvent(motionEvent); 
    } 
} 
1
ListAdapter listAdapter = listView.getAdapter(); 
int rows = listAdapter.getCount()/columns; 
int height = 60 * rows; // Insert the general cell height plus the dividers. 
ViewGroup.LayoutParams params = listView.getLayoutParams(); 
params.height = height; 
listView.setLayoutParams(params); 
listView.requestLayout(); 
Cuestiones relacionadas