简体   繁体   中英

android:- How to change the language of list items of recyclerview?

I am new to android.I want to change the language of my list items of recyclerview. My list items are stored in string array in values.How can i change the language of list items on the click of list item. Here is the code it tried but i got error.Can someone please correct my error or show me the right way to achieve the desired result.

error:-

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
                  at com.example.chaitanya.kundli.MainActivity.setLocale(MainActivity.java:60)
                  at com.example.chaitanya.kundli.RecyclerViewAdapter$1.onClick(RecyclerViewAdapter.java:66)
                  at android.view.View.performClick(View.java:4759)
                  at android.view.View$PerformClick.run(View.java:19770)
                  at android.os.Handler.handleCallback(Handler.java:739)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:135)
                  at android.app.ActivityThread.main(ActivityThread.java:5237)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at java.lang.reflect.Method.invoke(Method.java:372)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:707)

MainActivity.java

 public class MainActivity extends AppCompatActivity {
android.content.res.Resources res;

RecyclerView recyclerView;

Context context;
String[] numbers;

RecyclerView.Adapter recyclerView_Adapter;

RecyclerView.LayoutManager recyclerViewLayoutManager;


@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
    res = getResources();

    numbers = res.getStringArray(R.array.abc);
    getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
    getSupportActionBar().setCustomView(R.layout.action_bar);

    context = getApplicationContext();

    recyclerView = (RecyclerView) findViewById(R.id.recycler_view1);

    //Change 2 to your choice because here 2 is the number of Grid layout Columns in each row.
    recyclerViewLayoutManager = new GridLayoutManager(context, 2);

    recyclerView.setLayoutManager(recyclerViewLayoutManager);

    recyclerView_Adapter = new RecyclerViewAdapter(context,numbers);

    recyclerView.setAdapter(recyclerView_Adapter);

}
public void setLocale(String lang) {
    Locale myLocale = new Locale(lang);
    Resources res = context.getResources();
    DisplayMetrics dm = res.getDisplayMetrics();
    Configuration conf = res.getConfiguration();
    conf.locale = myLocale;
    res.updateConfiguration(conf, dm);
    Intent refresh = new Intent(this, MainActivity.class);
    startActivity(refresh);
    finish();
}
}

RecyclerViewAdapter.java

    public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>{

String[] values;
Context context1;

public RecyclerViewAdapter(Context context2,String[] values2){

    values = values2;

    context1 = context2;
}

public static class ViewHolder extends RecyclerView.ViewHolder{

    public TextView textView;

    public ViewHolder(View v){

        super(v);

        textView = (TextView) v.findViewById(R.id.textview1);

    }
}

@Override
public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){

    View view1 = LayoutInflater.from(context1).inflate(R.layout.recycler_view_items,parent,false);

    ViewHolder viewHolder1 = new ViewHolder(view1);

    return viewHolder1;
}

@Override
public void onBindViewHolder(ViewHolder Vholder,final int position){

    Vholder.textView.setText(values[position]);

    Vholder.textView.setBackgroundColor(Color.parseColor("#ffc947"));

    Vholder.textView.setTextColor(Color.BLACK);
    Vholder.textView.setBackgroundResource(R.drawable.rounded_corner);

    Vholder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            MainActivity aa = new MainActivity();
            if(position == 4){
                aa.setLocale("hi");//calling function
            }
        }
    });

}

@Override
public int getItemCount(){

    return values.length;
}
}

string.xml

   <?xml version="1.0" encoding="utf-8"?>
 <resources>
<string name="app_name">nnn</string>
<string-array name="abc">
    <item>Query</item>
    <item>Answers</item>
    <item>Rate Us</item>
    <item>Change Language</item>
    <item>Logout</item>
</string-array>
</resources>

string.xml(hi)

  <?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">nnn</string>
<string-array name="abc">
    <item>सवाल पूछें </item>
    <item>उत्तर देखें</item>
    <item>रेटिंग दीजिये</item>
    <item>भाषा बदलें</item>
    <item>बाहर निकलें</item>
</string-array>
</resources>

Activities creation are handle by the system , you should not call new WhateverActivity() .

Instead you can use a Interface as a listener for example:

LocaleListener.java

public interface LocaleListener {
    void setLocale(String values)
}

