Будет ли передаваемая модель представления в адаптер повторного просмотра вызвать утечки памяти? - PullRequest
0 голосов
/ 07 ноября 2018

В настоящее время я экспериментирую с моделями представления, и мне было интересно, не вызовет ли передача модели представления адаптеру вьюблера утечку памяти? Единственная цель модели представления в адаптере - дать новый URL-адрес изображения для отображения в упражнении

Я понятия не имею, является ли интерфейс лучшим способом или есть лучший способ получать события onclick из переработчика?

вот мой код:

ViewModel:

public class WallDetailViewModel extends AndroidViewModel {
private final String apiAddress = "*";
private BlindWall detailWall;
private MutableLiveData<String> mainImageUrl;

public WallDetailViewModel(@NonNull Application application) {
    super(application);
}

public LiveData<String> getMainImageUrl() {
    if(mainImageUrl == null) {
        mainImageUrl = new MutableLiveData<>();
        mainImageUrl.postValue(getImageUrl(0));
    }
    return mainImageUrl;
}

public void setWall(BlindWall wall) {
    detailWall = wall;
}

public String getImageUrl(int position) {
    String returnValue = null;
    if(position >= 0 && position < detailWall.getImagesUrls().size()) {
        returnValue = apiAddress + detailWall.getImagesUrls().get(position);
    }
    return returnValue;
}

public String getWallName() {
    return detailWall.getTitle();
}

public String getDutchDescription() {
    return detailWall.getDescriptionDutch();
}

public String getEnglishDescription() {
    return detailWall.getDescriptionEnglish();
}

public int getImageUrlSize() {
    return detailWall.getImagesUrls().size();
}

public void setMainImage(String url) {
    mainImageUrl.postValue(url);
}

}

Адаптер:

public class ImageSliderAdapter extends RecyclerView.Adapter<ImageSliderAdapter.ViewHolder2> {
private WallDetailViewModel viewModel;

public ImageSliderAdapter(WallDetailViewModel viewModel) {
    this.viewModel = viewModel;
}

public static class ViewHolder2 extends RecyclerView.ViewHolder {
    public ImageView WallFrontPaper;

    public ViewHolder2(View itemView) {
        super(itemView);
        WallFrontPaper = itemView.findViewById(R.id.ImageItem);
    }
}

@Override
public ViewHolder2 onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    View v = inflater.inflate(R.layout.imageslider_item, parent, false);

    return new ViewHolder2(v);
}

@Override
public void onBindViewHolder(ViewHolder2 holder, int position) {
    Picasso.with(holder.itemView.getContext()).load(viewModel.getImageUrl(position)).fit().centerCrop().into(holder.WallFrontPaper);
    holder.WallFrontPaper.setOnClickListener(view -> viewModel.setMainImage(viewModel.getImageUrl(position)));
}

@Override
public int getItemCount() {
    return viewModel.getImageUrlSize();
}

}

Спасибо,

Ian

1 Ответ

0 голосов
/ 07 ноября 2018

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

Глядя на этот бит .setOnClickListener(view -> viewModel.setMainImage(viewModel.getImageUrl(position))); заставляет задуматься, не можете ли вы просто передать, сообщите модели представления, что элемент был нажат, поскольку вы снова используете модель представления, чтобы выяснить, какой URL-адрес изображения должен передаваться в качестве аргумента, на основе позиции .

Итак, если вы используете интерфейс, у вас будет что-то вроде setOnClickListener(view -> itemClickListener.itemClicked(position). Ваша модель представления будет реализовывать этот интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...