#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 }