اندرويد:ليستفيو من تشيكدتكستفيو + سكليتي, عرض فحص الصفوف مع محول?

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

سؤال

أحاول تنفيذ قائمة "تودو" بسيطة جدا.اخترت استخدام ليستفيو من تشيكدتكستفيو (مع معرف التحقق من النص) ، يستخدم ليستفيو اختيار_مودي_متعددة بالطبع.

الآن ، أنا باستخدام قاعدة بيانات سكليتي لتخزين عناصر القائمة.

لملء القائمة لدي شيء مثل:

cursor = dbHelper.fetchAll();
startManagingCursor(cursor);

String[] from = new String[] {  DbAdapter.NAME };
int[] to = new int[] { R.id.checked_text };

SimpleCursorAdapter notes = new SimpleCursorAdapter(this,
R.layout.todo_multi_row, cursor, from, to);
listView.setAdapter(notes);

هذا يعمل بشكل جيد ، فإنه يحصل على جميع العناصر في ديسيبل ولكل البند أنه يخلق تشيكدتكستفيو مع كنص DbAdapter.NAME.

ولكن ما أحتاجه حقا هو الحصول على كل من النص ، وحالة التحقق, وتحقق من الصفوف وفقا لذلك.

لنفترض أنه يمكنني الحصول على الحالة (كعدد صحيح 0/1) من قاعدة البيانات باستخدام دبادابتر.فحص..كيف يمكنني تنفيذ محول المؤشر الذي يحصل على العمل المنجز?

لقد بحثت في كل مكان (على سبيل المثال هذا السؤال وهو فوضى) ولكن وجدت شيئا لحل هذه المشكلة.واه.بدا الأمر سهلا في البداية.

شكرا,
ستيفانو


@بيرت إف:
شكرا ، هذه هي الطريقة التي أستخدمها لملء قائمتي:

private void fillData() {
        Log.d("LIST","fill");
        cursor = dbHelper.fetchAllTodos();
        startManagingCursor(cursor);

        String[] from = new String[] { TodoDbAdapter.NAME };
        int[] to = new int[] { R.id.checked_text };

        SimpleCursorAdapter notes = new SimpleCursorAdapter(this,
                R.layout.todo_multi_row, cursor, from, to);

        final SimpleCursorAdapter.ViewBinder mViewBinder =
            new SimpleCursorAdapter.ViewBinder() {
                @Override
                public boolean setViewValue(
                        final View view,
                        final Cursor cursor,
                        final int columnIndex) {

                    Log.d("LIST",view +" "+cursor+" "+columnIndex);

                    CheckedTextView item = (CheckedTextView) view;
                    Log.d("LIST","NAME: "+item.getText()+" State: "+item.isChecked());

                    return false;
                }
            };

        notes.setViewBinder(mViewBinder);
        listView.setAdapter(notes);
    }

الآن ، كاختبار أنا مجرد طباعة ما يحدث.
إذا أضفت 1 عنصر إلى القائمة ما أراه هو:

02-12 14:45:35.913: DEBUG/LIST(22621): fill
02-12 14:45:35.933: DEBUG/LIST(22621): android.widget.CheckedTextView@479da398 android.database.sqlite.SQLiteCursor@479d98f0 2
02-12 14:45:35.933: DEBUG/LIST(22621): NAME:  State: false
02-12 14:45:35.933: DEBUG/LIST(22621): android.widget.CheckedTextView@479da398 android.database.sqlite.SQLiteCursor@479d98f0 2
02-12 14:45:35.943: DEBUG/LIST(22621): NAME: first item State: false
02-12 14:45:36.013: DEBUG/LIST(22621): android.widget.CheckedTextView@479dc6c0 android.database.sqlite.SQLiteCursor@479d98f0 2
02-12 14:45:36.013: DEBUG/LIST(22621): NAME:  State: false
02-12 14:45:36.223: DEBUG/LIST(22621): android.widget.CheckedTextView@479dc6c0 android.database.sqlite.SQLiteCursor@479d98f0 2
02-12 14:45:36.223: DEBUG/LIST(22621): NAME: first item State: false

وإذا كنت التحقق من ذلك..

02-12 14:53:33.123: DEBUG/LIST(22621): android.widget.CheckedTextView@479dc6c0 android.database.sqlite.SQLiteCursor@479d98f0 2
02-12 14:53:33.123: DEBUG/LIST(22621): NAME: first item State: false
02-12 14:53:33.123: DEBUG/LIST(22621): android.widget.CheckedTextView@479da398 android.database.sqlite.SQLiteCursor@479d98f0 2
02-12 14:53:33.123: DEBUG/LIST(22621): NAME: first item State: false

دعونا جانبا حقيقة أنه يقول لم يتم التحقق من ذلك, لماذا هو اطلاق النار مرات عديدة ?لدي فقط 1 البند: أنا


