【问题标题】:How to show images to RecycleView using Glide?如何使用 Glide 向 RecyclerView 显示图像?
【发布时间】:2018-01-31 08:00:34
【问题描述】:

我有用于图像的 Sqlite 数据库,但它只存储 URL,我希望 glide 处理该 URL 以显示图像,

案例:我需要使用 glide 显示图像 url 从 sqlite 到 recycleview。

我之所以使用此代码,是因为它让我想到的不仅仅是将数据从字节解析为图像或其他任何内容。

请帮忙,现在我收到错误“Java.lang.nullPointerException”

public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ListViewHolder> {

    private Context mContext;

    private List<Produk> listList = new ArrayList<>();

    public ListAdapter(List<Produk> listList){

        this.listList = listList;
        this.mContext = mContext;
    }

    @Override
    public ListAdapter.ListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_list ,parent, false);

        ListViewHolder ListViewHolder = new ListViewHolder(view);
        return ListViewHolder;
    }

    @Override
    public void onBindViewHolder(ListAdapter.ListViewHolder holder, int position) {

        holder.txt_rKode.setText((listList.get(position).getKd_produk()));
        holder.txt_rNama.setText(listList.get(position).getNama_produk());
        holder.txt_rMerk.setText(listList.get(position).getMerk_produk());
        holder.txt_rJenis.setText(listList.get(position).getJenis_produk());
        holder.txt_rVariasi.setText(listList.get(position).getVariasi_produk());
        holder.txt_rFoto2.setText(listList.get(position).getFoto_produk());

        String currentUrl = listList.get(position).getFoto_produk();

        Glide.with(mContext)
                .load(currentUrl)
                .into(holder.iv_rFoto);




    }

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

    public Produk getItem(int Position) {
        return listList.get(Position);
    }

错误日志

这是错误日志。

01-31 14:49:58.795 12577-12577/? E/AndroidRuntime: FATAL EXCEPTION: main
   Process: ptacs.ekatalog.com.e_katalogproduk, PID: 12577
   java.lang.NullPointerException: You cannot start a load on a not yet attached View or a Fragment where getActivity() returns null (which usually occurs when getActivity() is called before the Fragment is attached or after the Fragment is destroyed).
       at com.bumptech.glide.util.Preconditions.checkNotNull(Preconditions.java:31)
       at com.bumptech.glide.Glide.getRetriever(Glide.java:665)
       at com.bumptech.glide.Glide.with(Glide.java:697)
       at ptacs.ekatalog.com.e_katalogproduk.adapter.ListAdapter.onBindViewHolder(ListAdapter.java:56)
       at ptacs.ekatalog.com.e_katalogproduk.adapter.ListAdapter.onBindViewHolder(ListAdapter.java:23)
       at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6482)
       at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6515)
       at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5458)
       at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5724)
       at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5563)
       at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5559)
       at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2229)
       at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1556)
       at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1516)
       at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:608)
       at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3693)
       at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3410)
       at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3962)
       at android.view.View.layout(View.java:15604)
       at android.view.ViewGroup.layout(ViewGroup.java:4968)
       at android.support.v4.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:610)
       at android.view.View.layout(View.java:15604)
       at android.view.ViewGroup.layout(ViewGroup.java:4968)
       at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
       at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
       at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
       at android.view.View.layout(View.java:15604)
       at android.view.ViewGroup.layout(ViewGroup.java:4968)
       at android.support.design.widget.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:132)
       at android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42)
       at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1361)
       at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:869)
       at android.view.View.layout(View.java:15604)
       at android.view.ViewGroup.layout(ViewGroup.java:4968)
       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
       at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
       at android.view.View.layout(View.java:15604)
       at android.view.ViewGroup.layout(ViewGroup.java:4968)
       at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
       at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
       at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
       at android.view.View.layout(View.java:15604)
       at android.view.ViewGroup.layout(ViewGroup.java:4968)
       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
       at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
       at android.view.View.layout(View.java:15604)
       at android.view.ViewGroup.layout(ViewGroup.java:4968)
       at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
       at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
       at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
       at android.view.View.layout(View.java:15604)
    at android.view.View

【问题讨论】:

  • 请同时发布错误日志
  • 请发布您的堆栈跟踪
  • 完成了,你能解释一下这个错误吗?
  • 您的上下文为空。您不会将上下文传递给您的适配器
  • 请在此处添加您的图片网址活动或片段

