欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

18、ListView显示图片

程序员文章站 2022-03-11 10:53:16
...
        ListView显示图片(只有文字显得很傻),很多了,效果图就不找了,这里主要是网络图片,利用上节网络图片获取的类。
        先定义了一个类,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");//一个自定义网络类,获取百度首页数据
	}
};

        比较简单,刷新之后加入固定的数据(应该从网络上获取数据的,现在后台还没有写好),效果:
18、ListView显示图片
            
    
    博客分类: Code/Android/Dp Notes 安卓学习总结安卓开发安卓实例Dp Notes 
注:并没有长图加载、GIF播放的按钮

不要迷茫——2017/06/07






  • 18、ListView显示图片
            
    
    博客分类: Code/Android/Dp Notes 安卓学习总结安卓开发安卓实例Dp Notes 
  • 大小: 1.1 MB