1

我有ListView一个页脚View,其中包含一个TextView可以根据所选语言动态更改的页脚。
当我选择不同的语言时,我会更新我的ListView项目:

mBaseAdapter.updateItems(items);

基础适配器

public void updateItems(List<Map.Entry<Integer, String>> items) {
        mItemsResIdList = new ArrayList<>(items);
        notifyDataSetChanged();
}

为了更新我的页脚,我这样做了:

mListViewFooter.invalidate();

这不起作用,文本没有改变。但是,如果我将其替换为invalidate();

((TextView)mListViewFooter.findViewById(R.id.myTextView)).setText(R.string.myCopy);

注意:我的ListView元素是TextViews根据所选语言翻译的,它们的数量也可以增加或减少。我的页脚永远不会改变,我只想要View更新以便翻译文本(选择正确的值-(lang)/strings.xml)。

我的问题是,为什么第一种方法不起作用?我能想到的唯一解释是invalidate();不会setText()再次调用,它只会重绘View. 它适用于,ListView因为适配器再次调用getView()再次TextViews填充的地方。这个假设正确吗?

谢谢。

4

1 回答 1

1

该行为只是预期的。调用任何视图的 invalidate() 只会重新绘制已经存在的内容,除非更改在画布中,否则它不会更新。
当您更改语言时,不会通知footerView,以便它可以更改内容。因此,当您尝试从 strings.xml 获取内容时,您将获得正确的语言。再次设置文本,是这样做的方法。

于 2015-06-24T06:32:37.827 回答