web-dev-qa-db-ja.com

リサイクラービューのonBindViewHolder()メソッド内でgetString()を呼び出すにはどうすればよいですか?

環境

特定の日の天気予報情報を表示するRecyclerAdapterを作成しています。私のRecyclerViewには複数の日が含まれており、それぞれがonBindViewHolderで変更されています。

毎日のレイアウトには3つのテキストビューがあります。最初のものには、要約である文字列が含まれています。 2つ目は、低温を表す位置引数としてdoubleを含む文字列を含みます。 3番目は2番目と同じですが、高温を表します。

以下は私のonBindViewHolderメソッドのコードです:

_@Override
public void onBindViewHolder(@NonNull DailyForecastAdapter.ViewHolder viewHolder, int i) {

    Datum datum = forecast.get(i);

    TextView summary = viewHolder.summaryTextView;
    TextView tempHigh = viewHolder.tempHighTextView;
    TextView tempLow = viewHolder.tempLowTextView;

    summary.setText(datum.getSummary());
    tempHigh.setText(datum.getTemperatureHigh());
    tempLow.setText(datum.getTemperatureLow());
}
_

問題

高温と低温はdoublesなので、文字列をdouble値だけで上書きしないように、それに応じて文字列をフォーマットする必要があります。高温と低温の文字列リソースは次のとおりです。

_<string name="temperature_high">High of %1$.2f</string>
<string name="temperature_low">Low of %1$.2f</string>
_

RecyclerAdapterクラスの外では、これを行う方法を知っています以下は、フラグメント内の文字列をフォーマットする方法の例です。

_ String moddedString = String.format(getString(R.string.temperature), temp);
 ((TextView)activity.findViewById(R.id.temperatureDisplay)).setText(moddedString);
_

ただし、RecyclerAdapter内のgetString()関数にアクセスできないので、文字列をdoubleで完全にオーバーライドせずに、必要な温度を挿入するために文字列を適切にフォーマットすることはできません。 。

質問

getString()メソッド内でonBindViewHolder()を使用するにはどうすればよいですか?

7
isakbob

OnBindViewHolder()メソッド内でgetString()を使用するにはどうすればよいですか?

すべてのViewHolderインスタンスにはitemViewフィールドがあります。これはViewのインスタンスです。すべてのViewインスタンスにはgetContext()メソッドがあります。これを使用してリソースにアクセスできます。

String text = viewHolder.itemView.getContext().getString(R.string.mystring);
12
Ben P.

コンテキストを使用して文字列リソースを取得できます。

  context.getString(R.string.temperature)
1
Ramesh Yankati

RecyclerViewAdapterクラスのコンストラクターを使用して、Contextのローカルコピーを保存できます。

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


    private Context context;


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


    @Override
    public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
        String string = context.getString(R.string.your_string);
    }