java - 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]);
}
}
解决方案
一旦你将实际的字符串放入一个数组中,字符串将不会被刷新,直到你再次调用 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);
推荐阅读
- git - 冲突阻止自动合并
- php - PHPUnit 无法检测 PHP 7.3.2
- c# - 无法加载文件或程序集“RevitApi”版本 = 19.0.0.0,
- javascript - Videojs 7 silvermine videojs-chromecast没有加载按钮
- python - 使用堆栈评估中缀表达式时出现算术错误评估和 KeyDict 错误;
- rust - 紧凑地覆盖所有目标的构建脚本
- watson-conversation - 与 Watson Assistant 中的意图意外匹配的原因
- django - Python django 软件包未安装
- r - 如何在汇总数据上绘制堆积条形图
- c++ - LUA & C++:如何在 LUA 代码中正确使用 C++ 函数