从网络请求的一张图片放到ListView中,大佬们帮帮我啊!!!

weixin_45620867 2019-12-02 07:50:29
我就想做一个每输入一个图片网址,然后ListView就展示该图片,然后在异步请求的doInBackground中的Bitmap有值,但是到onPostExecute中赋值的时候就为空,以下是截图和全部代码,一个MyAdapter和Main


package com.example.helloworld.AppTest.test2;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.example.helloworld.R;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class main extends AppCompatActivity {
private static String URL="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1573652524957&di=bcc7c99a99cd075ed1846be02f3aa636&imgtype=0&src=http%3A%2F%2Fimage2.sina.com.cn%2Fent%2Fd%2F2005-06-21%2FU105P28T3D758541F326DT20050621155848.jpg";
private ListView lv;
private List<HashMap<String,Object>> list_data=new ArrayList<>();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.apptest_main);
Bitmap bitmap=null;
lv=findViewById(R.id.lv);
MyAsyncTask myAsyncTask=new MyAsyncTask(bitmap);
myAsyncTask.execute(URL);

HashMap<String,Object> map=new HashMap<>();
map.put("image",bitmap);
list_data.add(map);

myadapter2 myadapter2=new myadapter2(this,list_data);
lv.setAdapter(myadapter2);
}

class MyAsyncTask extends AsyncTask<String,Void, Bitmap>{
private Bitmap bp=null;
public MyAsyncTask(Bitmap bitmap) {
bp=bitmap;
}

@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
bp=bitmap;
}

@Override
protected Bitmap doInBackground(String... strings) {

String URL=strings[0];
Bitmap bitmap=null;
HttpURLConnection conn=null;
InputStream is=null;
try {
URL url=new URL(URL);
conn= (HttpURLConnection) url.openConnection();
is=conn.getInputStream();
bitmap= BitmapFactory.decodeStream(is);
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if (is!=null)
is.close();
conn.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
return bitmap;
}
}
}
package com.example.helloworld.AppTest.test2;

import android.content.Context;
import android.graphics.Bitmap;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;

import com.example.helloworld.R;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class myadapter2 extends BaseAdapter {

List<HashMap<String,Object>> list;
LayoutInflater inflater;

public myadapter2(Context context,List<HashMap<String, Object>> list) {
inflater=LayoutInflater.from(context);
this.list = list;
}

@Override
public int getCount() {
return list.size();
}

@Override
public Object getItem(int i) {
return list.get(i);
}

@Override
public long getItemId(int i) {
return i;
}

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder viewHolder;
if (view==null){
view=inflater.inflate(R.layout.apptest_item,null);
viewHolder=new ViewHolder();
viewHolder.imageView=view.findViewById(R.id.iv_test);
view.setTag(viewHolder);
}
else {
viewHolder= (ViewHolder) view.getTag();
}
viewHolder.imageView.setImageResource(R.mipmap.ic_launcher);
viewHolder.imageView.setImageBitmap((Bitmap) list.get(i).get("image"));

return view;
}
static class ViewHolder{
public ImageView imageView;
}

}
...全文
202 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
m-oj 应用层 2019-12-03
  • 打赏
  • 举报
回复
要看一下是不是发生异常走到catch块里了
weixin_45620867 2019-12-03
  • 打赏
  • 举报
回复
引用 10 楼 Jason_Tian23 的回复:
给你贴给全的吧,另:类名要遵循大驼峰命名规则,数据可以直接用List<Bitmap>没必要List<HashMap<String, Object>>

public class MainActivity extends AppCompatActivity {
    public static String URL = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1573652524957&di=bcc7c99a99cd075ed1846be02f3aa636&imgtype=0&src=http%3A%2F%2Fimage2.sina.com.cn%2Fent%2Fd%2F2005-06-21%2FU105P28T3D758541F326DT20050621155848.jpg";
    private ListView lv;
    private List<HashMap<String, Object>> list_data = new ArrayList<>();
    private MyAdapter mMyAdapter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.apptest_main);
        Bitmap bitmap = null;
        lv = findViewById(R.id.lv);
        new MyAsyncTask().execute();
    }

    class MyAsyncTask extends AsyncTask<Void, Void, Bitmap> {

        public MyAsyncTask() {
        }

        @Override
        protected Bitmap doInBackground(Void... voids) {
            Bitmap bitmap = null;
            HttpURLConnection conn = null;
            InputStream is = null;
            try {
                java.net.URL url = new URL(URL);
                conn = (HttpURLConnection) url.openConnection();
                is = conn.getInputStream();
                bitmap = BitmapFactory.decodeStream(is);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (is != null) {
                        is.close();
                    }
                    conn.disconnect();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return bitmap;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            Log.d(TAG, "bitmap=" + bitmap);
            HashMap<String, Object> map = new HashMap<>();
            map.put("image", bitmap);
            list_data.add(map);

            mMyAdapter = new MyAdapter(this, list_data);
            lv.setAdapter(mMyAdapter);
        }

    }
}
已经解决了,非常感谢
HL_GT 2019-12-03
  • 打赏
  • 举报
回复
在子布局中添加显示图片的控件
Jason_Tian23 2019-12-03
  • 打赏
  • 举报
回复
给你贴给全的吧,另:类名要遵循大驼峰命名规则,数据可以直接用List<Bitmap>没必要List<HashMap<String, Object>>

