18、ListView显示图片
程序员文章站
2022-03-11 10:53:16
...
ListView显示图片(只有文字显得很傻),很多了,效果图就不找了,这里主要是网络图片,利用上节网络图片获取的类。
先定义了一个类,ModelList,主要是存放ListView Item中的一些信息,比如用户名、标题、内容、预览图片的网络链接等。新建的包model下:
ListView的Adapter,ListAdapter中:
获取图片的回掉监听器
附上获取设备屏幕大小的类tool/DeviceInfo
initDeviceInfo初始化函数在MainActivity的onCreate中调用即可,不贴了。
设置数据测试,在ListFragment中刷新回掉中
比较简单,刷新之后加入固定的数据(应该从网络上获取数据的,现在后台还没有写好),效果:
注:并没有长图加载、GIF播放的按钮
先定义了一个类,ModelList,主要是存放ListView Item中的一些信息,比如用户名、标题、内容、预览图片的网络链接等。新建的包model下:
public class ModelList { public String type; //数据类型,先忽略 public String icon; //头像链接 public String name; //用户名 public String time; //时间 public String title; //标题 public String data; //内容 public String preurl; //预览图片链接 public int width; //宽 public int height; //高 public String dataurl; //数据链接,先忽略 public String read; //阅读次数 }
ListView的Adapter,ListAdapter中:
public class ListAdapter extends BaseAdapter { private Activity activity; //之前有定义,获取布局时用 private List<ModelList> datas; //一个列表,存放Item数据 private ImageLoad imgload; //网络图片加载 private LmageLoad lmgload; //忽略 private GifLoad gifload; //忽略 private int itemwidth; //Item的宽度,保证图片横向铺满 public ListAdapter(Activity activity,QListView listview){ this.activity=activity; //构造传进来一个Activity itemwidth=(int)(DeviceInfo.width-activity.getResources().getDimension(R.dimen.padding_s)*2); imgload=new ImageLoad(activity); lmgload=new LmageLoad(activity); gifload=new GifLoad(activity); datas=new ArrayList<ModelList>(); //传进来一个ListView,想不出其他好的办法,先忽略 listview.setQRecyclerListener(rclistener); } //自己添加 一个函数,用于设定数据 public void setData(List<ModelList> datas){ this.datas=datas; this.notifyDataSetChanged();//数据更新 } //自己添加 一个函数,用于添加数据 public void addData(List<ModelList> datas){ this.datas.addAll(datas); this.notifyDataSetChanged(); } //自己添加 一个函数,用于添加数据 public void addData(ModelList data){ this.datas.add(data); this.notifyDataSetChanged(); } @Override public int getCount() { // TODO Auto-generated method stub return datas.size();//返回datas的大小 } … } getView中: public View getView(final int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub final Holder holder; if(convertView==null){ convertView=activity.getLayoutInflater().inflate( R.layout.item_list, parent, false); holder=new Holder(); convertView.setTag(holder); } else{ holder=(Holder)convertView.getTag(); } //获取控件 holder.iv_icon=(ImageView)convertView.findViewById(R.id.iv_icon); holder.tv_name=(TextView)convertView.findViewById(R.id.tv_name); holder.tv_time=(TextView)convertView.findViewById(R.id.tv_time); holder.tv_title=(TextView)convertView.findViewById(R.id.tv_title); holder.tv_data=(TextView)convertView.findViewById(R.id.tv_data); holder.rl_data=(RelativeLayout)convertView.findViewById(R.id.rl_data); holder.tv_read=(TextView)convertView.findViewById(R.id.tv_read); //根据当前位置获取数据 final ModelList data=datas.get(position); //获取Item数据 //父类和TAG在获取图片的时候要用 final View viewparent=convertView; final int tagpre=position+1; final int tagdata=-(position+1); final int tagctrllmg=tagpre-1;//=position final int tagctrlgif=tagdata+1;//=position final int tagloadlmg=tagpre+1;//=position+2 final int tagloadgif=tagdata-1;//-(position+2) //设置相应内容 holder.tv_name.setText(data.name); holder.tv_time.setText(data.time); holder.tv_title.setText(data.title); if(data.data!=null){//有,设置显示 holder.tv_data.setText(data.data); holder.tv_data.setVisibility(View.VISIBLE); } else{//无,隐藏 holder.tv_data.setVisibility(View.GONE); } if("txt".equals(data.type)){//仅有文字,隐藏下面的布局 holder.rl_data.setVisibility(View.GONE); } else if("lmg".equals(data.type)){//长图 LayoutParams lp=holder.rl_data.getLayoutParams(); lp.height=itemwidth*data.height/data.width; holder.rl_data.setLayoutParams(lp);//设置高度,防止图片变形 holder.rl_data.setTag(tagpre); Drawable pre=imgload.loadImage(viewparent,tagpre,data.preurl,ilcallback); holder.rl_data.setBackground(pre); holder.rl_data.setVisibility(View.VISIBLE); //获取并设置图片 } else{ LayoutParams lp=holder.rl_data.getLayoutParams(); lp.height=itemwidth*data.height/data.width; holder.rl_data.setLayoutParams(lp); holder.rl_data.setTag(tagpre); Drawable pre=imgload.loadImage(viewparent,tagpre,data.preurl,ilcallback); holder.rl_data.setBackground(pre); holder.rl_data.setVisibility(View.VISIBLE); //获取并设置图片,不用怀疑,和上面的一样 if("gif".equals(data.type)){ } else if("vdo".equals(data.type)){ } } holder.tv_read.setText(data.read); return convertView; }
获取图片的回掉监听器
private ImageLoadCallback ilcallback=new ImageLoadCallback() { @SuppressLint("NewApi") @Override public void onSuccess(Drawable drawable, int tag, View viewParent) { // TODO Auto-generated method stub if(drawable!=null){ RelativeLayout rl_data=(RelativeLayout)(viewParent.findViewWithTag(tag)); if(rl_data!=null){ LayoutParams lp=rl_data.getLayoutParams(); lp.height=itemwidth*drawable.getMinimum Height()/drawable.getMinimumWidth(); rl_data.setLayoutParams(lp); rl_data.setBackground(drawable); } } } };
附上获取设备屏幕大小的类tool/DeviceInfo
public class DeviceInfo { public static int width; public static int height; public static void initDeviceInfo(Activity activity){ DisplayMetrics metrics = new DisplayMetrics(); activity.getWindowManager().getDefaultDisplay(). getMetrics(metrics); width=metrics.widthPixels; height=metrics.heightPixels; } }
initDeviceInfo初始化函数在MainActivity的onCreate中调用即可,不贴了。
设置数据测试,在ListFragment中刷新回掉中
private BGTaskListener bgtlistener=new BGTaskListener() { @Override public void taskFinish() { // TODO Auto-generated method stub System.out.println(rcvdata); if(rcvdata!=null){ ModelList data=new ModelList(); data.type="gif"; data.name="img"; data.time="2017"; data.title="标题例子,大小如何。"; data.data="内容例子,大小如何。内容例子,大小如何。内容例子,大小如何。"; data.width=683; data.height=1024; data.preurl="http://pic17.nipic.com/ 20111025/910362_220203957000_2.jpg"; data.dataurl="http://i2.img.969g.com/pub/imgx2016/ 09/01/284_171350_425dc_lit.gif"; data.read="2K阅读 • 54回复 • 原创"; adapter.addData(data); ModelList data1=new ModelList(); data1.type="lmg"; data1.name="img"; data1.time="2017"; data1.title="标题例子,大小如何。"; data1.data="内容例子,大小如何。内容例子,大小如何。内容例子,大小如何。"; data1.width=683; data1.height=1024; data1.preurl="http://pic4.nipic.com/ 20091119/1951702_070512038271_2.jpg"; data1.dataurl="http://pic17.nipic.com/ 20111025/910362_220203957000_2.jpg"; data1.read="2K阅读 • 54回复 • 原创"; adapter.addData(data1); } qlv_list.completeRefresh(QListView.ISSUCCESS);//完成刷新 } @Override public void taskDoing() { // TODO Auto-generated method stub rcvdata=Http.read("http://www.baidu.com");//一个自定义网络类,获取百度首页数据 } };
比较简单,刷新之后加入固定的数据(应该从网络上获取数据的,现在后台还没有写好),效果:
注:并没有长图加载、GIF播放的按钮
不要迷茫——2017/06/07
上一篇: Firefox 3: SQLite and more
下一篇: Android 在Launcher桌面添加应用快捷图标AppShortcuts/PinnedShortcuts(适用于Android 7.1(API25) 及更高)
推荐阅读
-
关于在HTML表格中插入背景图片图片重复显示的问题_html/css_WEB-ITnose
-
css设置背景图片和背景颜色都不显示_html/css_WEB-ITnose
-
Android解决ScrollView下嵌套ListView和GridView中内容显示不全的问题
-
网页中多个图标在一张图片上,使用css将各图标显示_html/css_WEB-ITnose
-
zhihu图片无法显示问题插件
-
zhihu图片无法显示问题插件
-
逐步讲解向Access数据库上传且显示图片
-
详解PHP如何把16进制的图片数据显示到网页
-
js 显示base64编码的二进制流网页图片_javascript技巧
-
Winform 显示Gif图片的实例代码