Défilement avec plusieurs ListViews pour Android
-
08-07-2019 - |
Question
Je suis complètement stupéfait sur celui-ci. J'ai trois listes différentes qui doivent être affichées à l'écran. Il est tout à fait possible que les listes s'étendent au-delà du bord inférieur de l'écran. Il faudrait donc faire défiler l'écran.
J'ai essayé d'utiliser un ScrollView
avec un enfant LinearLayout
et de placer mon ListViews
dans le LinearView
. , mais tous les ListViews
sont verrouillés à une hauteur fixe avec des barres de défilement. Utiliser d'autres types de mises en forme signifie ne pas faire défiler.
Quelqu'un a-t-il des suggestions à faire ou dois-je ajouter par programme les éléments de la liste à une mise en page et espérer que tout se passe bien?
La solution
Je ne l'ai pas encore fait, mais j'y pense depuis que je devrai probablement le faire. Je peux penser à trois options: utiliser une seule liste avec le contenu de toutes les listes. Vous pouvez créer un ListAdapter qui fait cela et insère une sorte d'en-tête. Cela pourrait probablement être quelque chose de très réutilisable.
L’autre idée est de dresser une liste de listes. Mais cela ressemble à demander des ennuis.
Autres conseils
Transférer l'événement tactile de touché
à d'autres vues. Tous vos points de vue seront également synchronisés. Développer / Réduire.
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;
}
};
J'ai eu un problème similaire, sauf que j'avais deux vues GridView et une vue ListView à faire défiler. Je l'ai résolu en définissant manuellement la hauteur des ListViews et 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();
J'espère pouvoir aider quelqu'un.
Bien que cette réponse concerne la vue par défilement au lieu de la vue par liste, le problème est le même et cette solution a bien fonctionné pour moi. Faire défiler la vue à gauche fait défiler la vue à droite et vice-versa.
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();
Utilisez ListView extensible. Chk ma réponse à une question similaire ici: problème de mise en page avec Android ScrollView