Scrolling with Multiple ListViews for Android
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 bottom edge of the screen, so I would need scrolling.
I've tried using a ScrollView
with a LinearLayout
child, and putting my ListViews
in the LinearView
, but all of the ListViews
lock to a fixed height with scroll bars. Using other kinds of Layouts means no scrolling.
Does anyone have any suggestions, or will I need to programmatically add the list items to some layout and hope for the best?
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;
}
};
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.
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.
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);
}
}
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();