Domanda

Sono completamente perplesso su questo. Ho tre diversi elenchi che devono essere visualizzati sullo schermo. È del tutto possibile che le liste si estendano oltre il bordo inferiore dello schermo, quindi avrei bisogno di scorrere.

Ho provato a usare un ScrollView con un LinearLayout e ho inserito il mio ListViews nel LinearView , ma tutte le ListViews si bloccano ad un'altezza fissa con barre di scorrimento. L'uso di altri tipi di layout implica lo scorrimento.

Qualcuno ha qualche suggerimento o dovrò aggiungere a livello di codice le voci dell'elenco a un layout e sperare per il meglio?

È stato utile?

Soluzione

Non l'ho ancora fatto, ma ci sto pensando dato che probabilmente dovrò farlo. Mi vengono in mente tre opzioni: utilizzare solo una lista con i contenuti di tutte le liste. Puoi creare un ListAdapter che lo fa e inserisce un tipo di intestazione. Questo potrebbe probabilmente essere qualcosa di molto riutilizzabile.

L'altra idea è quella di creare un elenco di elenchi. Ma sembra chiedere problemi.

Altri suggerimenti

Inoltra l'evento touch dalla vista toccata ad altre viste. Tutte le tue visualizzazioni saranno anch'esse sincronizzate con espansione / compressione.

   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;
        }
    };

Ho avuto un problema simile a parte il fatto che avevo due GridView e un ListView da scorrere. L'ho risolto impostando manualmente l'altezza di ListViews e 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();

Spero di poter aiutare qualcuno.

Sebbene questa risposta sia per la vista di scorrimento anziché per la vista elenco, il problema è lo stesso e questa soluzione ha funzionato bene per me. Scorrendo la vista di scorrimento sinistra si scorre la vista di scorrimento destra e 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();

Usa ListView espandibile. Chk la mia risposta per una domanda simile qui: Problema di layout Android ScrollView

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top