سؤال

أحصل على مشكلة غريبة عند تحديث بلدي ListView, ، يعمل بشكل جيد حتى يتم تدوير الجهاز ، ثم عند تحديثه مرة أخرى ، يصبح فارغًا تمامًا. لا يمكن إصلاح هذا إلا عن طريق تدوير الجهاز مرة أخرى (حيث يتم تحديثه أيضًا onCreate()) ولكن بعد ذلك كلما تم تحديثها مرة أخرى ، تصبح فارغة. تستمر المشكلة حتى يتم إعادة تشغيل التطبيق.

تعديل:

بعض الكود:

private ListView contactlist = null;
private static MatrixCursor matrixcursor = null;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    contactlist = (ListView) findViewById(R.id.contactlist);
    if (savedInstanceState == null) {
        matrixcursor = new MatrixCursor(new String[] {"_id","name","one","two","three","four"});
    } else {
        contactlist.setAdapter(new listCursorAdapter(this,matrixcursor));
    }
}

هذا يعمل بشكل جيد ولكن كلما:

contactlist.setAdapter(new listCursorAdapter(this,matrixcursor));

يسمى بعد onCreate() وبعد تدوير الجهاز ListView يذهب فارغا.

هل كانت مفيدة؟

المحلول 2

حسنًا ، تمكنت من إصلاحه من خلال صنعه contactlist ثابتة:

 private static ListView contactlist = null;

ليس لدي أي فكرة عن سبب عمل هذا (لقد قمت فقط بتجربة/خطأ لبضع ساعات) ، لذلك إذا كان بإمكان أي شخص أن يشرح ذلك ، فسيكون ذلك رائعًا.

نصائح أخرى

أعتقد أن المصفوفة الخاصة بك هي في الواقع لاغية. عندما تقوم بتدوير الهاتف كما تعلم أن النشاط يتم تدميره. لذلك قد لا تكون حزمة SaveInstancestate فارغة ولكن لا يتم إعادة تعزيز matixcursor. نعم ، إنه ثابت ولكن لدي شعور إذا لم يتم تحميله في نفس الحمل ... حسنًا ، لن يكون الثابت موثوقًا به للغاية.

هناك طريقة تتم تسميتها بشكل محرج:

onretainnonconfigurationInstance ()

الذي أعتقد أنه سيساعدك على حل هذه القضية. لذلك إذا قمت بإرجاع مثيل MatrixCursor هناك ، فيمكنك في مكالمة لاحقة إلى OnCreate () استخدام getLastNonConfigurationInstance () لقراءة البيانات مرة أخرى. ليس من المضمون أن يتم استدعاؤه ، لذلك ستظل بحاجة إلى التعامل مع القضية التي لا يوجد لديك فيها حالة مخزنة. نأمل أن يساعد هذا.

private ListView contactlist = null;
private MatrixCursor matrixcursor = null;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    contactlist = (ListView) findViewById(R.id.contactlist);
    matrixcursor = (MatrixCursor)getLastNonConfigurationInstance();
    if (matrixcursor == null) {
        matrixcursor = new MatrixCursor(new String[] {"_id","name","one","two","three","four"});
    } else {
        contactlist.setAdapter(new listCursorAdapter(this,matrixcursor));
    }
}

public MatrixCursor onRetainNonConfigurationInstance() {
return matrixcuror;
}

public MatrixCuror getLastNonConfigurationInstance() {
return (MatrixCursor) super.getLastNonConfigurationInstance();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top