Android 方向更改时不显示Listview

Android 方向更改时不显示Listview,android,listview,android-listview,Android,Listview,Android Listview,我以前做过一个列表视图,列表是以横向还是纵向显示的。然而,在我的新应用程序中,当我决定改变方向时,无论是横向还是纵向,它都不会再次加载。我试图用sqlite数据库中的项目填充listview。这是我的密码: 景点.java public class Attractions extends ListActivity { DataBaseHandler db = new DataBaseHandler(this); ArrayList<Contact> imageArry = new A

我以前做过一个列表视图,列表是以横向还是纵向显示的。然而,在我的新应用程序中,当我决定改变方向时,无论是横向还是纵向,它都不会再次加载。我试图用sqlite数据库中的项目填充listview。这是我的密码:

景点.java

public class Attractions extends ListActivity {
DataBaseHandler db = new DataBaseHandler(this);
ArrayList<Contact> imageArry = new ArrayList<Contact>();
ContactImageAdapter adapter;
int ctr, loaded; 
int [] landmarkImages={R.drawable.oblation,R.drawable.eastwood,R.drawable.ecopark,R.drawable.circle};
String []landmarkDetails = { "Oblation", "Eastwood", "Ecopark", "QC Circle"};

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_attractions);
    ctr  = db.checkContact(landmarkDetails[loaded]);
    db.deleteAll();


    // get image from drawable

    /**
     * CRUD Operations
     * */
    // Inserting Contacts
    Log.d("Insert: ", "Inserting ..");


    for(loaded=0; loaded <landmarkDetails.length;loaded++){

        Bitmap image = BitmapFactory.decodeResource(getResources(),
                landmarkImages[loaded]);

        // convert bitmap to byte
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        image.compress(Bitmap.CompressFormat.JPEG, 100, stream);
        byte imageInByte[] = stream.toByteArray();
        Log.d("Going to load images", "Image "+ loaded);

        Log.d("Goind to load objects", "loading");

        if(ctr == 0){
            Log.d("Nothing Loaded", "Loading Now");
            db.addContact(new Contact(landmarkDetails[loaded], imageInByte));}
            Log.d(landmarkDetails[loaded], "Loaded!");
            image.recycle();
    }


    // Reading all contacts from database
    List<Contact> contacts = db.getAllContacts();
    for (Contact cn : contacts) {
        String log = "ID:" + cn.getID() + " Name: " + cn.getName()
                + " ,Image: " + cn.getImage();

        // Writing Contacts to log
        Log.d("Result: ", log);
        //add contacts data in arrayList
        imageArry.add(cn);

    }
    adapter = new ContactImageAdapter(this, R.layout.screen_list,
            imageArry);
    ListView dataList = (ListView) findViewById(android.R.id.list);
    dataList.setAdapter(adapter);
}
公共类活动{
DataBaseHandler db=新的DataBaseHandler(此);
ArrayList imageArry=新的ArrayList();
接触式图像适配器;
int ctr,已加载;
int[]landmarkImages={R.drawable.oblation,R.drawable.eastwood,R.drawable.ecopark,R.drawable.circle};
字符串[]landmarkDetails={“扁率”、“伊斯特伍德”、“生态公园”、“QC圈”};
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(右布局、活动和景点);
ctr=db.checkContact(landmarkDetails[已加载]);
db.deleteAll();
//从drawable获取图像
/**
*积垢作业
* */
//插入联系人
日志d(“插入:”,“插入..”);

对于(loaded=0;loaded打开manifest.xml文件并更改活动标记,如下所示:然后检查


这将避免重新创建活动。

我可能知道它是什么。此代码用于添加DB元素:

 if(ctr == 0){
        Log.d("Nothing Loaded", "Loading Now");
        db.addContact(new Contact(landmarkDetails[loaded], imageInByte));}
第一次,DB是干净的。checkContact结果为0,条件(ctr==0)满足,因此执行addContact

第二次,您的DB在上一次运行时是“脏的”(请注意,DB.deleteAll是在检查联系人后调用的)。由于DB不干净,ctr!=0,因此上面的代码永远不会执行。因此,DB.getAllContacts()返回空数据,最后一个循环永远不会触发

第三次你的数据库是干净的,因为deleteAll,等等,等等

一个漂亮可爱的错误,想不出比这更优雅的了。:)


如果您阻止活动重新激活,错误将消失,并且,除非外观取决于方向(例如纵向和横向的多个布局),否则应该没有问题。

您是否提到android:configChanges=“方向”在Manifest中??当重新创建活动时,只要代码正确,它仍然应该工作。db.checkContact()-这似乎是罪魁祸首。在纵向中,它返回0,以便添加联系人;在横向中,它返回非零,未添加联系人,因此您的上一个循环从未触发。由于我不知道checkContact的作用,因此无法更具体地说。感谢您指出它,兄弟。我在调试时忘记删除
deleteAll
昨天我在打电话。也许我应该暂停一下。:)
 if(ctr == 0){
        Log.d("Nothing Loaded", "Loading Now");
        db.addContact(new Contact(landmarkDetails[loaded], imageInByte));}