【问题标题】:when changing text of ListView item it returns to the old one?更改 ListView 项目的文本时,它会返回旧项目吗?
【发布时间】:2015-09-10 11:54:44
【问题描述】:

我正在尝试更改 ListView 项目的文本,它成功更改,但是当我单击列表中的任何项目时,列表的所有 TextViews 都返回到旧值,我尝试使用 GlobalLayoutListener 但它需要太多在 CPU 上工作。

以下代码获取应用程序中的所有 TextViews 并全部更改它们的文本,但还有一个我需要解决的问题是文本视图未显示在屏幕上或向下滚动时列表,列表项文本不会改变。

ArrayList <TextView> textViews=new ArrayList<>();    
ViewTreeObserver vto = getWindow().getDecorView().getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            changetext((ViewGroup)getWindow().getDecorView());
        }
    });
void changeText(ViewGroup viewGroup){


    if (viewGroup == null) return;
    for (int i=0; i<viewGroup.getChildCount(); i++)
    {
        View view = viewGroup.getChildAt(i);
        if (view instanceof ViewGroup) changeText((ViewGroup) view);
        if (view instanceof TextView){
            if(!(textViews.contains(view)))textViews.add((TextView) view);
        }
    }

   for(int i=0;i<textViews.size();i++){
       textViews.get(i).setText("new Text");


  }
}

【问题讨论】:

  • 分享你的适配器代码
  • 为什么不用一个Adapter,在这个adapter的getView方法里面改变一个Item的TextView呢?我认为这样更容易。有关将 ListView 与 Adapter 和 ViewHolder 一起使用以获得性能的示例,请点击以下链接:ricston.com/blog/optimising-listview-viewholder-pattern

标签: android listview textview


【解决方案1】:

因为函数是递归的。试试这个。

ArrayList <TextView> textViews=new ArrayList<>();    
ViewTreeObserver vto = getWindow().getDecorView().getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            changetext((ViewGroup)getWindow().getDecorView());

/////////////Add here////////
for(int i=0;i<textViews.size();i++){
       textViews.get(i).setText("new Text");
  }
        }
    });
void changeText(ViewGroup viewGroup){


    if (viewGroup == null) return;
    for (int i=0; i<viewGroup.getChildCount(); i++)
    {
        View view = viewGroup.getChildAt(i);
        if (view instanceof ViewGroup) changeText((ViewGroup) view);
        if (view instanceof TextView){
            if(!(textViews.contains(view)))textViews.add((TextView) view);
        }//removed from here/////////
    }


}

【讨论】:

    【解决方案2】:

    创建一个扩展TextView 的自定义类并覆盖onWindowVisibilityChanged 方法,它会告诉您您的TextView 何时在屏幕上可见并且您将能够在那时更改字符串。

    如果您需要更改当前活动的文本,您可以将它们注册到一个列表中(onWindowVisibilityChanged),然后更改所有这些 TextView 的文本。

    【讨论】:

      猜你喜欢
      • 2012-07-01
      • 1970-01-01
      • 2012-08-24
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      相关资源
      最近更新 更多