ОШИБКА - «Не удается разрешить контекст символа» при попытке загрузить изображения с помощью Glide в RecyclerView - PullRequest
0 голосов
/ 13 июня 2019

Я создал приложение для создания заметок с Room, ViewModel, LiveData и RecyclerView, используя это руководство .Все работает очень хорошо.Однако, когда я начал реализовывать возможность выбора изображения для каждой заметки, RecyclerView стал очень медленным и медленным, так как было добавлено больше заметок с изображениями.

После некоторых исследований я обнаружил, что с помощью загрузки изображенийфреймворки, такие как Glide и Picasso, могут ускорить загрузку.Итак, я попытался использовать Glide для загрузки изображений из Uri в элементы RecyclerView.

NoteAdapter.java

public class NoteAdapter extends ListAdapter<Note, NoteAdapter.NoteHolder> {

Context context;

public NoteAdapter() {
    super(DIFF_CALLBACK);
}

private static final DiffUtil.ItemCallback<Note> DIFF_CALLBACK = new DiffUtil.ItemCallback<Note>() {
    @Override
    public boolean areItemsTheSame(@NonNull Note note, @NonNull Note t1) {
        return note.getId() == t1.getId();
    }

    @Override
    public boolean areContentsTheSame(@NonNull Note note, @NonNull Note t1) {
        return note.getTitle().equals(t1.getTitle()) &&  note.getDescription().equals(t1.getDescription()) && note.getImageUri().equals(t1.getImageUri());
    }
};

private OnItemClickListener listener;

@NonNull
@Override
public NoteHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.note_item, viewGroup, false);
    return new NoteHolder(itemView);
}

@Override
public void onBindViewHolder(@NonNull NoteHolder noteHolder, int i) {
    Note currentNote = getItem(i);
    noteHolder.textViewTitle.setText(currentNote.getTitle());
    noteHolder.textViewDescription.setText(currentNote.getDescription());

    Glide.with(context)
            .load(Uri.parse(currentNote.getImageUri()))
            .fit()
            .centerCrop()
            .into(noteHolder.image);

}

public Note getNoteAt(int position) {
    return getItem(position);
}

class NoteHolder extends RecyclerView.ViewHolder {
    private TextView textViewTitle;
    private TextView textViewDescription;
    private ImageView image;

    public NoteHolder(@NonNull View itemView) {
        super(itemView);
        textViewTitle = itemView.findViewById(R.id.text_view_title);
        textViewDescription = itemView.findViewById(R.id.text_view_description);
        image = itemView.findViewById(R.id.image_view);

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int position = getAdapterPosition();

                if (listener != null && position != RecyclerView.NO_POSITION) {
                    listener.onItemClick(getItem(position));
                }
            }
        });
    }
}

public interface OnItemClickListener {
    void onItemClick(Note note);
}

public void setOnItemClickListener(OnItemClickListener listener) {
    this.listener = listener;
}

}

Однако Android Studio выдает мне следующую ошибку- Cannot resolve symbol 'context'.У меня вопрос, в каком контексте я должен передать этот аргумент?Кроме того, любые другие предложения, чтобы сделать RecyclerView быстрее при загрузке изображений, будет принята с благодарностью.Спасибо!

PS - Я не профессионал, а программирую только как хобби, поэтому прошу прощения за любые неправильно используемые термины.

1 Ответ

1 голос
/ 13 июня 2019

вам нужно определить глобальную переменную

 Context context ;

и изменить свой код на следующий:

public class NoteAdapter extends ListAdapter<Note, NoteAdapter.NoteHolder> {

....
Context context;
@NonNull
@Override
public NoteHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    context = viewGroup.getContext();
View itemView = LayoutInflater.from(context).inflate(R.layout.note_item, viewGroup, false);
    return new NoteHolder(itemView);
}

@Override
public void onBindViewHolder(@NonNull NoteHolder noteHolder, int i) {
    Note currentNote = getItem(i);
    noteHolder.textViewTitle.setText(currentNote.getTitle());
    noteHolder.textViewDescription.setText(currentNote.getDescription());

    Glide.with(context)
            .load(Uri.parse(currentNote.getImageUri()))
            .fit()
            .centerCrop()
            .into(noteHolder.image);

}

....

}
...