Сбой onBindViewHolder в setText с использованием RecyclerView

#android #android-recyclerview

#Android #android-recyclerview

Вопрос:

Я пытаюсь реализовать пользовательский RecyclerView.Адаптерное приложение, которое будет использоваться в фиктивном приложении / POC RecyclerView. Я использую этот учебник. Моя модель называется Movie и имеет два поля:

 @NonNull
@PrimaryKey
private String name;

@NonNull
private Integer releaseYear;
  

Итак, у меня есть этот класс

 MovieAdapter extends RecyclerView.Adapter<MovieAdapter.MyViewHolder>
  

переопределение onCreateViewHolder , onBindViewHolder и getItemCount и определение MyViewHolder extends RecyclerView.ViewHolder .

Когда строка отладки находится в последней строке onBindViewHolder:

 // Involves populating data into the item through holder
@Override
public void onBindViewHolder(@NonNull MyViewHolder viewHolder, int position) {
    // Get the data model based on position
    Movie movie = movies.get(position);

    // Set item views based on your views and data model
    TextView tvMovieName = viewHolder.tvMovieName;
    tvMovieName.setText(movie.getName());

    TextView tvMovieReleaseYear = viewHolder.tvMovieReleaseYear;
    tvMovieReleaseYear.setText(movie.getReleaseYear());
}
  

Я получаю

 Process: br.com.basicfeatures, PID: 2555
android.content.res.Resources$NotFoundException: String resource ID #0x7cf
    at android.content.res.Resources.getText(Resources.java:348)
    at android.widget.TextView.setText(TextView.java:5831)
    at br.com.basicfeatures.presentation.adapter.MovieAdapter.onBindViewHolder(MovieAdapter.java:45)
    at br.com.basicfeatures.presentation.adapter.MovieAdapter.onBindViewHolder(MovieAdapter.java:15)
  

Это MyViewHolder:

 protected class MyViewHolder extends RecyclerView.ViewHolder {
    private TextView tvMovieName;
    private TextView tvMovieReleaseYear;

    private MyViewHolder(@NonNull View itemView) {
        super(itemView);
        this.tvMovieName = itemView.findViewById(R.id.id_tv_movie_name);
        this.tvMovieReleaseYear = itemView.findViewById(R.id.id_tv_movie_release_year);
    }
}
  

Комментарии:

1. Очистите проект и правильно проверьте идентификатор textview.

Ответ №1:

Это связано с тем, что movie.getReleaseYear() возвращает целое число, поэтому tvMovieReleaseYear.setText пытается найти соответствующий файл ресурсов, который не существует. Итак, что вам нужно, так это привести movie.getReleaseYear() к строке

 tvMovieReleaseYear.setText(movie.getReleaseYear()   "");
  

Комментарии:

1. Оказывается, 7cf равен 1999 в шестнадцатеричном формате (я использую целочисленное значение). Теперь это имеет смысл

2. Да, надеюсь, мой ответ поможет 🙂

Ответ №2:

Преобразуйте значение из movie.getReleaseYear() в String .

  tvMovieReleaseYear.setText(String.valueOf(movie.getReleaseYear()));
  

Зачем это требуется?

Только 2 метода в, TextView которые принимают целое число в setText() и оба ожидают StringRes . Итак, когда вы пытаетесь установить integer, предполагается, что вы пытаетесь установить строку из String resource.

Итак, чтобы установить целое число с помощью setText() , вам нужно любым способом преобразовать его в строку.

Ниже приведены два метода, о которых я упоминал выше

 /**
5821     * Sets the text to be displayed using a string resource identifier.
5822     *
5823     * @param resid the resource identifier of the string resource to be displayed
5824     *
5825     * @see #setText(CharSequence)
5826     *
5827     * @attr ref android.R.styleable#TextView_text
5828     */
5829    @android.view.RemotableViewMethod
5830    public final void setText(@StringRes int resid) {
5831        setText(getContext().getResources().getText(resid));
5832        mTextSetFromXmlOrResourceId = true;
5833        mTextId = resid;
5834    }
5835
5836    /**
5837     * Sets the text to be displayed using a string resource identifier and the
5838     * {@link android.widget.TextView.BufferType}.
5839     * <p/>
5840     * When required, TextView will use {@link android.text.Spannable.Factory} to create final or
5841     * intermediate {@link Spannable Spannables}. Likewise it will use
5842     * {@link android.text.Editable.Factory} to create final or intermediate
5843     * {@link Editable Editables}.
5844     *
5845     * @param resid the resource identifier of the string resource to be displayed
5846     * @param type a {@link android.widget.TextView.BufferType} which defines whether the text is
5847     *              stored as a static text, styleable/spannable text, or editable text
5848     *
5849     * @see #setText(int)
5850     * @see #setText(CharSequence)
5851     * @see android.widget.TextView.BufferType
5852     * @see #setSpannableFactory(Spannable.Factory)
5853     * @see #setEditableFactory(Editable.Factory)
5854     *
5855     * @attr ref android.R.styleable#TextView_text
5856     * @attr ref android.R.styleable#TextView_bufferType
5857     */
5858    public final void setText(@StringRes int resid, BufferType type) {
5859        setText(getContext().getResources().getText(resid), type);
5860        mTextSetFromXmlOrResourceId = true;
5861        mTextId = resid;
5862    }