android - 在 Android 中从 json 中的 url 下载并显示图像

标签 android imageview

我正在尝试在回收者 View 中显示用户详细信息。

当我尝试显示我的图像时它不起作用。我已经尝试了所有的可能性。以下是我的适配器类。

 public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{
   private LinkedList<HashMap<String, Object>> myDataSet;
   Bitmap bitmap;
   MyAdapter.ViewHolder viewHolder;
   String image;

public MyAdapter(LinkedList<HashMap<String, Object>> values) {
    myDataSet = values;
}

public class ViewHolder extends RecyclerView.ViewHolder{

    public TextView userIdView;
    public TextView jobTitleNameView;
    public TextView employeeCodeView;
    public ImageView imageView;

    public ViewHolder(View itemView) {
        super(itemView);
        userIdView = (TextView)itemView.findViewById(R.id.userId);
        jobTitleNameView = (TextView)itemView.findViewById(R.id.jobTitleName);
        employeeCodeView = (TextView)itemView.findViewById(R.id.employeeCode);
    }
}

@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(
            parent.getContext());
    View v = inflater.inflate(R.layout.activity_listview, parent, false);
    viewHolder = new ViewHolder(v);
    return viewHolder;
}

@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
    final HashMap<String, Object> userDetails = myDataSet.get(position);
    String userId = (String) userDetails.get("userId");
    String jobTitleName = (String) userDetails.get("jobTitleName");
    String employeeCode = String.valueOf(userDetails.get("employeeCode"));
    image = (String) userDetails.get("image");

    ImageDownloader imageDownloader = new ImageDownloader();
    imageDownloader.execute(viewHolder);


    holder.userIdView.setText(userId);
    holder.jobTitleNameView.setText(jobTitleName);
    holder.employeeCodeView.setText(employeeCode);
}

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

这是这个类里面写的下载图片的类。

private class ImageDownloader extends AsyncTask<ViewHolder,ViewHolder,ViewHolder>{

    @Override
    protected ViewHolder doInBackground(ViewHolder... params) {
        viewHolder = params[0];

        URL url = null;
        try {
            url = new URL(image);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream inputStream = connection.getInputStream();
            bitmap = BitmapFactory.decodeStream(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return viewHolder;
    }

    @Override
    protected void onPostExecute(ViewHolder result){
        viewHolder.imageView.setImageBitmap(bitmap);
    }
   }
 }

谁能帮我解决这个问题......

请在下面找到日志

    03-24 16:27:48.421 19806-20764/com.example.rini.listviewandroid W/System.err: java.net.ConnectException: failed to connect to www.scri8e.com/208.87.227.250 (port 80): connect failed: ETIMEDOUT (Connection timed out)
    03-24 16:27:48.421 19806-20764/com.example.rini.listviewandroid W/System.err:     at libcore.io.IoBridge.connect(IoBridge.java:124)
    03-24 16:27:48.421 19806-20764/com.example.rini.listviewandroid W/System.err:     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
    03-24 16:27:48.421 19806-20764/com.example.rini.listviewandroid W/System.err:     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:456)
    03-24 16:27:48.421 19806-20764/com.example.rini.listviewandroid W/System.err:     at java.net.Socket.connect(Socket.java:882)
    03-24 16:27:48.421 19806-20764/com.example.rini.listviewandroid W/System.err:     at com.android.okhttp.internal.Platform.connectSocket(Platform.java:174)
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:     at com.android.okhttp.Connection.connect(Connection.java:152)
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:     at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:276)
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:     at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:     at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:382)
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:     at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:106)
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:     at com.example.rini.listviewandroid.MyAdapter$ImageDownloader.doInBackground(MyAdapter.java:94)
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:     at com.example.rini.listviewandroid.MyAdapter$ImageDownloader.doInBackground(MyAdapter.java:77)
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:292)
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:     at java.lang.Thread.run(Thread.java:818)
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err: Caused by: android.system.ErrnoException: connect failed: ETIMEDOUT (Connection timed out)
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:     at libcore.io.Posix.connect(Native Method)
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:111)
    03-24 16:27:48.423 19806-20764/com.example.rini.listviewandroid W/System.err:     at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
    03-24 16:27:48.423 19806-20764/com.example.rini.listviewandroid W/System.err:     at libcore.io.IoBridge.connect(IoBridge.java:122)
    03-24 16:27:48.423 19806-20764/com.example.rini.listviewandroid W/System.err:   ... 17 more

最佳答案

虽然这不是直接的解决方案,但我可以推荐使用像 Picasso 和 Glide 这样的库吗?它将显着减少代码行数。这里有一些库的链接

毕加索:http://square.github.io/picasso/

滑行:https://futurestud.io/blog/glide-getting-started

你的 onBindViewHolder 看起来像这样

@Override 
public void onBindViewHolder(ViewHolder holder, final int position) {
    final HashMap<String, Object> userDetails = myDataSet.get(position);
    String userId = (String) userDetails.get("userId");
    String jobTitleName = (String) userDetails.get("jobTitleName");
    String employeeCode =     String.valueOf(userDetails.get("employeeCode"));
    image = (String) userDetails.get("image");

    //With Picasso 
    Picasso.with(context).load(image).into(viewHolder.imageView);

    //With Glide 
    Glide.with(context).load(image).into(viewHolder.imageView);

    holder.userIdView.setText(userId);
    holder.jobTitleNameView.setText(jobTitleName);
    holder.employeeCodeView.setText(employeeCode);
} 

关于android - 在 Android 中从 json 中的 url 下载并显示图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36197011/

相关文章:

充当信标的 Android 设备

android - 如何防止 ListView 页脚被选中?

android - intent-filter不去Android系统

android - 将图像存储在服务器上以与 Android 应用程序一起使用的大小

Android:WakeLock 仅用于互联网连接?

如果单击上一项,Android PagerAdapter 不会报告正确的位置

android - 单击按钮更改 ImageView

java - setAlpha 动画后不恢复 alpha 值

android - 如何获取 View 在坐标中的位置?

android - LinearLayout中imageView的大小