2016-10-13 3 views
0

私のアプリで動的テキストサイズオプションを実装しようとしています。何らかの理由で、リサイクラは、すべてのテキストを希望のサイズに設定するのではなく、カードビュー内でランダムにテキストサイズを変更しています。リストをスクロールすると、一番上のカードビューのテキストは正しく変更されますが、次の3-4はデフォルトのままになり、別のカードビューのテキストが正しく表示されるリストの下にランダムに表示されます。リストをスクロールアップすると、正しく表示されるカードビューがランダムに変わります。RecyclerViewでランダムなカードビューのテキストサイズのみを更新する問題

主な活動....

// Dark Mode Menu 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: 
      mDrawer.openDrawer(GravityCompat.START); 
      return true; 
     case R.id.menu_night_mode_day: 
      setNightMode(AppCompatDelegate.MODE_NIGHT_NO); 
      break; 
     case R.id.menu_night_mode_night: 
      setNightMode(AppCompatDelegate.MODE_NIGHT_YES); 
      break; 
     case R.id.menu_night_mode_auto: 
      setNightMode(AppCompatDelegate.MODE_NIGHT_AUTO); 
      break; 
     // Text Size Options 
     case R.id.menu_text_size_small: 
      setTextSize(18); 
      break; 
     case R.id.menu_text_size_medium: 
      setTextSize(20); 
      break; 
     case R.id.menu_text_size_large: 
      setTextSize(22); 
      break; 
    } 
    return super.onOptionsItemSelected(item); 
} 

// Dark Mode Menu 
private void setNightMode(@AppCompatDelegate.NightMode int nightMode) { 
    AppCompatDelegate.setDefaultNightMode(nightMode); 

    if (Build.VERSION.SDK_INT >= 11) { 
     recreate(); 
    } 
} 

// Dynamic text size 
private void setTextSize(int textSize) { 
    TextView description = (TextView) findViewById(R.id.cardview_description); 
    description.setTextSize(textSize); 
    saveToPreferences(this, "THE_TEXT_SIZE", "" + textSize); 
} 

マイアダプタ....

public class MyPageAdapter extends Adapter<MyPageHolder> { 

public List<MenuPageItems> datas; 
private Activity activity; 
public String dynamicTextSize; 

public MyPageAdapter(Activity activity){ 
    datas = new ArrayList<>(); 
    this.activity = activity; 
} 

public void add(MenuPageItems dataModel){ 
    datas.add(dataModel); 
} 

public void add(MenuPageItems dataModel, int position){ 
    datas.add(position, dataModel); 
} 

public void addAll(List<MenuPageItems> menuPageItems){ 
    datas.addAll(menuPageItems); 
} 

@Override 
public MyPageHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View v = LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false); 
    return createViewHolder(v, viewType); 
} 

@Override 
public void onBindViewHolder(MyPageHolder holder, int position) { 
    holder.bind(datas.get(position), activity, position); 
    dynamicTextSize = "20"; 
} 

@Override 
public int getItemCount() { 
    return datas.size(); 
} 

@Override 
public int getItemViewType(int position){ 
    return datas.get(position).getViewResId(); 
} 

public int searchViewTypePosition(int viewType){ 
    int i = 0; 
    boolean found = false; 
    while(i < datas.size() && !found){ 
     if(datas.get(i).getViewResId() == viewType){ 
      found = true; 
      i--; 
     } 
     i++; 
    } 
    return i; 
} 

public MyPageHolder createViewHolder(View v, int viewType){ 
    return datas.get(searchViewTypePosition(viewType)).createViewHolder(v, activity, this); 
} 
} 

ホルダー....

public abstract class MyPageHolder extends RecyclerView.ViewHolder{ 

protected final Activity activity; 
protected MyPageAdapter adapter; 
public TextView txtTitle, txtDescription, txtTheContent; 
public ImageView imgImage; 
public View view; 

public MyPageHolder(View v, Activity activity, MyPageAdapter adapter) { 
    super(v); 
    this.activity = activity; 
    this.adapter = adapter; 

    imgImage = (ImageView) v.findViewById(R.id.cardview_image); 
    txtTitle = (TextView) v.findViewById(R.id.cardview_title); 
    txtDescription = (TextView) v.findViewById(R.id.cardview_description); 
    view = (CardView) v.findViewById(R.id.card_view); 

    view.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      /*/ this is where the magic happens when clicked /*/ 
     } 
    }); 
} 

public void bind(MenuPageItems dataModel, Activity activity, final int position) { 
    final MenuPageItems m = (MenuPageItems)dataModel; 
    imgImage.setImageResource(m.image); 
    txtTitle.setText(m.title); 
    txtDescription.setText(m.description); 
    //txtTheContent.setText(m.theContent); 

    view.setOnClickListener(new View.OnClickListener() { 
     @Override public void onClick(View v){ 

      Intent cvIntent = new Intent(view.getContext(), EndpageActivity.class); 

      // header image to pass to endpage activity 
      cvIntent.putExtra("endpageHeader", m.image); 

      // text to pass to endpage activity 
      cvIntent.putExtra("endpageTitle", m.title); 
      cvIntent.putExtra("endpageTheContent", m.theContent); 
      view.getContext().startActivity(cvIntent); 
     } 
    }); 
} 
} 

