Scrollen mit mehreren ListViews für Android

Lesezeit: 4 Minuten

Scrollen mit mehreren ListViews fur Android
Andrew Burgess

Ich bin diesbezüglich völlig ratlos. Ich habe drei verschiedene Listen, die auf dem Bildschirm angezeigt werden müssen. Es ist durchaus möglich, dass die Listen über den unteren Bildschirmrand hinausreichen, sodass ich scrollen muss.

Ich habe versucht, a . zu verwenden ScrollView mit einer LinearLayout Kind, und mein ListViews in dem LinearView, aber alle ListViews mit Bildlaufleisten auf eine feste Höhe sperren. Die Verwendung anderer Arten von Layouts bedeutet kein Scrollen.

Hat jemand Vorschläge, oder muss ich die Listenelemente programmgesteuert zu einem Layout hinzufügen und auf das Beste hoffen?

Scrollen mit mehreren ListViews fur Android
Richard

Touch-Ereignis weiterleiten von touched Ansicht zu anderen Ansichten. Alle Ihre Ansichten werden ebenfalls synchronisiert.

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

  • Es tut mir leid, aber ich weiß nicht, wie ich diese Antwort umsetzen soll. sind mTouched, mMovingFlag globale Variablen? Gehören sie zu den anderen Listenansichten? Ist in diesem Beispiel mLayoutWithListViews die andere Listenansicht, die wir synchronisieren möchten? Danke.

    – Grafik

    19. September ’15 um 18:58 Uhr

Ich habe das noch nicht gemacht, aber ich habe darüber nachgedacht, da ich es wahrscheinlich tun muss. Mir fallen drei Möglichkeiten ein: Nur eine Liste mit dem Inhalt aller Listen verwenden. Sie können einen ListAdapter erstellen, der dies tut und eine Art Header einfügt. Dies könnte wahrscheinlich etwas sehr Wiederverwendbares sein.

Die andere Idee ist, eine Liste von Listen zu erstellen. Aber das klingt nach Ärger.

  • Was ist die dritte Möglichkeit? Weil mich dieses Thema auch interessiert und ich versucht habe, die ListViews in einem ListView-Ansatz für die Frage stackoverflow.com/questions/1526831/… durchzuführen (obwohl ich Ihre Antwort noch nicht gesehen habe). Im Gespräch mit den Jungs von #android-dev ist es noch schlimmer, ListViews in ein ListView zu packen, als sie in ein ScrollView zu packen. (Und meine Ergebnisse auch.) Da Ihre Nachkriegszeit schon ziemlich lange zurückliegt, haben Sie die All-in-A-Listen-Lösung inzwischen ausprobiert?

    – svens

    6. Okt. 09 um 20:31 Uhr

Ich hatte ein ähnliches Problem, außer dass ich zwei GridViews und eine ListView zum Scrollen hatte. Ich habe es gelöst, indem ich die Höhe der ListViews und GridView manuell eingestellt habe:

    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();

Hoffe ich konnte jemandem helfen.

Obwohl diese Antwort für Bildlaufansichten anstelle von Listenansichten gilt, ist das Problem das gleiche und diese Lösung hat für mich gut funktioniert. Durch Scrollen der linken Scrollansicht wird die rechte Scrollansicht gescrollt und umgekehrt.

 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();

.

439840cookie-checkScrollen mit mehreren ListViews für Android

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy