ListView的多布局

本文介绍了如何使用ListView实现多布局,关键在于覆盖getItemViewType()和getViewTypeCount()方法。通过这两个方法,可以根据不同的位置返回不同的布局,实现ListView中显示多样化的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用过重写两个方法来实现:

(1)getItemViewType(int position)

此方法说明listview显示哪个布局

(2)getViewTypeCount()

此方法说明listview有几种布局方式


实例代码:

<span style="font-size:18px;">package com.bwie.adapter;

import java.util.List;

import com.bwie.action.R;
import com.bwie.bean.Data;
import com.bwie.bean.ImageList;
import com.bwie.bean.Large_image_list;
import com.nostra13.universalimageloader.core.ImageLoader;

import android.content.Context;
import android.graphics.Color;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.net.Uri;
import android.os.SystemClock;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.MediaController;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.VideoView;

public class MyListViewNewsAdapter extends BaseAdapter {
	private Context context;
	private List<Data> list;
	private int currentIndex=-1;
	private int playPosition=-1;
	private boolean isPlaying=false;
	private boolean isPaused=false;
	private final int VIDEO=0;//视频
	private final int ONE_SMALL_IMAGE=1;//一张小图
	private final int ONE_LARGE_IMAGE=2;//一张大图
	private final int THREE_IMAGE=3;//三张小图
	private final int NO_IMAGE=4;//没有图和视频
	private ViewHolderVideo video2;
	private VideoView videoPlay;
	boolean flag;
	public MyListViewNewsAdapter(Context context, List<Data> list,boolean flag) {
		this.context = context;
		this.list = list;
		this.flag=flag;
	}

	@Override
	public int getCount() {

		return list.size();
	}

	@Override
	public Object getItem(int arg0) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public long getItemId(int arg0) {
		// TODO Auto-generated method stub
		return 0;
	}
	
	@Override
	public int getItemViewType(int position) {
		Data data = list.get(position);
		List<ImageList> image_list = data.getImage_list();
		List<Large_image_list> large_image_list = data.getLarge_image_list();
		if(flag){
			if(data.isHas_image()){
				return ONE_SMALL_IMAGE;
			}else{
				return NO_IMAGE;
			}
		}else{
			if(data.isHas_video()){
				return VIDEO;
			}else if(data.isHas_image()){
				if(image_list.size()!=0){
					if(image_list.size()>=3){
						return THREE_IMAGE;
					}else{
						return ONE_SMALL_IMAGE;
					}
				}else if(large_image_list!=null){
					if(large_image_list.size()!=0){
						return ONE_LARGE_IMAGE;
					}else{
						return ONE_SMALL_IMAGE;
					}
				}else{
					return ONE_SMALL_IMAGE;
				}
			}else{
				return NO_IMAGE;
			}
		}
		
	}

	@Override
	public int getViewTypeCount() {
		if(flag){
			return 2;
		}
		return 5;
	}