标签: java android sqlite android-recyclerview android-glide


【解决方案1】:

我觉得this.mContext = mContext;有问题,可能mContextnull,所以你可以这样写

public ListAdapter(List<Produk> listList,Context mContext){
        this.listList = listList;
        this.mContext = mContext;
    }

确认mContext

【讨论】:

  • 它给了我新的错误,在activity_list.xml error: constructor ListAdapter in class ListAdapter cannot be applied to given types; required: List&lt;Produk&gt;,Context found: List&lt;Produk&gt; reason: actual and formal argument lists differ in length
  • @MostoDani,这是因为您必须将上下文作为第二个参数传递,正如方法中声明的那样。
  • 你需要从外部传递context,就像这个new ListAdapter(list,this)new ListAdapter(list,getActivity())决定你是在activity还是fragment。你可以试试。希望对你有帮助。
【解决方案2】:

首先在您的onCreateViewHolder 中,修复此行:

ListViewHolder ListViewHolder = new ListViewHolder(view);
return ListViewHolder;

到:

return new ListViewHolder(view);

然后在onBindViewHolder 中获取如下URI:

String currentUrl = listList.get(position).getFoto_produk();

Uri uri = Uri.Parse(currentUrl);

Glide.with(mContext).load(uri).into(holder.iv_rFoto);

希望对您有所帮助,同时检查您的 getFoto_produk 字符串值是否正确。 在将 Adapter 设置为 recyclerview 之前,您需要确定此字符串的值

【讨论】:

  • 是的,伙计,这是错误的:ListViewHolder ListViewHolder = new ListViewHolder(view);
  • 它没有做任何改变,同样的错误。我已经用 Txt_rFoto 检查了字符串输出,它显示了 url 并禁用了 Imageview 。在初始化 Imageview 后应用崩溃并返回父活动
  • 好的,问题出在你的片段中。检查您是否在片段中的“视图”之前使用了“getActivity()”
  • 你知道吗,也上传你的片段。如果找不到问题
  • 我没有使用片段。
【解决方案3】:

你可以试试下面的代码滑行。

//Glide to load images from url 
if(currentUrl!=null) { 

    //Check whether the url is null   
    Glide.with(mContext)
        .load(currentUrl)//Pass url to be appended
        .asBitmap()
        .fitCenter()
        .diskCacheStrategy(DiskCacheStrategy.SOURCE)
        .placeholder(ContextCompat.getDrawable(mContext, R.drawable.ic_dummy_user))
        .error(ContextCompat.getDrawable(mContext, R.drawable.ic_dummy_user))
        .into(new SimpleTarget<Bitmap>() {

            @Override
            public void onResourceReady(Bitmap bitmapp, GlideAnimation<? super Bitmap> glideAnimation) {
                mMarkerImageView.setImageBitmap(bitmap);
            }
        });
}

【讨论】:

  • 复制粘贴别人的答案时尝试编辑 cmets
【解决方案4】:

由于您的 mContext 为空,您需要将您的上下文传递给 Adapter 类 通常适配器类是纯java类没有上下文。

每当您调用 Adapter 时,您必须从 Fragment 或 Activity 传递您的上下文。

首先,在你的适配器中这样初始化。

public ListAdapter(List<Produk> listList, Context mContext){
    this.listList = listList;
    this.mContext = mContext;
}

如果你从 Fragment 调用适配器然后这样做

ListAdapter listAdapter = new ListAdapter(listList, getActivity());

如果你从活动中调用适配器,那么就这样做

ListAdapter listAdapter = new ListAdapter(listList, YourActivity.this);

祝你好运,请告诉我。

【讨论】:

  • 不是崩溃,而是新问题:D。 大小为 [250x250] 类 java 的 www.ellenmacarthurfoundation.org/assets/images/ce100/Phillips-logo.jpg 加载失败.io.FileNotFoundException(/www.ellenmacarthurfoundation.org/assets/images/ce100/Phillips-logo.jpg:打开失败:ENOENT(没有这样的文件或目录))
  • 我没有收到您的请发布详细信息,附上错误日志。我认为上下文问题现在解决了您面临的另一个问题,然后正确发布您的问题。
  • 请先使用测试图片网址进行测试,首先使用这个 [gstatic.com/webp/gallery/1.jpg]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
  • 2020-04-25
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多