Android Listview 未更新

Posted

技术标签:

【中文标题】Android Listview 未更新【英文标题】:Android Listview not updating 【发布时间】:2012-11-13 17:07:51 【问题描述】:

我有一个带有自定义适配器的 ListView,显示来自数据库的信息。 当我启动应用程序时,从数据库中读取数据,将其提供给适配器,然后将其附加到 ListView。一个LayoutAnimationController在ListView上运行,内容显示流畅。

    this._lvList = (ListView)_v.findViewById(R.id.lvList);
    this._lvList.setAdapter(new TableAdapter(getActivity(),R.layout.tablerow,Category.getCategories()));
    LayoutAnimationController lac = new LayoutAnimationController(AnimationUtils.loadAnimation(getActivity(), R.anim.slide_in_left));
    lac.setDelay(0.2f);
    this._lvList.setLayoutAnimation(lac);       
    this._lvList.startLayoutAnimation();

完全没有问题。

现在,当我单击 ListView 的任何条目时,未单击的条目会消失,单击的条目将成为列表中唯一的条目,并按预期显示在顶部。

View v;
for(int i = 0;i<_lvList.getChildCount();i++) 
    v = this._lvList.getChildAt(i);
    if(v!=clickedView) 
           Animation animSlideOut = AnimationUtils.loadAnimation(getActivity(), i%2==0?R.anim.slide_out_left:R.anim.slide_out_right);
           animSlideOut.setStartOffset(i*50);

           // some more stuff

    
    v.startAnimation(animSlideOut);

这也有效,但现在的问题是,如果我再次单击该单个列表条目,我希望重新填充列表,再次显示所有项目。

我认为我可以从一开始就使用代码(第一个 sn-p),因为它在启动应用程序时工作正常,但是......这次......它没有。没有动画发生。原因是,我的 ListView 中没有要动画的视图(上一步中的视图除外)。

我没有创建一个新的 Tableadapter 我已经尝试清除它,将其填充为新的,称为 notifyDataSetChanged()... 没用,因为

_lvList.getChildCount();

stills 返回 1 个视图,而适配器保存所有 18 个条目。 我也试过了

requestLayout();
forceLayout();
invalidate();
invalidateViews();

强制 ListView 在动画之前生成其子视图,但它不起作用。因此,在我调用布局动画之后,atm ListView 会立即出现。

总结:我的 ListView 在布局动画开始之前没有包含子视图,我该如何强制它生成它们?

提前谢谢 :)

【问题讨论】:

您解决了这个问题吗? @dexxtr 抱歉,那是很久以前的事了,但最后我用不同的动画解决了,因为代码没有按预期工作...... 我已经修复了 :) 问题出在错误的上下文中,它引用了另一个屏幕 我发现视图层次结构(android 设备监视器)只有一个视图但显示多个。只有当我使用透明布局时才会发生这种情况 【参考方案1】:

嗯……你做过了吗? (下)

在您的自定义适配器中,覆盖该方法:

@Override
public View getView(int position, View convertView, ViewGroup parent)
    //the position of the item, the convertView is the view layout of what that row is


更改列表视图的更新方式。这个 getView 方法被 Android 每隔一段时间调用一次以刷新视图(你不需要手动调用它)

另外,我想你只需要打电话

listView.notifiyDataSetChanged()listView.invalidate() 在重新填充列表后强制更新

您可以在此处阅读有关列表视图的更多信息:

http://www.vogella.com/articles/AndroidListView/article.html

http://developer.android.com/guide/topics/ui/layout/listview.html

【讨论】:

是的,我有一个自定义适配器,我有一个 getView()。当我启动应用程序时一切正常,而不是第二次。在 notify...() 和 invalidate() 之后,listView 的视图计数仍然是 1,而适配器包含 18 个条目。

以上是关于Android Listview 未更新的主要内容,如果未能解决你的问题,请参考以下文章

Android:我的带有 ListView 的 App Widget 未通过按钮或更新周期进行更新

winform。 listview 更新数据后刷新

Android,ListView IllegalStateException:“适配器的内容已更改但ListView没有收到通知”

Android ListView 不会在滚动时重绘

Android开发 - 下拉刷新和分段头悬停列表

在 Android 中的顶部 ListView 项目上方(以及最后一个项目下方)添加边距