は私に何かを追加する必要がありますかアダプターまたはビューホルダーを使用してすべてのテキストを正しく更新しますか?

+0

私たちはあなたのbindViewHolder()とcreateViewHolder()methods.forアダプターを見ることができれば、私は最高だろう。 –

+0

アダプターとビューホルダーのコード全体を追加しました。ありがとう。 –

答えて

0

私はそれを得ると思いますが、テキストサイズをどこに設定しているのか分かりませんが、カードによってはランダムに変化します。

私が見るとおり、ホルダーのバインドメソッドでサイズを設定する必要があります。これは、カードを再描画する必要があるたびに実行されます。 bind()の内部で共有設定を読むことができますが、スクロールするときにホルダーのbindメソッドが何度も呼び出されるため、それはひどく非効率です。あなたは、アダプタにdynamicTextSizeメンバ変数を追加し、いずれかで値を設定し

)(ホルダーバインド内の余分な作業を避けるために、WAN:

  1. アダプタにsetText/getTextサイズを追加し、アクティビティを設定することができますこれは必要なときに行います。
  2. アダプタのコンストラクタ内でテキストサイズを取得し、notifyDataSetChanged()メソッドをオーバーライドし、呼び出されるたびに値を再度取得します。次に例

    super.notifyDataSetChanged()

を呼び出す:

@Override 
public void notifyDataSetChanged() { 
    this.dynamicTextSize = // Pull value from shared preferences 
    super.notifiyDataSetChanged(); 
} 

私は何も表示されないことはホルダーに渡されるdynamicTextSize値です。ホルダーにはアダプターへの参照があるので、アダプターにgetTextSize()メソッドを追加すると、ホルダーがアダプターを呼び出して取得できます。

public MyPageHolder(View v, Activity activity, MyPageAdapter adapter) { 
    ... 
    this.dynamicTextSize = adapter.getTextSize() 
} 

最後に、setTextSize()メソッドでは、あなたは、アダプタを更新するadapter.notifyDataSetChanged()を呼び出す必要があります。私は以前の記事でにいくつかの詳細を追加しようとしてきました

更新10/17

。お使いのアダプタで

主な活動

// Dynamic text size 
private void setTextSize(int textSize) { 

    // Add a call to set the text to the adapter's member variable: 
    mAdapter.setTextSize(textSize); 

    // I'm not sure what description is here... I don't see what type the member is 
    description.setTextSize(textSize); 
    saveToPreferences(this, "THE_TEXT_SIZE", "" + textSize); 
} 

、テキストのサイズを設定および取得するメソッドを追加します。このセットは、テキストサイズが変更されたときにメインアクティビティによって呼び出され、getはTextViewのサイズを設定する必要があるたびにホルダーによって呼び出されます。あなたのホルダーで

public class MyPageAdapter extends Adapter<MyPageHolder> { 

    ... 
    public String dynamicTextSize; 

    public void setTextSize(int textSize) { 
     dynamicTextSize = textSize; 
    } 
    // This will be called by the holder 
    public int getTextSize() { 
     return dynamicTextSize; 
    } 
    ... 
} 

public abstract class MyPageHolder extends RecyclerView.ViewHolder{ 
    public void bind(MenuPageItems dataModel, Activity activity, final int position) { 
     ... 

     // Call into the adapter to get the text size. 
     int textSize = adapter.getTextSize(); 
     txtDescription.setTextSize(textSize); 
    } 
} 

アップデートは10月19日

私はそれだけで小さな変更で動作するように取得することができました。

  1. がMyPageAdapterコンストラクタ内から取得するための呼び出しを追加し、あなたのMainActivityでgetDynamicTextSizeを追加します。

    public MyPageAdapter(Activity activity){ 
        datas = new ArrayList<>(); 
        this.activity = activity; 
        dynamicTextSize = ((MainActivity)activity).getDynamicTextSize(); 
    } 
    

これが作業をしますが、そこでは、それはあなたのために行うことはありませんいくつかのことです。

  1. あなたのフラグメントを常にMainActivityアクティビティの子であると結びつけると、インタフェースでこれを回避することはできますが、それでもかなりです。

  2. は、すぐにユーザーが新しいテキストサイズを選択すると現在の活動を更新しません。 mainActivityはメニューイベントを受け取るので、フラグメントがアクティブであること、テキスト設定が変更されたことを通知してからアダプタでnotifiyDataSetChangedを呼び出す必要があります。

  3. は、カスタムRecyclerViewの外にテキストのサイズを設定しません。リサイクラーの視点を使わない断片がいくつかあるのが分かります。これらは設定を取りません。メニューの設定は、アプリ内のすべてのテキストを変更する必要があると思わせるでしょう。

this postの回答は、アプリ全体のテキストサイズを調整するのに適しているようです。あなたのアプリのいくつかの変更は、あなたがそれを見たことをほとんど示しています。

+0

あなたの説明を通して私の方法を戦おうとしています。それがどうやって起こっているか知らせてください。ありがとう。 –

+0

私は絶対に失われています。私はあなたの指示に従おうとしましたが、私はどこでコードを実装すべきか分かりません。 –

+0

私はいくつかの詳細を追加しました。 –

関連する問題