2013-07-10 3 views
0

У меня есть список вопросов, и для каждого элемента есть флажок да и нет. Это создается с использованием абстрактного класса (потому что есть много списков), дочернего класса и адаптера массива. Вот абстрактный код класса создания списка:Android - notifyDataSetChanged не работает с пользовательским представлением

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    List<Question> questions = getQuestions(1L); 
    setContentView(R.layout.activity_questions); 
    items = (ListView) findViewById(R.id.items); 
    adapter = new QuestionsAdapter(this, getCurrentContext(), questions, 1L, getDbData()); 
    items.setAdapter(adapter); 
} 

Вот это QuestionsAdapter:

public View getView(int position, final View convertView, ViewGroup parent) { 
    View row = convertView; 
    if (row == null) { 
    LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    row = inflater.inflate(R.layout.row_questions, parent, false); 
    holder = new QuestionHolder(); 
    holder.question = (TextView) row.findViewById(R.id.question); 
    holder.yes = (CheckBox) row.findViewById(R.id.yes); 
    holder.no = (CheckBox) row.findViewById(R.id.no); 
    row.setTag(holder); 
    } else { 
    holder = (QuestionHolder) row.getTag(); 
    } 
    Question question = questions.get(position); 
    holder.question.setText(question.getQuestion());  
    setStateCheckboxes(holder, question); 
    holder.yes.setTag(getItem(position)); 
    holder.no.setTag(getItem(position)); 
    holder.yes.setOnCheckedChangeListener(listen); 
    holder.no.setOnCheckedChangeListener(listen); 
    return row; 
} 

Я должен создать держатель, чтобы быть в состоянии иметь ListView с флажками. До этого момента все работает нормально.

У меня тогда есть представление для каждого элемента в списке. Это очень просто:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    dbData = new DbData(this); 
    this.setContentView(R.layout.single_question); 
    CheckBox yes = (CheckBox) findViewById(R.id.yes_single); 
    CheckBox no = (CheckBox) findViewById(R.id.no_single); 
} 

В этом представлении я могу изменить статус флажков. Это изменение отражается в db, но когда я возвращаюсь в основной список, это отражается только на обновлении. Я переопределены в onRestart():

@Override 
protected void onRestart() { 
    // Change this 
    questions = getQuestions(1L); 
    adapter.notifyDataSetChanged(); 
    super.onRestart(); 
} 

Адаптер вытягивать данные из вопросов ArrayList, поэтому я repolling его и уведомляющее адаптер, что данные изменились, но это не меняет мое мнение. Если я обновляю представление, то текущее состояние всего обновляется. Я знаю, что это длинный вопрос, но любая помощь будет оценена по достоинству.

ответ

0

Используйте метод onResume() для вызова, чтобы notifyDataSetChanged.

Вам понадобится код для управления созданием адаптера. Вы не хотите называть это слишком рано в процессе или вы рискуете исключениями.

Как правило, я выполняю это с помощью метода, который отвечает за инициализацию адаптера и добавление его в список, что делает его более безопасным для вызова, независимо от того, запускается ли действие/фрагмент в первый раз или возвращается с другое действие (например, через кнопку «Назад»), а также избежать воссоздания адаптера или замены существующего адаптера в списке.

Также лучше вызвать super.onRestart() перед вашим собственным кодом.

Смежные вопросы