【问题标题】:Store Images from URL in Array issue在数组问题中存储来自 URL 的图像
【发布时间】:2016-06-24 13:54:44
【问题描述】:

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

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

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

【问题讨论】:

    标签: android arrays android-arrayadapter


    【解决方案1】:

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

    这是一个如何使用滑翔的例子:

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

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

    【讨论】:

    • 感谢您的回答,但我必须使用 GalleryAdapter,因为在我的应用程序中,它将贴纸存储在 recycler_view 中,当我选择其中一个时,它会在图片上按下贴纸。所以如果我使用你的方式,我可以全部制作吗?
    • 是的,无论如何我的回答不是关于适配器和视图,而是关于用于加载图像的图像加载库,因此对于任何类型的视图,如果您需要加载图像,您可以使用这些。
    【解决方案2】:

    我自己的问题解决了!这是参考: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);
    

    【讨论】:

      猜你喜欢
      • 2016-06-12
      • 2017-02-15
      • 1970-01-01
      • 2020-04-16
      • 2020-05-31
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-01
      相关资源
      最近更新 更多