getView()调用太晚了

时间:2014-05-11 21:07:04

标签: android nullpointerexception android-adapter

我构建了一个自定义适配器,以便在列表视图中正确显示某些数据。在 onContextItemSelected ()中,数据集已更改,我调用 notifyDataSetChanged ()来更新列表视图。显然,适配器的 getView ()方法仅在 onContextItemSelected ()终止后才被调用

  1. 为什么?
  2. contextItemSelected()中,我调用 editLanguage()方法,该方法需要访问一个按钮,该按钮应该先由 getView()。由于 getView()被调用"太晚了#34;我得到一个NullpointerException。
  3. 按钮在" getView"中充气。应该由" notifyDataSetChanged"。

    调用
    public boolean onContextItemSelected(MenuItem item) {
       AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)   item.getMenuInfo();
       languageItem selectedLanguage = languages.get((int) info.id);
       switch (item.getItemId()) {
         case EDIT: 
          languages.get((int) info.id).setSelected(true); 
          adapter.update(languages); 
          adapter.notifyDataSetChanged(); // call getView() of the adapter!
          editLanguage(selectedLanguage); // access a button that was inflated by getView()
    //...
    
    
    public View getView(int position, View convertView, ViewGroup parent) {    
    //...         
    switch(getItemViewType(position)) {
      case DEFAULT_LINE:
       //...
       break;
      case EDIT_LINE: 
       convertView = LayoutInflater.from(getContext()).inflate(R.layout.language_row_edit, null); // contains button bu_language_change
       viewHolder.button = (Button) convertView.findViewById(R.id.bu_language_change);
       break;
      //...
    

    尝试访问按钮时,我得到null(bu_language_change)。

    private void editLanguage(final LanguageItem languageToEdit) {
    
    Button editButtonConfirm = (Button) this.findViewById(R.id.bu_language_change); // null
    

1 个答案:

答案 0 :(得分:0)

notifyDataSetChanged不会强制适配器立即调用getView方法的序列。它宁愿告诉它应该刷新并且它是异步发生的。如果你想实现这个目标,你提到我有两个想法:

  1. bu_language_change Button添加到DEFAULT_LINE的观看级别为View.GONE的视图中,然后在EDIT_LINE中更改可见性View.VISIBLEView.GONE使您的布局表现得没有这样的孩子(bu_language_change按钮)。
  2. 以某种方式从getView()方法通知已经完成了膨胀视图,并调用editLanguage方法。但这是一个坏主意。 Romain Guy in here说:
  3.   

    ...不保证getView()完全被调用   每个项目一次...

    或者从editLanguage方法的主体调用此getView方法,这样就可以解决您的问题。

    我建议您观看有关ListView的Google I / O. It's over here