من الناحية البرمجية ، قم بالوصول إلى صفوف محددة في قائمة CheckedTextView - Android
-
30-09-2019 - |
سؤال
هل من الممكن الوصول إلى صفوف محددة بشكل برمجي في قائمة CheckedTextViews لتغيير حالة مربعات النصوص الخاصة بهم؟
يحتوي برنامجي على ListView الذي يحتوي على العديد من CheckedTextViews التي يمكن للمستخدم الضغط عليها لتبديل الحالة.
أرغب في حفظ حالة مربعات الاختيار عندما يغادر المستخدم النشاط ، لذلك لدي في طريقة OnPause الخاصة بي:
public void onPause(){
super.onPause();
SparseBooleanArray positions;
positions = listView.getCheckedItemPositions();
ListAdapter items = listView.getAdapter();
int j = items.getCount();
ArrayList<Long> ids = new ArrayList<Long>();
for (int k =0; k < j;k++){
if(positions.get(k)==true){
ids.add(items.getItemId(k));
}
}
this.application.getServicesHelper().open();
this.application.getServicesHelper().storeServices(ids,visit_id);
this.application.getServicesHelper().close();
}
الذي يكرر ببساطة عرض القائمة ، يضيف العناصر التي تم فحصها إلى قائمة ArrayList ثم يحفظ قائمة المعرفات هذه إلى قاعدة البيانات.
مشكلتي في محاولة إعادة تعيين القائمة بمجرد أن يعود المستخدم إلى هذا النشاط.
حتى الآن في طريقة OnStart الخاصة بي ، أتذكر العناصر التي تم فحصها من قاعدة البيانات ، لكنني لا أعرف كيفية مسيرة المعرفات التي تم إرجاعها إلى عناصر ListView. هل يمكنني فعل شيء مثل:
listView.getElementById(id_from_database).setChecked
?
أعلم أنني لا أستطيع استخدام getElementById ولكن لدي هنا لإظهار ما أعنيه
شكرا مقدما
كيفن
المحلول 2
هذا ما انتهى به الأمر .. لكن يبدو أنه اختراق كامل. في الأساس ، يجب أن أقوم بإعداد مزدوج للحلقة .. واحد لتكرار عناصر قائمتي ، وواحد للتكرار من خلال المؤشر الذي قمت باسترداده حالة قائمة الشيك أنقذ)
يكرر خارجي من خلال عناصر القائمة التي تحقق كل معرف مقابل حلقة من خلال قائمة المعرفات المراد تعيينها كما هو محدد. إذا كانوا يساويون بعضهم البعض ، فقم بتعيين هذا العنصر كما هو محدد.
// mAdapter is contains the list of elements I want to display in my list.
ServiceList.this.setListAdapter(mAdapter);
// Getting a list of element Ids that had been previously checked by the user. getState is a function I have defined in my ServicesAdapter file.
Cursor state = ServiceList.this.application.getServicesHelper().getState(visit_id);
int checks = state.getCount();
int check_service;
int c = mAdapter.getCount();
if(checks>0){
state.moveToFirst();
for (int i=0; i<checks; i++) {
// set check_service = the next id to be checked
check_service = state.getInt(0);
for(int p=0;p<c;p++){
if(mAdapter.getItemId(p)==check_service){
// we have found an id that needs to be checked. 'p' corresponds to its position in my listView
listView.setItemChecked(p,true);
break;
}
}
state.moveToNext();
}
}
ServiceList.this.application.getServicesHelper().close();
من فضلك قل لي أن هناك طريقة أكثر كفاءة لتحقيق هذا !!
شكرًا
كيفن
نصائح أخرى
تستطيع الاتصال
listView.setItemChecked(int position, boolean value)