用过重写两个方法来实现:
(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>