public class MainActivity extends AppCompatActivity {
    public static String URL = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1573652524957&di=bcc7c99a99cd075ed1846be02f3aa636&imgtype=0&src=http%3A%2F%2Fimage2.sina.com.cn%2Fent%2Fd%2F2005-06-21%2FU105P28T3D758541F326DT20050621155848.jpg";
    private ListView lv;
    private List<HashMap<String, Object>> list_data = new ArrayList<>();
    private MyAdapter mMyAdapter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.apptest_main);
        Bitmap bitmap = null;
        lv = findViewById(R.id.lv);
        new MyAsyncTask().execute();
    }

    class MyAsyncTask extends AsyncTask<Void, Void, Bitmap> {

        public MyAsyncTask() {
        }

        @Override
        protected Bitmap doInBackground(Void... voids) {
            Bitmap bitmap = null;
            HttpURLConnection conn = null;
            InputStream is = null;
            try {
                java.net.URL url = new URL(URL);
                conn = (HttpURLConnection) url.openConnection();
                is = conn.getInputStream();
                bitmap = BitmapFactory.decodeStream(is);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (is != null) {
                        is.close();
                    }
                    conn.disconnect();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return bitmap;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            Log.d(TAG, "bitmap=" + bitmap);
            HashMap<String, Object> map = new HashMap<>();
            map.put("image", bitmap);
            list_data.add(map);

            mMyAdapter = new MyAdapter(this, list_data);
            lv.setAdapter(mMyAdapter);
        }

    }
}
Jason_Tian23 2019-12-03
  • 打赏
  • 举报
回复
list_data.add(map);后面listview没有刷新数据啊。。。 后面加上

myadapter2 myadapter2 = new myadapter2(this,list_data);
lv.setAdapter(myadapter2);
oncreate里的这两行code去掉
weixin_45620867 2019-12-03
  • 打赏
  • 举报
回复
引用 7 楼 Jason_Tian23 的回复:
oncreate的去给listView添加数据,但这时网络请求没有请求完成,所以listview里bitmap始终为null,解决方法:

        HashMap<String,Object> map=new HashMap<>();
        map.put("image",bitmap);
        list_data.add(map);
 
        myadapter2 myadapter2=new myadapter2(this,list_data);
        lv.setAdapter(myadapter2);
把这块放在onPostExecute里,不需要bp变量了;或者在onPostExecute里添加数据再notifyDataSetChanged 另外建议直接学习RecyclerView,listview过时了
是这样吗??可是还是不行啊,会不会是adapter写得有问题,我是新手这学期才开始学Android。。我想慢慢来。。。
Jason_Tian23 2019-12-03
  • 打赏
  • 举报
回复
oncreate的去给listView添加数据,但这时网络请求没有请求完成,所以listview里bitmap始终为null,解决方法:

        HashMap<String,Object> map=new HashMap<>();
        map.put("image",bitmap);
        list_data.add(map);
 
        myadapter2 myadapter2=new myadapter2(this,list_data);
        lv.setAdapter(myadapter2);
把这块放在onPostExecute里,不需要bp变量了;或者在onPostExecute里添加数据再notifyDataSetChanged 另外建议直接学习RecyclerView,listview过时了
weixin_45620867 2019-12-03
  • 打赏
  • 举报
回复
引用 4 楼 LightLi4869 的回复:
protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); bp=bitmap; } 这个并不会把获取到的bitmap的内容给到oncreate里面的bitmap。了解下参数引用
那我该怎么给oncreate里面的bitmap赋值?
weixin_45620867 2019-12-03
  • 打赏
  • 举报
回复
引用 3 楼 滚,我爱编程, 的回复:
 Bitmap bitmap=null;         lv=findViewById(R.id.lv);         MyAsyncTask myAsyncTask=new MyAsyncTask(bitmap);         myAsyncTask.execute(URL); bitmap 你放在局部了,就是下载了, MyAsyncTask 这个里面的 bitmap 你把值赋哪里了, 还有这个不要自己写下载了,网上一堆 ImageLoader,Picasso,Glide 不香吗
MyAsyncTask myAsyncTask=new MyAsyncTask(bitmap);我在这把bitmap传进去,然后在onPostExecute里传值了,还是因为我写的不对吗?然后我是这学期才学的Android,新手菜鸟。。你说得这些我上网看又要什么添加包什么的不会啊。。。我想先用我这个方法这样能做出来吗
LightLi4869 2019-12-03
  • 打赏
  • 举报
回复
protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); bp=bitmap; } 这个并不会把获取到的bitmap的内容给到oncreate里面的bitmap。了解下参数引用
  • 打赏
  • 举报
回复
 Bitmap bitmap=null;
        lv=findViewById(R.id.lv);
        MyAsyncTask myAsyncTask=new MyAsyncTask(bitmap);
        myAsyncTask.execute(URL);

bitmap 你放在局部了,就是下载了, MyAsyncTask 这个里面的 bitmap 你把值赋哪里了,

还有这个不要自己写下载了,网上一堆 ImageLoader,Picasso,Glide 不香吗
weixin_45620867 2019-12-03
  • 打赏
  • 举报
回复
引用 1 楼 m-oj 的回复:
要看一下是不是发生异常走到catch块里了
运行起来没错,就是ListView中什么都没有,应该是我上面DeBug那。那个Bitmap没有赋值成功,赋值过去值为null。。

80,337

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