	@Override
	public View getView(int position, View convertview, ViewGroup arg2) {
		//五种布局模式的空间缓存对象
		ViewHolderNoImage noImage=null;
		ViewHolderOneLargeImage oneLargeImage=null;
		ViewHolderOneSmallImage oneSmallImage=null;
		ViewHolderThreeImage threeImage=null;
		final int mPosition=position;
		//布局类型标记
		int type=getItemViewType(position);
		Data data=list.get(position);
		if(convertview==null){
			//根据返回的常量判断加载哪种布局
			switch (type) {
			case VIDEO:
				//加载视频布局
				convertview=View.inflate(context, R.layout.item_listview_video, null);
				//创建控件缓存对象
				video2=new ViewHolderVideo();
				//获得标题textview
				video2.tv_title_news=(TextView) convertview.findViewById(R.id.textview_listview_news_video_title);
//				video2.vv=(VideoView) convertview.findViewById(R.id.videoview);
				video2.img=(ImageView) convertview.findViewById(R.id.video_image);
				video2.bt=(ImageButton) convertview.findViewById(R.id.video_play_btn);
				video2.pb=(ProgressBar) convertview.findViewById(R.id.progressbar_video);
				//获得更新时间,评论等textview
				findTextViews(video2,convertview);
				//设置标记
				convertview.setTag(video2);
				break;
			case ONE_SMALL_IMAGE:
				convertview=View.inflate(context, R.layout.item_listview_onesmallimage, null);
				oneSmallImage=new ViewHolderOneSmallImage();
				oneSmallImage.tv_title_news=(TextView) convertview.findViewById(R.id.textview_listview_news_smallimage_title);
				oneSmallImage.iv_onesmallimage=(ImageView) convertview.findViewById(R.id.imageview_listview_news_onesmallimage);
				
				findTextViews(oneSmallImage, convertview);
				convertview.setTag(oneSmallImage);
				break;
			case ONE_LARGE_IMAGE:
				convertview=View.inflate(context, R.layout.item_listview_onelargeimage, null);
				oneLargeImage=new ViewHolderOneLargeImage();
				oneLargeImage.tv_title_news=(TextView) convertview.findViewById(R.id.textview_listview_news_largeimage_title);
				oneLargeImage.iv_onelargeimage=(ImageView) convertview.findViewById(R.id.imageview_listview_news_onelargeimage);
				
				findTextViews(oneLargeImage, convertview);
				convertview.setTag(oneLargeImage);
				break;
			case THREE_IMAGE:
				convertview=View.inflate(context, R.layout.item_listview_threeimage, null);
				threeImage=new ViewHolderThreeImage();
				threeImage.tv_title_news=(TextView) convertview.findViewById(R.id.textview_listview_news_threeimage_title);
				threeImage.iv_threeimage_one=(ImageView) convertview.findViewById(R.id.imageview_listview_news_threesmallimage_one);
				threeImage.iv_threeimage_two=(ImageView) convertview.findViewById(R.id.imageview_listview_news_threesmallimage_two);
				threeImage.iv_threeimage_three=(ImageView) convertview.findViewById(R.id.imageview_listview_news_threesmallimage_three);
				
				findTextViews(threeImage, convertview);
				convertview.setTag(threeImage);
				break;
			case NO_IMAGE:
				
				convertview=View.inflate(context, R.layout.item_listview_noimage, null);
				noImage=new ViewHolderNoImage();
				noImage.tv_title_news=(TextView) convertview.findViewById(R.id.textview_listview_news_noimage_title);
				
				findTextViews(noImage, convertview);
				convertview.setTag(noImage);
				break;
			default:
				
				break;
			}
		}else{
			switch (type) {
			case NO_IMAGE:
				noImage=(ViewHolderNoImage) convertview.getTag();
				break;
			case VIDEO:
				video2=(ViewHolderVideo) convertview.getTag();
				break;
			case ONE_LARGE_IMAGE:
				oneLargeImage=(ViewHolderOneLargeImage) convertview.getTag();
				break;
			case  ONE_SMALL_IMAGE:
				oneSmallImage=(ViewHolderOneSmallImage) convertview.getTag();
				break;
			case THREE_IMAGE:
				threeImage=(ViewHolderThreeImage) convertview.getTag();
				break;
			default:
				break;
			}
			
		}
		switch (type) {
		case NO_IMAGE:
			setTextViewInfo(noImage, data);
			break;
		case VIDEO:
			setTextViewInfo(video2, data);
			if(video2!=null&&data.getVideo_detail_info()!=null){	
				ImageLoader.getInstance().displayImage(data.getVideo_detail_info().getDetail_video_large_image().getUrl(),video2.img);
			}
			video2.bt.setVisibility(View.VISIBLE);
			video2.img.setVisibility(View.VISIBLE);
			MediaController mMediaCtrl = new MediaController(context,false);
			
			if(currentIndex == position){
				video2.bt.setVisibility(View.INVISIBLE);
				video2.img.setVisibility(View.INVISIBLE);
				if(isPlaying || playPosition==-1){
					if(videoPlay!=null){
						videoPlay.setVisibility(View.GONE);
						videoPlay.stopPlayback();
						video2.pb.setVisibility(View.GONE);
					}
				}
				videoPlay = (VideoView) convertview.findViewById(R.id.videoview);
				videoPlay.setVisibility(View.VISIBLE);
				mMediaCtrl.setAnchorView(videoPlay);
				mMediaCtrl.setMediaPlayer(videoPlay);
				videoPlay.setMediaController(mMediaCtrl);
				videoPlay.requestFocus();
		        video2.pb.setVisibility(View.VISIBLE);
				if(playPosition>0 && isPaused){
					videoPlay.start();
					isPaused=false;
					isPlaying=true;
					video2.pb.setVisibility(View.GONE);
				}else{
					videoPlay.setVideoURI(Uri.parse("http://v4.pstatp.com/fbe5cf8d7b2c59caaee2b48dbdc7c00a/57639325/video/c/c565df9b98624773aa289f995635e6df/"));
			        isPaused=false;
			        isPlaying=true;
				}
				videoPlay.setOnCompletionListener(new OnCompletionListener() {
					@Override
					public void onCompletion(MediaPlayer mp) {
							if(videoPlay!=null){
								videoPlay.seekTo(0);
								videoPlay.stopPlayback();
								currentIndex=-1;
								isPaused=false;
						        isPlaying=false;
						        video2.pb.setVisibility(View.GONE);
								MyListViewNewsAdapter.this.notifyDataSetChanged();
							}	
					}
				});
				videoPlay.setOnPreparedListener(new OnPreparedListener() {
					
					@Override
					public void onPrepared(MediaPlayer mp) {
						video2.pb.setVisibility(View.GONE);
						videoPlay.start();
					}
				});
				
			}else{
				video2.bt.setVisibility(View.VISIBLE);
				video2.img.setVisibility(View.VISIBLE);
				video2.pb.setVisibility(View.GONE);
			}
			
			video2.bt.setOnClickListener(new View.OnClickListener() {
				@Override
				public void onClick(View v) {
					currentIndex=mPosition;
					playPosition=-1;
					MyListViewNewsAdapter.this.notifyDataSetChanged();
				}
			});
			break;
		case ONE_LARGE_IMAGE:
			setTextViewInfo(oneLargeImage, data);
			ImageLoader.getInstance().displayImage(data.getLarge_image_list().get(0).getUrl(), oneLargeImage.iv_onelargeimage);
			break;
		case  ONE_SMALL_IMAGE:
			setTextViewInfo(oneSmallImage, data);
			ImageLoader.getInstance().displayImage(data.getMiddle_image().getUrl(), oneSmallImage.iv_onesmallimage);
			break;
		case THREE_IMAGE:
			setTextViewInfo(threeImage, data);
			ImageLoader.getInstance().displayImage(data.getImage_list().get(0).getUrl(), threeImage.iv_threeimage_one);
			ImageLoader.getInstance().displayImage(data.getImage_list().get(1).getUrl(),threeImage.iv_threeimage_two);
			ImageLoader.getInstance().displayImage(data.getImage_list().get(2).getUrl(),threeImage.iv_threeimage_three);
			break;
		default:
			break;
		}
		return convertview;
		
	}
	public void findTextViews(ViewHolder vh,View convertview){
		vh.tv_label_news=(TextView) convertview.findViewById(R.id.textView_listview_news_label);
		vh.tv_comment_news=(TextView) convertview.findViewById(R.id.textView_listview_news_comment);
		vh.tv_publishtime_news=(TextView) convertview.findViewById(R.id.textView_listview_news_publishtime);
		vh.tv_source_news=(TextView) convertview.findViewById(R.id.textView_listview_news_source);
	}
	public void setTextViewInfo(ViewHolder vh,Data data){
		vh.tv_title_news.setText(data.getTitle());
		vh.tv_comment_news.setText("评论 "+data.getComment_count());
		if(("推广".equals(data.getLabel()))){
			vh.tv_label_news.setBackgroundColor(context.getResources().getColor(R.color.shenhui));
		}else if("热".equals(data.getLabel())){
			vh.tv_label_news.setBackgroundColor(Color.RED);
		}else if(data.getLabel()==null){
			vh.tv_label_news.setVisibility(View.GONE);
		}else {
			vh.tv_label_news.setBackgroundColor(Color.BLUE);
		}
		vh.tv_label_news.setText(data.getLabel());
		vh.tv_publishtime_news.setText(data.getPublish_time()+"");
		vh.tv_source_news.setText(data.getSource());
	}
	public void setVideo(int position,ViewHolderVideo video){
		
	}
	class ViewHolderNoImage extends ViewHolder{

	}
	class ViewHolderOneSmallImage extends ViewHolder{
		ImageView iv_onesmallimage;
	}
	class ViewHolderOneLargeImage extends ViewHolder{
		ImageView iv_onelargeimage;	
	}
	class ViewHolderThreeImage extends ViewHolder{
		ImageView iv_threeimage_one;
		ImageView iv_threeimage_two;
		ImageView iv_threeimage_three;
	}
	class ViewHolderVideo extends ViewHolder{
		VideoView vv;
		ImageView img;
		ProgressBar pb;
		ImageButton bt;
	}
	class ViewHolder{
		TextView tv_title_news;
		TextView tv_label_news;
		TextView tv_source_news;
		TextView tv_publishtime_news;
		TextView tv_comment_news;
	}
}
</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值