【问题标题】:Will a passed viewmodel into a recyclerview adapter cause for memory leaks?将视图模型传递到 recyclerview 适配器会导致内存泄漏吗?
【发布时间】:2019-04-10 07:52:30
【问题描述】:

目前我正在尝试使用视图模型,并且想知道将视图模型传递给 recyclerview 适配器是否会导致内存泄漏?适配器中的视图模型的唯一目的是提供要在活动中显示的图像的新 url

我不知道接口是更好的方式还是有更好的方式从 recyclerview 接收 onclick 事件?

这是我的代码:

视图模型:

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();
}

}

谢谢,

伊恩

【问题讨论】:

    标签: android mvvm android-recyclerview viewmodel


    【解决方案1】:

    根据您发布的代码,我认为您应该没问题。但是,正如您所提到的,拥有一个接口可以帮助使事情更清晰,因为您可以将其传递给您的适配器,而不会暴露整个视图模型。

    看看这个 .setOnClickListener(view -&gt; viewModel.setMainImage(viewModel.getImageUrl(position))); 让我想知道您是否不能让视图模型知道已单击项目,因为您再次使用视图模型根据位置确定要作为参数传递的图像 url .

    因此,如果使用接口,您将拥有类似setOnClickListener(view -&gt; itemClickListener.itemClicked(position) 的内容。您的视图模型将实现此接口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-23
      • 2021-09-25
      • 2014-12-08
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      • 2011-06-16
      相关资源
      最近更新 更多