تحرير:حل قبيح

private void fillData() {
        Log.d("LIST","fill");
        cursor = dbHelper.fetchAllTodos();
        startManagingCursor(cursor);

        String[] from = new String[] { TodoDbAdapter.NAME };
        int[] to = new int[] { R.id.checked_text };

        SimpleCursorAdapter notes = new SimpleCursorAdapter(this,
                R.layout.todo_multi_row, cursor, from, to);

        final SimpleCursorAdapter.ViewBinder mViewBinder =
            new SimpleCursorAdapter.ViewBinder() {
                @Override
                public boolean setViewValue(
                        final View view,
                        final Cursor cursor,
                        final int columnIndex) {

                     final int checkedIndex =
                         cursor.getColumnIndexOrThrow(
                                 TodoDbAdapter.CHECKED);

                     Log.d("LIST","VIEW: "+view+" NAME: "+cursor.getString(columnIndex)+" "+cursor.getInt(checkedIndex));

                    return false;
                }
            };

        notes.setViewBinder(mViewBinder);
        listView.setAdapter(notes);
    }

مع إدخال 2 (الأول المحدد الثاني لا) عند تحميل القائمة لدي:

02-12 15:59:48.613: DEBUG/LIST(23533): fill
02-12 15:59:48.643: DEBUG/LIST(23533): VIEW: android.widget.CheckedTextView@47a30ec0 NAME: test 1
02-12 15:59:48.653: DEBUG/LIST(23533): VIEW: android.widget.CheckedTextView@47a30ec0 NAME: LOL 0
02-12 15:59:48.683: DEBUG/LIST(23533): VIEW: android.widget.CheckedTextView@47a30ec0 NAME: test 1
02-12 15:59:48.683: DEBUG/LIST(23533): VIEW: android.widget.CheckedTextView@47a331f8 NAME: LOL 0
02-12 15:59:48.713: DEBUG/LIST(23533): VIEW: android.widget.CheckedTextView@47a35770 NAME: test 1
02-12 15:59:48.713: DEBUG/LIST(23533): VIEW: android.widget.CheckedTextView@47a35770 NAME: LOL 0
02-12 15:59:48.783: DEBUG/LIST(23533): VIEW: android.widget.CheckedTextView@47a35770 NAME: test 1
02-12 15:59:48.783: DEBUG/LIST(23533): VIEW: android.widget.CheckedTextView@47a35770 NAME: LOL 0

في صحتك.

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

المحلول

  1. تنفيذ أ سيمبليكورسورادابتر.عدسة الكاميرا.

  2. هل لديك عدسة الكاميرا.سيتفيوفالو () طريقة التحقق من عندما دعا ل DbAdapter.NAME العمود أو آخر يكون ذلك التحقق من وجود R.id.checked_text- نوع العرض.

  3. عندما دعا ، ولكن ليس ل لا العمود الهدف / عرض ، يكون ذلك العودة false بحيث محول سوف تفعل ربط العمود / عرض الطريقة التي عادة.

  4. عندما دعا إلى العمود/عرض الهدف ، يكون ذلك تعيين النص وخانة الاختيار ل (CheckedTextView) view.يجب أن ينتهي الأمر بالعودة true لذلك لن يستمر هذا المحول في محاولة ربط العرض نفسه.لاحظ أن المؤشر متاح للوصول إلى بيانات الاستعلام لتحديد ما إذا كنت تريد تحديد خانة الاختيار أم لا (DbAdapter.CHECKED).

  5. تعيين الخاص بك ViewBinder في الخاص بك SimpleCursorAdapter عبر سيتفيوبيندر()

إليك أحد تطبيقات عدسة الكاميرا الخاصة بي.ليس من أجل مربعات الاختيار ، بل من أجل القيام ببعض التنسيق الهوى لعرض النص ، ولكن يجب أن يعطيك فكرة عن النهج:

private final SimpleCursorAdapter.ViewBinder mViewBinder =
    new SimpleCursorAdapter.ViewBinder() {
        @Override
        public boolean setViewValue(
                final View view,
                final Cursor cursor,
                final int columnIndex) {
            final int latitudeColumnIndex =
                cursor.getColumnIndexOrThrow(
                        LocationDbAdapter.KEY_LATITUDE);
            final int addressStreet1ColumnIndex =
                cursor.getColumnIndexOrThrow(
                        LocationDbAdapter.KEY_ADDRESS_STREET1);

            if (columnIndex == latitudeColumnIndex) {

                final String text = formatCoordinates(cursor);
                ((TextView) view).setText(text);
                return true;

            } else if (columnIndex == addressStreet1ColumnIndex) {

                final String text = formatAddress(cursor);
                ((TextView) view).setText(text);
                return true;

            }

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