Android - Как перебрать просмотр списка? - PullRequest
2 голосов
/ 18 марта 2011

У меня есть ListActivity с каждой строкой в ​​списке, содержащей 2 TextViews и 4 RadioButton.

2 TextViews заполняются из SimpleCursorAdapter, извлекающего данные из таблицы в моей базе данных, а 4 RadioButton просто помещаются в код xml (их идентификаторы присваиваются 4 переменным RadioButton в коде Java.

По сути, я хочу проверить состояние каждой радиокнопки в каждой строке, чтобы соответствующим образом обновить мою базу данных.

Как мне получить доступ к каждой строке RadioButton, чтобы проверить, проверены ли они или нет?

Я прошу прощения, если это расплывчато, я постараюсь добавить больше деталей, если это необходимо.

Большое спасибо.

private void processAttendance(){
    int index = 0;
    this.allStudentsCursor = mDbHelper.fetchEnrolledStudents(mRowId);

    lvList=(ListView)findViewById(android.R.id.list);

    this.allStudentsCursor.moveToFirst(); 

    while (allStudentsCursor.isAfterLast() == false) { 


         this.radGroup = (RadioGroup) lvList.getChildAt(index).findViewById(R.id.attendanceGroup);
         this.mAttended = (RadioButton)lvList.getChildAt(index).findViewById(R.id.presentRadio);    
         this.mLate = (RadioButton)lvList.getChildAt(index).findViewById(R.id.lateRadio);    
         this.mExcused = (RadioButton)lvList.getChildAt(index).findViewById(R.id.excusedRadio);    
         this.mMissed = (RadioButton)lvList.getChildAt(index).findViewById(R.id.absentRadio);
         this.mStudentId = allStudentsCursor.getLong(allStudentsCursor.getColumnIndexOrThrow("_id")); 
         this.mResult = "";





    if(mAttended.isChecked()){  
        this.mResult ="attended";
        radGroup.clearCheck();
    }
    else if(mExcused.isChecked()){  
        this.mResult ="excused";        
    }

    else if(mMissed.isChecked()){   
        this.mResult ="missed";     
    }
    else {  
        this.mResult ="late";       
    }

    Calendar cal = Calendar.getInstance(); 
    SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy"); 
    String date = dateFormat.format(cal.getTime());

    this.mDbHelper.addAttendance(date, this.mResult, this.mStudentId, mRowId);
     allStudentsCursor.moveToNext(); 
     index++;
    }




    finish();
}

Ответы [ 3 ]

3 голосов
/ 18 марта 2011

Это в корне неверно - ListView не раздувает разную иерархию представления макета для каждой строки, он сохраняет только то, что необходимо для заполнения экрана. Когда кто-то прокручивает от края, он снова используется для отображения данных для следующего прокрутки.

Данные внутри каждой строки в списке должны поступать из данных в курсоре. Если это не так, он будет потерян при прокрутке с экрана.

2 голосов
/ 18 марта 2011

Вам бы пришлось перебрать Cursor.

myCursor.moveToFirst();
/* Loop over all items */
while (myCursor.isAfterLast() == false) {
    //get radio button
    RadioButton myRadioButton = (RadioButton) findViewById(R.id.radiobutton);
    /*
     Edit or Check myRadioButton
     */
    myCursor.moveToNext();
}

Это быстрый пример, показывающий только один RadioButton, но вы получите картинку.

1 голос
/ 18 марта 2011

Вы не можете.Представления перерабатываются в виде списка, поэтому, если в списке есть, скажем, 20 элементов, у вас может быть только 5 экземпляров RadioButton.Как только представление отключается от экрана, оно перерабатывается.

Что вам нужно сделать, это при каждом нажатии кнопки RadioButton изменить данные в списке, определяющие, нужно ли проверять радио.

...