3

我正在创建一个具有多语言支持的 android 应用程序。目前它支持超过 15 种不同的语言。到目前为止一切都很好。

但现在的要求是将英语和阿拉伯语混合在一起。我有一个 ListView 来呈现一个 ArrayList 值。ArrayList 很少有阿拉伯文本,很少有元素是英文的。

阿拉伯语在整个应用程序中看起来都很好。但英文行没有显示在 TextView 上。它正在打印在日志中。

Edit-1 它在 android 2.3 中看起来很好。所以,我猜 RTL 可能是导致问题的原因。

Edit-2 下面是应用程序的屏幕截图。正如您在右侧看到的,有些行是白色的。

在右侧的行中,一些数据是从 SQLite 数据库中获取的,一些是从 Web 获取的。从 Web 获取的数据是阿拉伯语,但 SQLite 数据是英语。

适配器 getView() 方法工作正常。在 getView() 中打印了英语和阿拉伯语的数据。在将文本设置为列表行之后,我什至打印了 getText(),并且 getText() 甚至用英文打印。看起来英文行没有被打印或更新。

附加截图

任何帮助深表感谢。

4

1 回答 1

5

这是对 ListView 渲染问题非常奇怪的观察之一。我只在适配器为空时初始化适配器,所做的任何更改或刷新都是使用 notifyDataSetChanged()。但这导致渲染延迟。

if (mOptionsAdapter == null) {
        mOptionsAdapter = new CategoriesAdapter(mContext);
        final ArrayList<CategoriesItem> optionsList = getData();
        mOptionsAdapter.setDatasource(optionsList);
        mOptionsyListView.setAdapter(mOptionsAdapter);
        mOptionsAdapter.notifyDataSetChanged();
} else {
        mOptionsAdapter = new CategoriesAdapter(mContext);
        final ArrayList<CategoriesItem> optionsList = getData();
        mOptionsyListView.setAdapter(mOptionsAdapter);
        mOptionsAdapter.setDatasource(optionsList);
        mOptionsAdapter.notifyDataSetChanged();
}

更改为,每次取消适配器并重新创建即可解决问题。

mOptionsAdapter = null;
mOptionsAdapter = new CategoriesAdapter(mContext);
final ArrayList<CategoriesItem> optionsList = getData();
mOptionsAdapter.setDatasource(optionsList);
mOptionsyListView.setAdapter(mOptionsAdapter);
mOptionsAdapter.notifyDataSetChanged();

我不太确定,但我相信 Android 4.0 提供了 RTL 支持。它不是很稳定并导致渲染问题。幸运的谷歌在 4.2 中修复了这个问题,而且效果很好。

于 2013-07-09T05:19:40.773 回答