الروبوت:وصول الطفل آراء من ListView
-
05-07-2019 - |
سؤال
أنا بحاجة لمعرفة موقف بكسل من عنصر واحد في قائمة التي تم عرضها باستخدام ListView
.يبدو أنني يجب أن تحصل على واحدة من TextView هو ومن ثم استخدام getTop()
, ولكن أنا لا يمكن معرفة كيفية الحصول على طفل من ListView
.
تحديث: أطفال ViewGroup
لا تتطابق مع 1 إلى 1 مع العناصر الموجودة في القائمة ، ListView
.بدلا من ذلك ، ViewGroup
'ق الأطفال تتوافق مع فقط تلك الآراء التي هي واضحة الآن.لذلك getChildAt()
يعمل على مؤشر الداخلية إلى ViewGroup
و ليس بالضرورة أن يكون أي شيء للقيام مع الموقف في القائمة التي ListView
الاستخدامات.
المحلول
انظر: الروبوت ListView:الحصول على بيانات مؤشر عنصر مرئي والجمع مع جزء من قدم الجواب أعلاه ، يمكن أن تعطيك شيئا مثل:
int wantedPosition = 10; // Whatever position you're looking for
int firstPosition = listView.getFirstVisiblePosition() - listView.getHeaderViewsCount(); // This is the same as child #0
int wantedChild = wantedPosition - firstPosition;
// Say, first visible position is 8, you want position 10, wantedChild will now be 2
// So that means your view is child #2 in the ViewGroup:
if (wantedChild < 0 || wantedChild >= listView.getChildCount()) {
Log.w(TAG, "Unable to get view for desired position, because it's not being displayed on screen.");
return;
}
// Could also check if wantedPosition is between listView.getFirstVisiblePosition() and listView.getLastVisiblePosition() instead.
View wantedView = listView.getChildAt(wantedChild);
الفائدة هي أن كنت لا بالتكرار على ListView الأطفال ، والتي يمكن أن يستغرق الأداء ضرب.
نصائح أخرى
هذا الرمز هو أسهل للاستخدام:
View rowView = listView.getChildAt(viewIndex);//The item number in the List View
if(rowView != null)
{
// Your code here
}
بحث سريع من مستندات عن فئة ListView تحولت getChildCount() و getChildAt() الأساليب الموروثة من ViewGroup.يمكنك من خلال تكرار لهم باستخدام هذه ؟ لست متأكدا ولكن الأمر يستحق المحاولة.
وجدت هنا
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, final View view, int position, long id) {
View v;
int count = parent.getChildCount();
v = parent.getChildAt(position);
parent.requestChildFocus(v, view);
v.setBackground(res.getDrawable(R.drawable.transparent_button));
for (int i = 0; i < count; i++) {
if (i != position) {
v = parent.getChildAt(i);
v.setBackground(res.getDrawable(R.drawable.not_clicked));
}
}
}
});
في الأساس, إنشاء اثنين بكسل - واحد هو أن شفاف آخر هذا هو اللون المطلوب.طلب التركيز في موضع النقر (int position
كما هو معرف) و تغيير لون قال التوالي.ثم المشي من خلال الوالدين ListView
, و تغيير جميع الصفوف الأخرى تبعا لذلك.وهذا يفسر عندما ينقر المستخدم على listview
عدة مرات.ويتم ذلك مع تخطيط مخصص لكل صف في ListView
.(بسيط جدا, فقط إنشاء تخطيط جديد الملف TextView
- لا تضع قابل للتركيز أو نقر!).
لا مخصص محول المطلوبة - استخدام ArrayAdapter
int position = 0;
listview.setItemChecked(position, true);
View wantedView = adapter.getView(position, null, listview);
هذا يفترض أنك تعرف موضع العنصر في ListView :
View element = listView.getListAdapter().getView(position, null, null);
ثم عليك أن تكون قادرا على الاتصال getLeft() و getTop() لتحديد العناصر على الشاشة الموقف.