2008-11-20 9 views
32

Ich bin völlig auf diesem einen 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 Rand des Bildschirms hinausreichen, so dass ich scrollen müsste.Scrollen mit mehreren ListViews für Android

Ich habe versucht, ein ScrollView mit einem LinearLayout Kind mit und setze meine ListViews im LinearView, aber alle die ListViews Sperre auf eine feste Höhe mit Bildlaufleisten. Die Verwendung anderer Arten von Layouts bedeutet kein Scrollen.

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

Antwort

6

Ich habe das noch nicht gemacht, aber ich habe darüber nachgedacht, da ich es wahrscheinlich tun muss. Ich kann mir drei Optionen vorstellen: Verwenden Sie nur eine Liste mit den Inhalten aller Listen. Sie können einen ListAdapter erstellen, der das tut und eine Art Header einfügt. Dies könnte wahrscheinlich etwas sehr wiederverwendbar sein.

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

+2

Was ist die dritte Option? Da ich mich auch für dieses Thema interessiere, habe ich versucht, die ListViews in einem ListView-Ansatz zur Frage http://stackoverflow.com/questions/1526831/android-scrollview-layout-problem zu machen (obwohl ich deine Antwort nicht gesehen habe) Vor). Wenn man mit den Jungs auf # android-dev spricht, ist es noch schlimmer, ListViews in eine ListView zu schreiben, als sie in eine ScrollView zu schreiben. (Und so waren meine Ergebnisse.) Weil deine Nachkriegszeit schon ziemlich lange her ist, hast du die All-In-List-Lösung schon ausprobiert? – svens

6

Ich hatte ein ähnliches Problem, außer daß ich hatte zwei Gridviews und ein Listview zu blättern. Ich löste es, indem manuell die Höhe des Listviews und Grid Einstellung:

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

Hoffnung mir jemand helfen könnte.

11

Weiterleiten Touch-Ereignis von touched Ansicht zu anderen Ansichten. Alle Ihre Ansichten werden synchronisiert expanded/collapse auch.

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

Ich wünschte, ich könnte mehr als einmal upvote. –

+1

Es tut mir leid, aber ich weiß nicht, wie ich diese Antwort implementieren soll. sind mTouched, mMovingFlag globale Variablen? Gehören sie zu den anderen Listenansichten? Ist in diesem Beispiel mLayoutWithListView die andere Listenansicht, die wir synchronisieren wollen? Vielen Dank. – Graph

+0

für echt. Bitte den gesamten Code angeben .................... –

3

Obwohl diese Antwort für Scroll-Ansichten anstelle von Listenansicht ist, ist das Problem das gleiche und diese Lösung funktionierte gut für mich. Wenn Sie den linken Bildlauf scrollen, scrollen Sie den Bildlauf nach rechts 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); 
    } 
} 
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();