2008-11-20 2 views
32

Я полностью в тупике. У меня есть три разных списка, которые нужно отображать на экране. Вполне возможно, что списки будут проходить мимо нижнего края экрана, поэтому мне потребуется прокрутка.Прокрутка с несколькими списками для Android

Я попытался с помощью ScrollView с собой LinearLayout ребенка, и положить мой ListViews в LinearView, но все ListViews замок на фиксированной высоте с полосами прокрутки. Использование других видов макетов означает отсутствие прокрутки.

Есть ли у кого-нибудь предложения, или мне нужно будет программно добавить элементы списка в какой-то макет и надеяться на лучшее?

ответ

6

Я еще не сделал этого, но я думал об этом, так как мне, вероятно, понадобится это сделать. Я могу представить три варианта: использовать только один список с содержимым всех списков. Вы можете сделать ListAdapter, который делает это, и вставляет какой-то заголовок. Возможно, это может быть что-то очень пригодное для повторного использования.

Другая идея - составить список списков. Но это звучит как просить неприятностей.

+2

Что третий вариант? Потому что меня тоже интересует эта тема, и я попытался сделать ListViews в подходе ListView для вопроса http://stackoverflow.com/questions/1526831/android-scrollview-layout-problem (хотя я не видел вашего ответа до). Говоря с парнями на # android-dev, размещение ListViews в ListView еще хуже, чем помещение их в ScrollView. (И так были мои результаты.) Поскольку ваша после войны написана довольно давно, вы уже пробовали все в списке? – svens 2009-10-06 20:31:25

6

У меня была аналогичная проблема, кроме того, что у меня было два GridViews и один ListView для прокрутки. Я решил, установив высоту ListViews и 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(); 

Надеется, что я мог бы помочь кому-то.

11

Вперед касание события от touched вид на другие виды. Все ваши представления будут синхронизированы также развернуть/свернуть.

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

Хотелось бы, чтобы я мог повышаться не один раз. – 2013-07-16 12:19:02

3

Хотя этот ответ предназначен для просмотра прокрутки вместо представления списка, проблема такая же, и это решение сработало для меня. Прокрутка левого прокрутки позволит прокрутить правую прокрутку и наоборот.

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(); 
Смежные вопросы