所以我有一个我创建的自定义列表适配器,我正在尝试动态。它开始为空,然后用户可以动态添加或删除项目。一切正常,除了一件事:当我更新适配器时,适配器的'getView'没有被调用,因此项目的标题 - 显然 - 没有设置(而是显示它的地址)。 这是更新数组的代码:
private void newTab(String name, String url){
_tabAdapter.add(new Article(name,url));
_tabAdapter.notifyDataSetChanged();
_tabCount++;
}
以下是适配器本身的代码:
public class TabAdapter extends ArrayAdapter<Article>{
Context _context;
@Override
public int getCount() {
return _tabCount;
}
public TabAdapter(Context c) {
super(c, R.layout.tab_item);
_context=c;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater=(LayoutInflater) _context.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View _view = inflater.inflate(R.layout.tab_item, parent,false);
TextView _itemText = (TextView) _view.findViewById(R.id.tab_text);
Article getArticle = getItem(position);
String newName = getArticle.getName();
_itemText.setText(newName);
return _view;
}
}
现在一切正常 - 即使OnClick工作得很好并且正确获取了itme的名称,它只是列表本身没有显示项目的名称。我必须遗漏一些非常基本的东西,但我找不到它是什么。任何帮助将不胜感激。
更新:虽然它不能解决上面提到的确切问题,但我设法通过为“文章”类创建“toString()”方法来解决它 - 所以现在标题显示应该 - 除了它不是一个非常优雅的解决方案。
答案 0 :(得分:0)
您需要一个构造函数来传递文章列表。
TabAdapter (Context context, int resource, T[] objects)
无论何时修改列表,都需要重新初始化适配器以获取更新的视图。
答案 1 :(得分:0)
根据你的问题,这个问题可能是因为你调用它时会调用getView()方法,但它仍然有旧数据,你可能会以某种方式拥有List Fragment的冗余副本,并且更新的适配器数据不可见
您可以在更新数据后通过ListView.invalidateViews()来避免这种情况,这可能会强制您的列表显示新数据(应该调用您的getView()方法。)
非常重要的是你在构造函数中传递值
在各个点进行调试,如果没有则检查实现。
答案 2 :(得分:0)
ArrayAdapter
根据内部支持集合中的项目数跟踪自己的计数。此外,只要您调用add,它就会在内部致电notifyDataSetChanged
,除非您通过调用setNotifyOnChange(false)
明确禁用此功能。
作为调试它的第一步,您应该删除getCount
覆盖以及对notifyDataSetChanged
的呼叫。我没有看到一个明显的方法导致您的问题,但最好先简化您的代码。
您是否偶然将此适配器与Spinner或类似的小部件一起使用?如果是这样,您还必须覆盖getDropDownView
,否则您将获得默认行为,即尝试将集合中的对象呈现为字符串。