2015-09-06 17 views
2

我有一个树结构,其中节点是类别,如果他们有孩子和物品,如果没有。 我使用gridView和自定义适配器绘制了顶级类别。 我注册了一个单击事件处理程序,在其中更改树的级别并通知gridView数据已更改。为什么网格视图中的适配器没有更新其内容?

段:

gridview = (GridView) findViewById(R.id.gridview); 
    ma = new MenuAdapter(this, menu); //menu is the tree I pass to the adapter 
    gridview.setAdapter(ma); 

    gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View v, 
           int position, long id) { 
      //ma.setSubTree(position); 
      menu = menu.children.get(position); 
      gridview.deferNotifyDataSetChanged(); 
      gridview.invalidateViews(); 
        Toast.makeText(MainActivity.this, "" + position, 
        Toast.LENGTH_SHORT).show(); 
     } 
    }); 

使用标准输出调试它出现在树中的位置确实更新,但认为保持不变。 这使我相信我犯的错误是在适配器的getView方法中,但对于我来说我无法弄清楚。

getView根据每个树节点的数据膨胀一个自定义布局(图像缩略图和TextView)。

段:

public View getView(int position, View convertView, ViewGroup parent) { 

    LayoutInflater inflater = (LayoutInflater) mContext 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View gridView; 
    if (convertView == null) { 
     // if it's not recycled, initialize some attributes 
     gridView = new View(mContext); 
     gridView = inflater.inflate(R.layout.grid_item, null); 

     TextView textView = (TextView) gridView.findViewById(R.id.gridItemText); 
     textView.setPadding(15, 15, 15, 15); 
     textView.setText(menu.children.get(position).toString()); 

     com.beardedhen.androidbootstrap.BootstrapCircleThumbnail thumb = (com.beardedhen.androidbootstrap.BootstrapCircleThumbnail) gridView.findViewById(R.id.thumb); 
     thumb.setImage(menu.children.get(position).imageSource); 
    } else { 

     gridView = (View) convertView; 
    } 
    return gridView; 
} 

任何帮助将不胜感激。

+0

您不会使用'ExpandableListView'来创建一个** tree **结构吗? –

+0

我不希望它扩大。我可能选择了错误的布局,但是一旦用户选择了一个类别,我希望只显示该类别,最好用项目图片。 – Dormage

+0

可能是主细节设计?你有一个ListView或GridView的类别。当一个项目被点击时,另一个片段(细节)会替换主项目,显示选定的项目。 –

回答

2

即使convertView为null,您也应该反映数据更改以查看。 伪代码:

if(convertView == null) { 
    convertView = inflater.inflate(...); 
} 
// update view below 
// set your textView etc. 

当convertView为空,你创造它,当它不为空,意味着你之前创建的,而Android通过这个肮脏的视图getView,所以你需要更新,以反映底层数据。视图创建和视图配置是不同的事情。

+0

您的个人资料信息显示您有9个答案和0个upvotes。 在这里,有我的upvote,好先生:),欢迎来到stackoverflow – Tawcharowsky

+0

@Tawcharowsky哇,我从未想到,谢谢! – reviver

+0

这里另一个upvote;) – Aleksandar

相关问题