Pregunta

Estoy completamente perplejo con este. 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, por lo que necesitaría desplazarme.

He intentado usar un ScrollView con un elemento secundario LinearLayout y poner mis ListViews en el LinearView , pero todos los ListViews se bloquean a una altura fija con barras de desplazamiento. Usar otros tipos de diseños significa que no hay desplazamiento.

¿Alguien tiene alguna sugerencia, o tendré que agregar mediante programación los elementos de la lista a algún diseño y esperar lo mejor?

¿Fue útil?

Solución

Todavía no he hecho esto, pero he estado pensando en ello, ya que probablemente deba hacerlo. Puedo pensar en tres opciones: usar solo una lista con el contenido de todas las listas. Puede hacer un ListAdapter que haga eso 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.

Otros consejos

Reenviar evento táctil desde la vista tocada a otras vistas. Todas sus vistas se sincronizarán expandir / contraer 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;
        }
    };

Tuve un problema similar, salvo que tenía dos GridViews y un ListView para desplazarme. Lo resolví configurando manualmente la altura de 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();

Espero poder ayudar a alguien.

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 desplazar la vista de desplazamiento izquierda, se desplazará la vista de desplazamiento 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);
    }
}
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();

Utilice ListView expandible. Marque mi respuesta para una pregunta similar aquí: Problema de diseño de Android ScrollView

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top