In your adapter create a LocaleListener variable and a setter:

    public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>{

       String[] values;
       Context context1;
       private LocaleListener mListener;  //some change here

       public RecyclerViewAdapter(Context context2,String[] values2){

           values = values2;

           context1 = context2;
       }

       public static class ViewHolder extends RecyclerView.ViewHolder{

           public TextView textView;

           public ViewHolder(View v){

               super(v);

               textView = (TextView) v.findViewById(R.id.textview1);

           }
      }

     @Override
     public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){

         View view1 = LayoutInflater.from(context1).inflate(R.layout.recycler_view_items,parent,false);

         ViewHolder viewHolder1 = new ViewHolder(view1);

         return viewHolder1;
    }

    @Override
    public void onBindViewHolder(ViewHolder Vholder,final int position){

        Vholder.textView.setText(values[position]);

        Vholder.textView.setBackgroundColor(Color.parseColor("#ffc947"));

       Vholder.textView.setTextColor(Color.BLACK);
       Vholder.textView.setBackgroundResource(R.drawable.rounded_corner);

       Vholder.itemView.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View view) {
               if(position == 4 && mListener != null){ // some change here
                   mListener.setLocale("hi");//calling function
               }
           }
       });

      }

    @Override
    public int getItemCount(){

        return values.length;
    }

    //some change here
    public void setLocaleListener(LocaleListener listener) {
        mListener = listener
    }
}

Finally set your Activity as the LocaleListener:

public class MainActivity extends AppCompatActivity implements LocaleListener{
   android.content.res.Resources res;

   RecyclerView recyclerView;

   Context context;
   String[] numbers;

   RecyclerView.Adapter recyclerView_Adapter;

   RecyclerView.LayoutManager recyclerViewLayoutManager;


   @Override
   protected void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);

      setContentView(R.layout.activity_main);
      res = getResources();

      numbers = res.getStringArray(R.array.abc);

      getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
      getSupportActionBar().setCustomView(R.layout.action_bar);

      context = getApplicationContext();

      recyclerView = (RecyclerView) findViewById(R.id.recycler_view1);

    //Change 2 to your choice because here 2 is the number of Grid layout Columns in each row.
       recyclerViewLayoutManager = new GridLayoutManager(context, 2);

       recyclerView.setLayoutManager(recyclerViewLayoutManager);

       recyclerView_Adapter = new RecyclerViewAdapter(context,numbers);

       recyclerView_Adapter.setLocaleListener(this); // some change here

       recyclerView.setAdapter(recyclerView_Adapter);

   }

   @Override
   public void setLocale(String lang) {
       Locale myLocale = new Locale(lang);
       Resources res = context.getResources();
       DisplayMetrics dm = res.getDisplayMetrics();
       Configuration conf = res.getConfiguration();
       conf.locale = myLocale;
       res.updateConfiguration(conf, dm);
       Intent refresh = new Intent(this, MainActivity.class);
       startActivity(refresh);
       finish();
    }
}

Hope this helps.

Do not recreate the MainActivity , but create an Interface to update the language.

Interface

public interface RecyclerViewOnClickListenerHack {

    void onLanguage(String language);
}

MainActivity

public class MainActivity extends AppCompatActivity implements RecyclerViewOnClickListenerHack {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...

        recyclerView_Adapter = new RecyclerViewAdapter(context,numbers);
        recyclerView_Adapter.setmRecyclerViewOnClickListenerHack(this)
        recyclerView.setAdapter(recyclerView_Adapter);
    }

    @Override
        public void onLanguage(String language) {
           setLocale(String language)
        }

}

RecyclerViewAdapter

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>{

    private RecyclerViewOnClickListenerHack mRecyclerViewOnClickListenerHack;

    public void setmRecyclerViewOnClickListenerHack(RecyclerViewOnClickListenerHack r) {
        this.mRecyclerViewOnClickListenerHack = r;
    }


    @Override
    public void onBindViewHolder(ViewHolder Vholder,final int position){
        ...
        Vholder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
              if(position == 4){
                RecyclerViewOnClickListenerHack.onLanguage("hi");//calling function
              }
            }
        });
    }

}

I am not sure about error, If possible please share GITHUB link.But I think I help in same, I tried below two ways to do this.

1) You need to change your phone language to Hindi and try loading your app, it will load hindi content.

2) You just want to change language in your app (Which is not advisable)

Please find my GitHUB link where I updated two of my projects. You can refer to project 15 for local language. and project 16 to change language in your app. Android Mini Apps

Thanks Ashish

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM