Scrolling with Multiple ListViews for Android

前端 未结 6 986
孤城傲影
孤城傲影 2020-11-29 04:46

I\'m completely stumped on this one. I have three different lists that need to be displayed on the screen. It\'s completely possible that the lists will extend past the bot

相关标签:
6条回答
  • 2020-11-29 04:56

    Use expandable ListView. Chk my answer for a similar question here: Android ScrollView layout problem

    0 讨论(0)
  • 2020-11-29 05:08

    I haven't done this yet, but I've been thinking about it since I'll probably need to do it. I can think of three options: use only one list with the contents of all lists. You can make a ListAdapter that does that and inserts some kind of header. This could probably be something very re-usable.

    The other idea is to make a list of lists. But that sounds like asking for trouble.

    0 讨论(0)
  • 2020-11-29 05:10
    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();
    
    0 讨论(0)
  • I had a similar problem save that I had two GridViews and one ListView to scroll. I solved it by manually setting the height of the ListViews and 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();
    

    Hope I could help someone.

    0 讨论(0)
  • 2020-11-29 05:15

    Although this answer is for scroll view's instead of list view's, the problem is the same and this solution worked well for me. Scrolling the left scrollview will scroll the right scrollview and 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);
        }
    }
    
    0 讨论(0)
  • 2020-11-29 05:18

    Forward touch event from touched view to other views. All your views will be synchronized expand/collapsed too.

       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 讨论(0)
提交回复
热议问题