Android GridView Inverser après avoir manipulé le changement d'orientation
-
28-09-2019 - |
Question
EDIT: Ce problème peut être lié à BaseAdapter provoquant ListView sortir de l'ordre quand Scrolled
Mon écran principal de l'application utilise un GridView pour afficher une grille d'icônes. Chaque icône a une image, le nom et l'intention. Je l'ensemble de l'activité pour gérer les changements d'orientation afin que je puisse changer l'arrière-plan. Les jeux de méthode onCreate jusqu'à la GridView avec 3 icônes de test qui ne font rien et une icône Préférences qui ouvre une PreferencesActivity:
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
GridView gv = (GridView) findViewById(R.id.main_grid);
if (getResources().getConfiguration().orientation ==
Configuration.ORIENTATION_LANDSCAPE)
gv.setBackgroundResource(R.drawable.main_bg_horiz);
else
gv.setBackgroundResource(R.drawable.main_bg);
ArrayList<Icon> icons = new ArrayList<Icon>();
icons.add(new Icon("Test 1", R.drawable.test1, null));
icons.add(new Icon("Test 2", R.drawable.test2, null));
icons.add(new Icon("Test 3", R.drawable.test3, null));
icons.add(new Icon("Preferences", R.drawable.perferences, new Intent(this,
AlertPreferences.class)));
IconAdapter ia = new IconAdapter(icons);
gv.setAdapter(ia);
gv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3){
Intent i = ((IconAdapter)arg0.getAdapter()).getItem(arg2).getIntent();
if (i != null)
HomeActivity.this.startActivity(i);
}
});
Et le onConfigurationChanged est très simple:
super.onConfigurationChanged(newConfig);
GridView gv = (GridView) findViewById(R.id.main_grid);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
gv.setBackgroundResource(R.drawable.main_bg_horiz);
else
gv.setBackgroundResource(R.drawable.main_bg);
L'arrière-plan change très bien, mais le code introduit un nouveau problème avec le GridView. Quelle que soit l'orientation que je commence l'application en elle fonctionne très bien. Cependant, quand je change l'orientation, l'ordre des icônes dans les revers GridView. Et quand je tourne le dos à l'écran à l'orientation qu'il a commencé en, tout va revenir à la normale. Qu'est-ce qui se passe ici?
La solution
Il était en fait un problème avec l'adaptateur personnalisé. Le problème et la solution sont à la fois ici BaseAdapter faisant ListView aller hors d'usage lorsque Scrolled
Autres conseils
Essayez de séparer la logique où vous configurez l'interface utilisateur:
GridView gv;
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
configureYourUIHere();
}
public void configureYourUIHere(){
gv = (GridView) findViewById(R.id.main_grid);
if (getResources().getConfiguration().orientation ==
Configuration.ORIENTATION_LANDSCAPE)
gv.setBackgroundResource(R.drawable.main_bg_horiz);
else
gv.setBackgroundResource(R.drawable.main_bg);
ArrayList<Icon> icons = new ArrayList<Icon>();
icons.add(new Icon("Test 1", R.drawable.test1, null));
icons.add(new Icon("Test 2", R.drawable.test2, null));
icons.add(new Icon("Test 3", R.drawable.test3, null));
icons.add(new Icon("Preferences", R.drawable.perferences, new Intent(this,
AlertPreferences.class)));
IconAdapter ia = new IconAdapter(icons);
gv.setAdapter(ia);
gv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3){
Intent i = ((IconAdapter)arg0.getAdapter()).getItem(arg2).getIntent();
if (i != null)
HomeActivity.this.startActivity(i);
}
});
}
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
configureYourUIHere();
}