代码之家  ›  专栏  ›  技术社区  ›  Falmarri

在listview中重画一行[重复]

  •  40
  • Falmarri  · 技术社区  · 15 年前

    是否可以在 ListView 列表视图 行是 LinearLayout s、 我听一个偏好改变,有时我只需要改变一个 View 在里面 线性布局 listview.notifyDatasetChanged() ?

    我试过在视图上调用view.invalidate()(在 线性布局

    4 回复  |  直到 11 年前
        1
  •  107
  •   Sufian    11 年前

    作为罗马佬 explained a while Google I/O session ,在列表视图中只更新一个视图的最有效方法如下(此方法更新整个视图 View 数据):

    ListView list = getListView();
    int start = list.getFirstVisiblePosition();
    for(int i=start, j=list.getLastVisiblePosition();i<=j;i++)
        if(target==list.getItemAtPosition(i)){
            View view = list.getChildAt(i-start);
            list.getAdapter().getView(i, view, list);
            break;
        }
    

    target 是适配器的一项。

    ListView ,然后浏览当前显示的视图,比较 目标 getView() 在那个视图上刷新显示。

    作为旁注 invalidate() 获取视图() 做, notifyDataSetChanged() getview() 对于每个显示的项目和 invalidateViews() 也会影响很多人。

    最后,如果只需要更改行视图的子视图,而不是整个行视图,则还可以获得额外的性能 getView list.getAdapter().getView(i, view, list); (更改 TextView

    ((TextView)view.findViewById(R.id.myid)).setText("some new text");
    

    在我们信任的代码中。

        2
  •  6
  •   Felipe    14 年前

    view.invalidate() 不适合我。但这很有魅力:

    position “在那排。 这个 if 避免奇怪的重画,比如当你是

                if (position >= listView.getFirstVisiblePosition()
                    && position <= listView.getLastVisiblePosition()) {
    
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                listView.invalidateViews();
                            }
                        });
                }
    
        3
  •  3
  •   jptsetung    14 年前

    Romain Guy在“Google IO 2010 ListView世界”上回答了这个问题 这个问题被问到的确切时间的视频: http://www.youtube.com/watch?feature=player_detailpage&v=wDBM6wVEO70#t=3149s

    你的观点没有重新绘制的原因有点神秘。 可能尝试禁用listView中可用的所有缓存选项

    setAnimationCacheEnabled(false);
    setScrollingCacheEnabled(false);
    setChildrenDrawingCacheEnabled(false);
    setChildrenDrawnWithCacheEnabled(false);
    
        4
  •  0
  •   Storm user3539906    12 年前

    在要更新的行上放置一些标记。

    ListView lv = (ListView)findViewById(....)
    

    然后

    View v = lv.findViewWithTag(tagobject);
    

    推荐文章