在数组问题中存储来自 URL 的图像

Store Images from URL in Array issue

在我的项目中,我将可绘制图像存储在这样的数组中

 int[] mLocIds = new int[]{R.mipmap.ic_sticker_01, R.mipmap.ic_sticker_02, R.mipmap.ic_sticker_03,
        R.mipmap.ic_sticker_04, R.mipmap.ic_sticker_05, R.mipmap.ic_sticker_06, R.mipmap.ic_sticker_07,
        R.mipmap.ic_sticker_08};

这是我的数组:

   List<StickerView> mStickers = new ArrayList<>();

但我想显示来自 url 的图像(在数据库中获取 url),但我的 GalleryAdapter 允许 int 数组:

public class GalleryAdapter extends RecyclerView.Adapter<GalleryAdapter.ViewHolder> implements View.OnClickListener {

private int[] mResIds;
private int[] mLocIds;

public GalleryAdapter(int[] resIds) {
    this.mResIds = resIds;
}

private OnRecyclerViewItemClickListener mOnItemClickListener = null;

public interface OnRecyclerViewItemClickListener {
    void onItemClick(View view, int resId);
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_gallery, viewGroup, false);
    ViewHolder vh = new ViewHolder(view);
    view.setOnClickListener(this);
    return vh;
}

@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
    viewHolder.imageView.setImageResource(mResIds[position]);
    viewHolder.itemView.setTag(mResIds[position]);
}

@Override
public void onClick(View v) {
    if (mOnItemClickListener != null) {
        mOnItemClickListener.onItemClick(v, (Integer) v.getTag());
    }
}

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

@Override
public int getItemCount() {
    return mResIds.length;
}

public static class ViewHolder extends RecyclerView.ViewHolder {
    public ImageView imageView;

    public ViewHolder(View view) {
        super(view);
        imageView = (ImageView) view.findViewById(R.id.item_sticker);
    }
}


public void setData(int[] mLocIds) {
    this.mResIds = mLocIds;
    notifyDataSetChanged();
}

public void setDataStandart(int[] mResIds) {
    this.mResIds = mResIds;
    notifyDataSetChanged();
}

}

我找到了这个解决方案,但不清楚如何使用它:

 public void setBitmaps(Bitmap... bitmaps) {
    for (int i = 0; i < mImageViews.length; i++) {
        mImageViews[i].setImageBitmap(bitmaps[i]);
    }
}

我知道,我会更新我的 Activity 并首先下载位图,然后将位图存储在数组中,但我该怎么做呢? 感谢您的帮助。

您可以传递包含 url 的字符串数组,并使用任何图像加载程序库,例如 Glide, Picasso

这里有一个关于如何使用 glide 的例子:

Glide.with(context)
            .load(url)
            .centerCrop()
            .placeholder(R.drawable.placeholder)
            .into(viewHolder.imageView);

除此之外,您还需要更改适配器并使用 ArrayList 对其进行初始化。如果您在实施时遇到问题,请告诉我。

我自己解决了我的问题!这是参考:Futurestud.io

首先,我将我的 int[] 更改为 String[]

String[] mResIds = new String[]{"http://pngimg.com/upload/scratches_PNG6175.png","http://pngimg.com/upload/tiger_PNG549.png"};

然后在我的 GalleryAdapter 中更改如下:

public class GalleryAdapter extends RecyclerView.Adapter<GalleryAdapter.ViewHolder> implements View.OnClickListener {

    private String[] mResIds;

    public GalleryAdapter(String[] resIds) {


        this.mResIds = resIds;

    }

    private OnRecyclerViewItemClickListener mOnItemClickListener = null;

    public interface OnRecyclerViewItemClickListener {
        void onItemClick(View view, String resId);
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_gallery, viewGroup, false);
        ViewHolder vh = new ViewHolder(view);
        view.setOnClickListener(this);
        return vh;
    }

    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int position) {


    //    Uri uri = Uri.parse(String.valueOf(mResIds));
        Context context = viewHolder.imageView.getContext();
        Picasso.with(context)
                .load(mResIds[position])
                .into(viewHolder.imageView);


      //  viewHolder.imageView.setImageResource(mResIds[position]);
        viewHolder.itemView.setTag(mResIds[position]);
    }

    @Override
    public void onClick(View v) {
        if (mOnItemClickListener != null) {

            mOnItemClickListener.onItemClick(v, (String) v.getTag());
        }
    }

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

    @Override
    public int getItemCount() {
        return mResIds.length;
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public ImageView imageView;

        public ViewHolder(View view) {
            super(view);
            imageView = (ImageView) view.findViewById(R.id.item_sticker);
        }
    }


    public void setData(String[] mResIds) {
        this.mResIds = mResIds;
        notifyDataSetChanged();
    }

    public void setDataStandart(String[] mResIds) {
        this.mResIds = mResIds;
        notifyDataSetChanged();
    }


     }

然后将我的字符串转换为位图:

public static Bitmap getBitmapFromURL(String urlbit) {
    try {
        URL url = new URL(urlbit);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoInput(true);
        connection.connect();
        InputStream input = connection.getInputStream();
        Bitmap myBitmap = BitmapFactory.decodeStream(input);
        return myBitmap;
    } catch (IOException e) {
        // Log exception
        return null;
    }
}

我终于得到位图了:

Bitmap bitmap = getBitmapFromURL(resId);