سؤال

أنا بحاجة لمعرفة موقف بكسل من عنصر واحد في قائمة التي تم عرضها باستخدام 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() لتحديد العناصر على الشاشة الموقف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top