لماذا لا يتم استدعاء onItemSelectedListener الخاص بي في ListView؟
-
20-09-2019 - |
سؤال
أنا أستخدم ListView الذي تم إعداده على النحو التالي:
<ListView android:id="@android:id/list" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:longClickable="false"
android:choiceMode="singleChoice">
</ListView>
في الكود الخاص بي أقوم بإضافة OnItemSelectedListener إلى ListView مثل هذا:
getListView().setAdapter(adapter);
getListView().setOnItemSelectedListener(this);
يقوم نشاطي بتنفيذ المستمع على النحو التالي:
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Log.d("Tag", "ListItemSelected: Parent: " + parent.toString() + " View: "
+ view.toString() + " Position: " + " Id: " + id);
}
كان أملي أن أرى مخرجات التصحيح هذه في اللحظة التي أنقر فيها على شيء ما في القائمة.لكن إخراج التصحيح لا يظهر أبدًا في LogCat.
المحلول
OnItemSelectedListener
يستمع لتحديدات قائمة البند وليس قائمة نقرات البند.
ويمكن أن ينظر إلى الاختيار في هذه الحالة كما نقل التركيز على هذا البند مع لوحة التتبع للجهاز.
لتحصل على سلوك واحد يريد يجب أن تستخدم OnItemClickListener
.
نصائح أخرى
في البداية، يجب عليك تعيين ChoiceMode
،وثم،في ListView، لن يتم قبول الحدث المحدد لأنه setOnItemSelectedListener
مسجل في AdapterView
، ورد الاتصال في الطريقة handleDataChanged()
، ولكن الطبقة AbsListView
تجاوز هذه الطريقة ولا ترد الاتصال مطلقًا OnItemSelectedListener
يمكنك الحصول على seletedItem بهذه الطريقة setOnItemClickListener
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.e("TAG", "onItemClick: " + position);
SparseBooleanArray positions = mListView.getCheckedItemPositions();
Log.e("TAG", "onItemSelected: " + positions.toString());
}
});