我正在尝试更改ListView项目的文本,它会成功更改但是当我单击列表中的任何项目时,列表中的所有TextView都返回到旧值,我尝试使用GlobalLayoutListener但它需要在CPU上工作太多了。
以下代码获取应用程序中的所有TextView并更改它们的所有文本,但是还有一个我需要修复的问题是文本视图未在屏幕上显示或向下滚动时列表中,列表项文本不会更改。
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");
}
}
答案 0 :(得分:0)
因为函数是递归的。试试这个。
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/////////
}
}