【问题标题】:SVG url images not being displayed in RecyclerViewSVG url 图像未显示在 RecyclerView 中
【发布时间】:2018-08-22 05:06:52
【问题描述】:

我有一些 url 字符串,一些以 .png 结尾,而另一些以 .svg 结尾。 .png 可以很好地加载到 recyclerview 中,但 .svg 却无处可见。我搜索了很多论坛,但目前还没有任何效果。

我的 recyclerviewadapter 的 onBindViewHolder 中有以下代码,用于确定 url 是否为 .svg。如果有人有任何想法,我将非常感激。

    String[] homeUrlSplit = mData.get(i).getHomeTeamBadge().split("\\.");

    String homeImageType = homeUrlSplit[homeUrlSplit.length-1];

    if(homeImageType.equals("svg")){
        // do something here
    }
    else {
        Glide
                .with(mContext)
                .load(mData.get(i).getHomeTeamBadge())
                .into(myViewHolder.homeTeamBadge);
    }

谢谢

编辑:我不太了解“可能重复”答案下的 cmets 中包含的解决方案。如果有人知道任何其他解决方案,或者能够用外行的方式解释这个特定的解决方案,我将非常感激。

这是适配器设置:

    RecyclerViewAdapterFixtures recyclerViewAdapterFixtures = new RecyclerViewAdapterFixtures(getContext(), matchesList, getActivity());
    recyclerViewFixtures.setLayoutManager(new LinearLayoutManager(getActivity()));
    recyclerViewFixtures.setAdapter(recyclerViewAdapterFixtures);

这里是recylerviewadapter代码

public class RecyclerViewAdapterFixtures extends RecyclerView.Adapter<RecyclerViewAdapterFixtures.MyViewHolder> {

Context mContext;
List<Match> mData;
Activity mActivity;

public RecyclerViewAdapterFixtures(Context mContext, List<Match> mData, Activity mActivity) {
    this.mContext = mContext;
    this.mData = mData;
    this.mActivity = mActivity;
}

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

    View v;
    v = LayoutInflater.from(mContext).inflate(R.layout.item_fixture, viewGroup, false);
    MyViewHolder vHolder = new MyViewHolder(v);

    return vHolder;
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, final int i) {

    myViewHolder.textViewHomeTeam.setText(mData.get(i).getHomeTeamName());

    String[] homeUrlSplit = mData.get(i).getHomeTeamBadge().split("\\.");

    String homeImageType = homeUrlSplit[homeUrlSplit.length-1];

    if(homeImageType.equals("svg")){

        SvgLoader.pluck()
                .with(mActivity)
                .setPlaceHolder(R.mipmap.ic_launcher, R.mipmap.ic_launcher)
                .load(mData.get(i).getHomeTeamBadge(), myViewHolder.homeTeamBadge);

    }
    else {
        Glide
                .with(mContext)
                .load(mData.get(i).getHomeTeamBadge())
                .into(myViewHolder.homeTeamBadge);
    }
}

@Override
public int getItemCount() {
    return mData.size();
}

public static class MyViewHolder extends RecyclerView.ViewHolder {

    private TextView textViewVersus;
    private EditText homeTeamScore;
    private EditText awayTeamScore;
    private TextView textViewHomeTeam;
    private TextView textViewAwayTeam;
    private ImageView homeTeamBadge;
    private ImageView awayTeamBadge;

    public MyViewHolder(@NonNull View itemView) {
        super(itemView);

        textViewVersus = (TextView) itemView.findViewById(R.id.textViewVersus);
        homeTeamScore = (EditText) itemView.findViewById(R.id.homeTeamScore);
        awayTeamScore = (EditText) itemView.findViewById(R.id.awayTeamScore);
        textViewHomeTeam = (TextView) itemView.findViewById(R.id.textViewHomeTeam);
        textViewAwayTeam = (TextView) itemView.findViewById(R.id.textViewAwayTeam);
        homeTeamBadge = (ImageView) itemView.findViewById(R.id.homeTeamBadge);
        awayTeamBadge = (ImageView) itemView.findViewById(R.id.awayTeamBadge);

    }
}

}

【问题讨论】:

标签: android svg


【解决方案1】:

把它放在你的 build.gradle 文件(应用程序级别)的依赖中:

implementation 'com.github.ar-android:AndroidSvgLoader:1.0.1'

在 build.gradle 项目级别你应该添加 maven { url 'https://jitpack.io' } 所以在大多数情况下它看起来像这样

allprojects {
  repositories {
    google()
    jcenter()
   maven { url 'https://jitpack.io' }
  }
 }

然后

String[] homeUrlSplit = mData.get(i).getHomeTeamBadge().split("\\.");

 String homeImageType = homeUrlSplit[homeUrlSplit.length - 1];

 if (homeImageType.equals("svg")) {
  SvgLoader.pluck()
   .with(mActivity) // ur activity
   .setPlaceHolder(R.mipmap.ic_launcher, R.mipmap.ic_launcher)//use ur place holder
   .load(mData.get(i).getHomeTeamBadge(), myViewHolder.homeTeamBadge);
 } else {
  Glide
   .with(mContext)
   .load(mData.get(i).getHomeTeamBadge())
   .into(myViewHolder.homeTeamBadge);
 }

如果你有,请从你的项目中删除 Glide 依赖项实现,因为 AndroidSVGLoader 已经有了它们

【讨论】:

  • 感谢您的回复。不幸的是,我在尝试同步 gradle 时遇到此错误:无法解决:com.github.ar-android:AndroidSvgLoader:1.0.1。编辑:通过将 maven { url 'jitpack.io' } 添加到存储库中来解决此问题
  • 是的,我刚刚编辑了解决方案,现在检查一下...您应该将 maven { url 'jitpack.io' } 添加到存储库中项目级别的 build.gradle
  • 所以我已经实现了你的方法,但是使用 .with(mContext) 会引发错误,因为参数需要是一个活动。已尝试使用 mActivity 但这会导致崩溃并出现错误:没有静态方法 buildStreamModelLoader(Ljava/lang/Class;Landroid/content/Context;)Lcom/bumptech/glide/load/model/ModelLoader;在 Lcom/bumptech/glide/Glide 类中;或其超类('com.bumptech.glide.Glide' 的声明出现在 /data/app/com.example.jackh.adivinar-1/split_lib_dependencies_apk.apk)
  • 您是通过活动中的构造函数分配 mContext 吗?如果是,那么请你给我看看你的适配器
  • 这就是票!非常感谢你,我真的很感激
猜你喜欢
  • 1970-01-01
  • 2017-11-18
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多