سؤال

لقد قمت بإنشاء ListView مخصص عن طريق توسيع SimpleCursorAdapter. والنتيجة هي Image + CheckedTextView (Text + Checkbox).

بعد أن واجهت مشاكل مع مربعات الاختيار الخاطئة التي يتم فحصها (انظر هنا) اضطررت إلى الإزالة lv.setchoicemode (listView.Choice_Mode_Multiple) ؛ من oncreate.

الآن انقر فوق خط ListItem ويتحقق من خانة الاختيار الصحيحة.

ما أحاول القيام به هو جعل linearlayout.visial عندما يتم فحص مربعات الاختيار واحدة أو أكثر وجعل linearlayout.gone عند عدم فحص خانة الاختيار.

هنا هو الرمز:

lv.setOnItemClickListener(new OnItemClickListener() {
   @Override
   public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

CheckedTextView markedItem = (CheckedTextView) view.findViewById(R.id.btitle);

if (!markedItem.isChecked()) {
 markedItem.setChecked(true);

 //show bottom control panel
 findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.VISIBLE);


} else {
 markedItem.setChecked(false);

 SparseBooleanArray lala = ((ListView) parent).getCheckedItemPositions();

 //if no checkbox is checked, hide bottom control panel
 if (lala == null) {
  findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.INVISIBLE);
 }
}
view.refreshDrawableState();
//showSortBtn(markedItem);

} });

هذه هي الطريقة التي أقوم بربط ListView بالمحول المخصص:

projection = new String[] { Browser.BookmarkColumns._ID,
                Browser.BookmarkColumns.FAVICON, Browser.BookmarkColumns.TITLE,
                Browser.BookmarkColumns.URL };
        displayFields = new String[] { Browser.BookmarkColumns.TITLE,
                Browser.BookmarkColumns.FAVICON, Browser.BookmarkColumns.URL };
        int[] displayViews = new int[] { android.R.id.icon, android.R.id.text1 };

        cur = managedQuery(BOOKMARKS_URI, projection,
                Browser.BookmarkColumns.BOOKMARK + " == 1", null, Browser.BookmarkColumns.VISITS + " DESC");

        setListAdapter(new ImageCursorAdapter(this,
                android.R.layout.simple_list_item_single_choice, cur,
                displayFields, displayViews));

لدي قضيتان مع هذا:

  1. إذا قمت بالتحقق من 2 أو أكثر من مربعات الاختيار ثم فك واحدة فقط SparseBooleanArray lala = ((ListView) parent).getCheckedItemPositions(); باطل. لماذا لاغية إذا كانت هناك مربعات اختيار أخرى تم فحصها؟

  2. إذا قمت بالتبديل findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.INVISIBLE); إلى findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.GONE); (كما أريد أن أفعل) يتم فحص خانة الاختيار الأولى بشكل صحيح وبعد اختفاء LinearLayout ، كل شيء في حالة من الفوضى ، تمامًا مثل ON سؤالي السابق.

نقدر أي مساعدة!

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

المحلول

لماذا تتوقع إرجاع GetCheckedItmpositions () من عودة NULL إذا لم تكن هناك عناصر محددة؟ يبدو أن وضع اختيارك خاطئ

A SparseBooleanArray which will return true for each call to get(int position) where position is a position in the list, or null if the choice mode is set to CHOICE_MODE_NONE.

يجب أن تكون الصفيف لاغية إلا إذا كانت choice_mode_none.

لماذا لا تجرب شيئًا كهذا؟

if (((ListView) parent).getCheckedItemPositions().size() > 0){

    findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.VISIBLE);
else{

    findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.GONE;
}

تحديث

أنا متأكد من أن الأمر يتعلق بهذا الخط

 View v = inView;
        if (v == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(R.layout.image_list, null);
        }

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

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