Android - notifyDataSetChanged无法使用自定义视图

时间:2013-07-10 10:09:20

标签: android custom-adapter

我有一个问题列表,每个项目都有一个是和否复选框。这是使用抽象类(因为有很多列表),子类和数组适配器创建的。以下是创建列表的抽象类代码:

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;
}

我必须创建持有者才能拥有带复选框的列表视图。到目前为止,一切正常。

然后我对列表中的每个元素都有一个视图。这是非常基础的:

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中提取数据,因此我正在重新编译它并通知适配器数据已更改,但这不会改变我的视图。如果我刷新视图,则更新所有内容的当前状态。我知道这是一个很长的问题,但任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

使用onResume()方法调用notifyDataSetChanged。

您需要使用代码来管理是否已创建适配器。您不希望在此过程中过早地调用它,否则您将面临异常风险。

通常我通过一个负责初始化适配器并将其添加到列表视图的方法来做到这一点,这使得调用它更安全,无论活动/片段是第一次启动还是从另一个返回活动(例如通过后退按钮),以及避免重新创建适配器或替换列表视图上的现有适配器。

最好在你自己的代码之前调用super.onRestart()。