首页 > 解决方案 > content in recyclerview not changing when language changed

问题描述

I have done with values, values-in, and values-en. but my data in recyclerview still not change. When i try to change language content which not include in recyclerview is changing but content that include in recyclerview can't changing

i have done trying recreate but it's not working

data Tv

package com.example.submission2.Data;

import android.content.Context;

import com.example.submission2.ItemData;
import com.example.submission2.R;

import java.util.ArrayList;

public class TvShow {

private static Context context;
private static ArrayList<ItemData> itemDataTvs;

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

private static final int[] PROFILE = {
        R.drawable.tv_poster_arrow,
        R.drawable.tv_poster_doom_patrol,
        R.drawable.tv_poster_dragon_ball,
        R.drawable.tv_poster_iron_fist,
        R.drawable.tv_poster_family_guy,
        R.drawable.tv_poster_flash,
        R.drawable.tv_poster_god,
        R.drawable.tv_poster_gotham,
        R.drawable.tv_poster_grey_anatomy,
        R.drawable.tv_poster_hanna
};

public static ArrayList<ItemData> getAllTv(){
    itemDataTvs = new ArrayList<>();
    String[] desc = context.getResources().getStringArray(R.array.DescriptionTv);
    String[] tanggal = context.getResources().getStringArray(R.array.TanggalTv);
    String[] judul = context.getResources().getStringArray(R.array.TittleTv);
    String[] score = context.getResources().getStringArray(R.array.ScoreTv);


    for(int i = 0; i < PROFILE.length;i++){
        ItemData itemDataTv = new ItemData();

        itemDataTv.setProfil(PROFILE[i]);
        itemDataTv.setDataPublish(tanggal[i]);
        itemDataTv.setTitle(judul[i]);
        itemDataTv.setDescription(desc[i]);
        itemDataTv.setScor(score[i]);

        itemDataTvs.add(itemDataTv);
    }
    return itemDataTvs;
}

}

MainActivity

package com.example.submission2;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager;

import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.provider.Settings;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;

import com.example.submission2.Data.Movies;
import com.example.submission2.Data.TvShow;
import com.google.android.material.tabs.TabLayout;

import java.util.Locale;

public class MainActivity extends AppCompatActivity {

private SectionsPagerAdapter sectionsPagerAdapter;
private ViewPager viewPager;
private TabLayout tabs;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Movies movies = new Movies(this);
    TvShow tvShow = new TvShow(this);

    sectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager(), this);
    viewPager = findViewById(R.id.view_pager);
    viewPager.setAdapter(sectionsPagerAdapter);
    tabs = findViewById(R.id.tabs);
    tabs.setupWithViewPager(viewPager);

    getSupportActionBar().setElevation(0);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_menu, menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    if(item.getItemId() == R.id.action_setting){
        Intent mIntent = new Intent(Settings.ACTION_LOCALE_SETTINGS);
        startActivity(mIntent);
    }
    return super.onOptionsItemSelected(item);
}

}

PagerAdapter

package com.example.submission2;

import android.content.Context;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;

import com.example.submission2.Data.Movies;
import com.example.submission2.Data.TvShow;

public class SectionsPagerAdapter extends FragmentPagerAdapter {

private final int[] TAB_TITLES = new int[]{
        R.string.tab_text_1,
        R.string.tab_text_2
};

private final Context mContext;

public SectionsPagerAdapter(@NonNull FragmentManager fm, Context mContext) 
{
    super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
    this.mContext = mContext;
}

@NonNull
@Override
public Fragment getItem(int position) {
    Fragment fragment = TabFragment.newInstance(Movies.getAllMovies());
    switch (position){
        case 0 :
            fragment = TabFragment.newInstance(Movies.getAllMovies());
            break;
        case 1 :
            fragment = TabFragment.newInstance(TvShow.getAllTv());
            break;
    }
    return fragment;
}

@Override
public int getCount() {
    return 2;
}

@Nullable
@Override
public CharSequence getPageTitle(int position) {
    return mContext.getResources().getString(TAB_TITLES[position]);
}
} 

标签: javaandroidlocalization

解决方案


一旦你将实际的字符串放入一个数组中,字符串将不会被刷新,直到你再次调用 getAllTv() 方法。我可以建议的最好的方法是不要存储实际的字符串,而是更改逻辑以存储字符串数组资源的资源 id 和数组中字符串的索引,然后在准备好显示之前不要创建实际的字符串它在您的 RecyclerView 适配器中。这样,您可以在语言更改时刷新 RecyclerView 适配器中的数据,并且它将从正确的字符串资源中提取字符串。

您可以使用 BroadCastReceiver 来检测区域设置以及通过关联语言何时更改和刷新您的数据集:

 BroadcastReceiver receiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            // refresh your adapter dataset and notify dataset changed here
        }

    };

    IntentFilter intentFilter = new IntentFilter(Intent.ACTION_LOCALE_CHANGED);
    registerReceiver(receiver, intentFilter);

推荐阅读