语言更改时 RecyclerView 不会更改资源值

RecyclerView not changing resource values when language change

我正在使用下面的代码将我的应用程序的语言更改为阿拉伯语。但是当它改变时,RecyclerView 中的资源并没有改变。它只是改变方向(在 Activity 内),所有其他视图都在改变值。 (mipmap,字符串),但片段内 RecyclerView 的值没有改变。

Class 文件

Locale locale;
Sessions session = new Sessions(context);
if (session.getLanguage().equals("1")) {
 locale = new Locale("en-rU");
}
else{
 locale = new Locale("ar");
}
Locale.setDefault(locale);
Configuration config = new Configuration();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
  config.setLocale(locale);
} else {
  config.locale = locale;
}
context.getResources().updateConfiguration(config, 
context.getResources().getDisplayMetrics());
}

布局xml文件

<android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/spotList"
    tools:listitem="@layout/recycler_spot"/>

适配器Class

public class ItemsAdapter extends RecyclerView.Adapter<ItemsAdapter.CustomViewHolder> {
Context context;
OnItemClick onItemClick;

public ItemsAdapter(Context context){
    this.context=context;
}


@NonNull
@Override
public CustomViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view= LayoutInflater.from(context).inflate(R.layout.recycler_items,viewGroup,false);
    return new CustomViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull CustomViewHolder customViewHolder, int i) {
}

@Override
public int getItemViewType(int position) {
    return super.getItemViewType(position);
}

@Override
public int getItemCount() {
    return 6;
}

public class CustomViewHolder extends RecyclerView.ViewHolder {
    public CustomViewHolder(@NonNull View itemView) {
        super(itemView);
    }

}

public interface OnItemClick{
    public void onItemClick(int position);
}

}

我找到了解决方案。

我在 Recyclerview 适配器的构造函数中调用它。不知道方法对不对,问题还是解决了

 @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
public static void setResources(Context context) {
    Locale locale;

    Sessions session = new Sessions(context); 
    //Log.e("Lan",session.getLanguage());
    if (session.getLanguage().equals("1")) {
        locale = new Locale("en-rUS");
    }else{
        locale = new Locale("ar");
    }

    Resources res=context.getResources();
    DisplayMetrics dm=res.getDisplayMetrics();
    android.content.res.Configuration configuration=res.getConfiguration();
    configuration.setLocale(locale);
    res.updateConfiguration(configuration,dm);
}

我使用以下功能更改我的应用语言。

public void setUserMobileLanguage(String sUserLanguageCode) {
        try {
            String[] arrLngCode = sUserLanguageCode.split("-");
            if (arrLngCode.length > 1)
                sUserLanguageCode = arrLngCode[0];

            if (sUserLanguageCode.equals("he")) {
                sUserLanguageCode = "iw";
            }

            if (sUserLanguageCode.equals("en")) {
                new LocalHelper().setLocal(mContext, sUserLanguageCode); //set app en language
                getHelper().setAppLanguage(sUserLanguageCode);  //store for later use
            } else {
                if (!Utilty.isLanguageAvailableInMobile(sUserLanguageCode)) {  //check language available in mobile
                    sUserLanguageCode = "en";//set english as app language
                    makeToast(getString(R.string.selected_language_is_not_support_by_your_mobile));
                }
                new LocalHelper().setLocal(mContext, sUserLanguageCode); //set app language
                getHelper().setAppLanguage(sUserLanguageCode);  //store for later use
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

检查系统支持语言或不使用以下代码。

public static boolean isLanguageAvailableInMobile(String lngCode) {
        return Arrays.toString(Locale.getAvailableLocales()).contains(lngCode);
    }

我的字符串资源文件示例。

使用上面的代码和资源文件,我可以更改我的应用程序布局和文本。

当您从 activity(不是从片段)设置适配器时,确保调用 getBaseContext 作为上下文参数:

yourAdapter = new YourAdapter(userIDArr, profileIDArr, ... getBaseContext());

yourRecyclerView.setAdapter(yourAdapter);