مربع الاختيار في القائمة التي يتم فحصها بشكل غير متوقع

StackOverflow https://stackoverflow.com/questions/2269915

سؤال

لدي قائمة بعواصف الاختيار في القائمة التي تعاني من العرف simpleCursorAdapter. في عادتي simpleCursorAdapter, ، لقد تجاوزت newView و bindView مع تعديلات بلدي. لقد تمكنت بطريقة ما من القيام متعددة. الشيء الغريب هو ، بعد حذف أي عنصر من قائمتي ، يتم فحص خانة الاختيار العنصر الأول فجأة. كيف يحدث ذلك؟ كيف يمكنني ان احلها؟

لي SimpleCursorAdapter صف دراسي:

public class MyListCursorAdapter extends SimpleCursorAdapter
{
    private Context context;
    private int layout;

    public MyCursorAdapter(Context context, int layout, Cursor c,
            String[] from, int[] to)
    {
        super(context, layout, c, from, to);
        this.context = context;
        this.layout = layout;
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent)
    {
        Cursor c = getCursor();
        final LayoutInflater inflater = LayoutInflater.from(context);
        View v = inflater.inflate(layout, parent, false);
        CheckBox chkBoxBtn = (CheckBox) v.findViewById (R.id.deleteTwittChkBox);
        if (chkBoxBtn != null)
        {
            chkBoxBtn.setChecked(false);
        }
        return v;
    }

    @Override
    public void bindView(View v, Context context, Cursor c)
    {
        --binding view to my textsview in my items
        //now it's the importat part:
            CheckBox chkBoxBtn = (CheckBox) v.findViewById(R.id.deleteTwittChkBox);
    if (chkBoxBtn != null)
    {
        chkBoxBtn.setId(Integer.valueOf(c.getString(c
                .getColumnIndex(MyUsers.User._ID))));
        chkBoxBtn.setOnClickListener(new OnItemClickListener(chkBoxBtn, v));
        chkBoxBtn.setChecked(false);
    }
    }

    //i couldnt find another way of doing this, but this is how i set listeners to my checkboxses
    static ArrayList<String> checkedItemsList = new ArrayList<String>();

    private class OnItemClickListener implements OnClickListener
    {
        private int mPosition;
        private CheckBox chkBox;
        OnItemClickListener(CheckBox mChkBox, View v)
        {
            chkBox = mChkBox;
            chkBox.setChecked(false);
        }

        @Override
        public void onClick(View v)
        {
            if (chkBox.isChecked())
            {
                checkedItemsList.add(String.valueOf(chkBox.getId()));
            }
            else
            {
                checkedItemsList.remove(String.valueOf(chkBox.getId()));
            }
        }
    }
}

هنا جزء الكود من ListActivity الفئة التي تصف الزر الذي يحذف عناصر مربع الاختيار:

OnClickListener btListener = new OnClickListener()
{
    public void onClick(View view)
    {
        // long[] items = listView.getCheckItemIds();
        int x = 0;
        Uri myUri = Uri
        .parse("content://com.idan.datastorageprovider/users");
        String where = "_id" + "=?";
        //here i am tatking all checkboxes which ive added from the  adapter class
        ArrayList<String> checkedItemsList =   MySimpleCursorAdapter.checkedItemsList;
        for (String itemID : checkedItemsList)
        {
            getContentResolver()
            .delete(myUri, where, new String[] { itemID});
            checkedItemsList.remove(itemID);
        }
    }
};
هل كانت مفيدة؟

المحلول

أشك في أن SimpleCursorAdapter هو الفئة الصحيحة التي تمتد هنا.

هل الحالة "المحددة" متصلة بالبيانات XML بأي شكل من الأشكال؟ لا؟ لذلك تحتاج إلى محول مخصص الخاص بك!

في الأساس ، يتعين على جميع المحولات تنفيذ طريقة لإنشاء طريقة عرض من عنصر معين (بدقة موقع عنصر!). سيتم استدعاء هذا في أي وقت تريد فيه القائمة عرض عنصر. الآن ، الخدعة التي تستخدمها هي إعادة استخدام عناصر عرض قائمة القائمة التي تم إنشاؤها سابقًا والتي لا يمكن رؤيتها على الشاشة بعد الآن! وبالتالي: عندما تقوم بالتمرير لأسفل وتختفي عنصر في الجزء العلوي ، سيتم إعادة استخدام كائن العرض هذا بالضبط للعنصر المظهر التالي.

لذلك ، عندما يتم استدعاء هذه الطريقة مع وجهة نظر "قديمة" معينة يجب إعادة استخدامها ، يجب تعيين جميع العناصر الموجودة وفقًا لبيانات العناصر. إذا كانت مربع الاختيار جزءًا من هذه اللعبة ، فسيتعين عليك تخزين الحالة المحددة! لا يكفي أن يكون لديك خانة اختيار حيث سيكون هناك كائنات مربعات أقل لأن هناك عناصر قائمة!

SimpleCursorAdapters موجودة - نعم - تمثل أشياء بسيطة. XML تصف البيانات (الصور والنص ، كما تنص الوثائق). بسبب هذه البساطة ، كل ما عليك فعله هنا هو توفير طريقة لإنشاء كائنات عرض عنصر جديدة - أنت لا تعترض عملية إعادة الاستخدام على الإطلاق! إنه يعرف بشكل أساسي فقط كيفية وضع البيانات في كائن عرض موجود - لكنه يفتقر إلى معرفة كيفية التعامل مع الصناديق المحددة/غير المحددة!

الحل الخاص بك: اكتب امتداد BaseAdapter الخاص بك وافعل ما يجب القيام به: تنفيذ "GetView" (وبعض الطرق الأخرى مثل GetItem و GetItemid و GetCount). ليست صعبة على الاطلاق! هذه API التجريبي يستخدم baseadapter و mExpanded الحالة هنا متطابقة بشكل أساسي لحالات مربع الاختيار!

حظا طيبا وفقك الله!

نصائح أخرى

قد تحتاج إلى الاتصال الإخطار عند تعديل البيانات.

ربما تكون المشكلة هي أنك تتصل بـ SetChecked من داخل OnItemClickListener. إحدى الطرق المتوقفة حول هذا الأمر هو القيام بما يلي قبل وبعد الاتصال setChecked من داخل المستمع الخاص بك:

chkBox.setClickable(false);
chkBox.setChecked(false);
checkBox.setClickable(true);

سيمنع هذا من الحصول على استدعاء OnItemClickListener عند الاتصال يدويًا.

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