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?

Était-ce utile?

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();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top