listview拼装 item动态拼装

效果图:一个listview现实不同的view效果

                 

1.项目中经常用到listview,为了更好的实现多种item,我们可以将不同view不同封装,然后根据不同的type显示不同的view

文章出处:https://blog.csdn.net/pangzaifei/article/details/70213731

<pre name="code" class="java">package com.baidu.dubike.activity.adapter;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.BaseAdapter;
import android.widget.FrameLayout;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.ImageLoader.ImageContainer;
import com.android.volley.toolbox.ImageLoader.ImageListener;
import com.baidu.dubike.R;
import com.baidu.dubike.adapter.CommonBaseAdapter;
import com.baidu.dubike.data.ConstantKeys;
import com.baidu.dubike.data.bean.MessageInfo;
import com.baidu.dubike.frontia.UserInfoUtils;
import com.baidu.dubike.ui.view.LoadingProgressbar;
import com.baidu.dubike.util.ImageUtils;
import com.baidu.dubike.util.Logger;
import com.baidu.dubike.util.Util;
import com.baidu.dubike.volley.DuBikeVolley;

/**
 * @desc:骑友圈adapter
 * @author: pangzf
 * @date: 2014年12月5日 下午2:21:12
 */
public class CyclingZoneAdapter extends CommonBaseAdapter<Object> {
	public static final int MESSAGE_TYPE_INVALID = -1;
	public static final int MESSAGE_TYPE_TETX = 0x00;// 文字消息
	public static final int MESSAGE_TYPE_IMAGE = 0x01;// 图片消息
	public static final int MESSAGE_TYPE_VOICE = 0x02;// 视频消息
	public static final int MESSAGE_TYPE_MULTY_IMAGES = 0x03;// 多图消息
	private static final int VIEW_TYPE_COUNT = 9;
	private static final int TYPE_IMAGE_USERPHTOO = 0x01;// 头像图片
	private static final int TYPE_IMAGE_CONTENT = 0x02;// 内容图片
	private static final int GRIDVIEW_COLUMN = 3;// gridvew的猎术

	private LayoutInflater mInflater;

	private ArrayList<Object> mMessageList = new ArrayList<Object>();
	// private RequestQueue mQueue;// vollery队列
	private ImageLoader mImageLoader;

	public CyclingZoneAdapter(Context context) {
		super(context);
		if (null != context) {
			mInflater = ((Activity) context).getLayoutInflater();
		}
		mImageLoader = DuBikeVolley.getImageLoader();

	}

	/**
	 * 添加集合数据
	 * 
	 * @param fromStart
	 * @param list
	 */
	public void addItem(boolean fromStart, List<MessageInfo> list) {
		int index = 0;
		for (MessageInfo msgInfo : list) {
			++index;
		}

		try {
			if (null == list || list.size() == 0) {
				return;
			}
			// 如果是历史消息,从头开始加
			mMessageList.addAll(fromStart ? 0 : mMessageList.size(), list);

			// 先取出需要加进去的数据数量
			final int count = list.size();

			if (fromStart) {
			}
			// 从加进去的那个info开始,赋值各条消息的状态
			for (int i = 0; i < count; i++) {
				MessageInfo info = (MessageInfo) list.get(i);
				if (null == info) {
					continue;
				}
			}

			int position = count - 1;
			while (position >= 0) {
				Object obj = mMessageList.get(position);
				if (!(obj instanceof MessageInfo)) {
					position--;
					continue;
				}

				MessageInfo preInfo = null;
				for (int i = position - 1; i >= 0; i--) {
					if (mMessageList.get(i) instanceof MessageInfo) {
						preInfo = (MessageInfo) mMessageList.get(i);
						break;
					}
				}

				position--;
			}
			
			setData(mMessageList);
		} catch (Exception e) {
			Logger.TEST.error(e.getMessage());
		}
	}

	/**
	 * 这个函数只能从末尾添加
	 * 
	 * @param fromStart
	 * @param item
	 */
	// public void addItem(MessageInfo info) {
	// // logger.d("chat#addItem, msg:%s, callstack:%s", info,
	// // Log.getStackTraceString(new Throwable()));
	// Logger.TEST.error("chat#addItem, msg:%s" + info);
	//
	// try {
	// if (null == info || mMessageList.contains(info)) {
	// Logger.TEST.error("chat#already has this item");
	// return;
	// }
	// mMessageList.add(info);
	// // msgIndexMap.put(info.msgId, messageList.size() - 1);
	//
	// final int count = mMessageList.size();
	// MessageInfo preInfo = null;
	// for (int i = count - 2; i >= 0; i--) {
	// if (mMessageList.get(i) instanceof MessageInfo) {
	// preInfo = (MessageInfo) mMessageList.get(i);
	// break;
	// }
	// }
	//
	// // if (DateUtil.needDisplayTime(
	// // null == preInfo ? null : preInfo.getMsgCreateTime(),
	// // info.getMsgCreateTime())) {
	// // TimeTileMessage timeTitle = new TimeTileMessage();
	// // timeTitle.setTime(info.getMsgCreateTime());
	// // // msgIndexMap.fix(count - 1, 1);
	// // messageList.add(count - 1, timeTitle);
	// // }
	//
	// Logger.TEST.error("chat#finish add item");
	// } catch (Exception e) {
	// Logger.TEST.error("chat#find exception:%s" + e.getMessage());
	// }
	// }

	@Override
	public int getCount() {
		if (null == mMessageList) {
			return 0;
		} else {
			return mMessageList.size();
		}
	}

	@Override
	public Object getItem(int position) {
		if (position >= getCount() || position < 0) {
			return null;
		}
		return mMessageList.get(position);
	}

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

//	@Override
//	public View getView(int position, View convertView, ViewGroup parent) {
//
//	}

	@Override
	public int getViewTypeCount() {
		return VIEW_TYPE_COUNT;
	}

	/**
	 * 点击头像操作
	 * 
	 * @param holder
	 * @param msg
	 */
	private void handlePortraitClick(MessageHolderBase holder,
			final MessageInfo msg) {
		if (holder == null || msg == null) {
			return;
		}

		if (holder.userphoto != null) {
			holder.userphoto.setOnClickListener(new OnClickListener() {

				@Override
				public void onClick(View v) {
					Util.openUserProfileActivity(mContext,
							UserInfoUtils.getUid());
				}
			});
		}
	}

	/**
	 * 文字处理
	 * 
	 * @param holder
	 * @param info
	 * @param parent
	 */
	private void handleTextMessage(final TextMessageHolder holder,
			final MessageInfo info, final ViewGroup parent, int position) {
		if (null == holder || null == info) {
			return;
		}
		handlerBaseMessage(holder, info, position, parent);
		holder.message_content.setText(info.getContent());
	}

	/**
	 * 处理有图片的message
	 * 
	 * @param holder
	 * @param info
	 * @param position
	 * @param b
	 * @param parent
	 */
	private void handleImageMessage(ImageMessageHolder holder,
			MessageInfo info, int position, ViewGroup parent) {

		try {
			boolean setBackground = false;// 图片加载失败时是否显示背景
			if (null == holder || null == info)
				return;
			handlerBaseMessage(holder, info, position, parent);

			Bitmap bmp = null;

			int msgLoadState = info.getMsgLoadState();
			setBackground = switchLoadState(holder, info, bmp, msgLoadState,
					TYPE_IMAGE_CONTENT);// 图片状态

			if (setBackground) {
				FrameLayout.LayoutParams imageLayout = new FrameLayout.LayoutParams(
						FrameLayout.LayoutParams.WRAP_CONTENT,
						FrameLayout.LayoutParams.WRAP_CONTENT);
				imageLayout.gravity = Gravity.CENTER;
				holder.message_image.setLayoutParams(imageLayout);
			}

		} catch (Exception e) {
			Logger.TEST.error(e.getMessage());
		}

	}

	/**
	 * 多图处理
	 * 
	 * @param holder
	 * @param info
	 * @param position
	 * @param parent
	 */
	private void handleMultyImageMessage(MessageHolderBase holder,
			MessageInfo info, int position, ViewGroup parent) {
		if (!(holder instanceof MultyImageMessageHolder)) {
			return;
		}
		handlerBaseMessage(holder, info, position, parent);
		MultyImageMessageHolder multyImageMessageHolder = (MultyImageMessageHolder) holder;
		List<String> imagesList = info.getMultyImageUrl();
		if (imagesList != null && imagesList.size() > 0) {
			MessageMultyImagesAdapter multyAdapter = new MessageMultyImagesAdapter(
					mContext, imagesList, holder);
			multyImageMessageHolder.gridview_images.setAdapter(multyAdapter);
			ImageUtils.setGridViewHeightBasedOnChildren(
					multyImageMessageHolder.gridview_images, GRIDVIEW_COLUMN);

		}

	}

	private void handlerBaseMessage(MessageHolderBase holder, MessageInfo info,
			int position, ViewGroup parent) {
		handlePortraitClick(holder, info);
		holder.username.setText(info.getUserName());
		holder.content.setText(info.getContent());
		holder.good.setText("赞:" + info.getGood());
		holder.collect.setText("收藏:" + info.getCollect());
		holder.comment.setText("评论:" + info.getComment());
		downLoadUserPhotoImage(info, holder);
	}

	private boolean switchLoadState(ImageMessageHolder holder,
			MessageInfo info, Bitmap bmp, int msgLoadState, int loadStateType) {
		boolean setBackground = false;
		if (loadStateType == TYPE_IMAGE_USERPHTOO) {
			// 头像图片
			switch (msgLoadState) {
			case ConstantKeys.MESSAGE_STATE_UNLOAD: {
				holder.userphoto
						.setImageResource(R.drawable.pull_default_message_image);
				setBackground = true;
				holder.image_progress.showProgress();
				downLoadImage(info, holder);
			}
				break;

			case ConstantKeys.MESSAGE_STATE_LOADDING: {
				if (null != bmp) {
					holder.userphoto
							.setLayoutParams(new FrameLayout.LayoutParams(
									LayoutParams.MATCH_PARENT,
									LayoutParams.MATCH_PARENT));
					holder.userphoto.setImageBitmap(bmp);
					setBackground = false;
				} else {
					holder.userphoto
							.setImageResource(R.drawable.pull_default_message_image);
					setBackground = true;
				}
				// holder.image_progress.showProgress();
			}
				break;

			case ConstantKeys.MESSAGE_STATE_FINISH_SUCCESSED: {
				// if (null != bmp) {
				// holder.userphoto
				// .setLayoutParams(new FrameLayout.LayoutParams(
				// LayoutParams.MATCH_PARENT,
				// LayoutParams.MATCH_PARENT));
				// holder.userphoto.setImageBitmap(bmp);
				// setBackground = false;
				// } else {
				// holder.userphoto
				// .setImageResource(R.drawable.pull_default_message_error_image);
				// setBackground = true;
				// }
				downLoadImage(info, holder);
				holder.image_progress.hideProgress();

			}
				break;

			case ConstantKeys.MESSAGE_STATE_FINISH_FAILED: {
				// holder.message_image
				// .setOnClickListener(new BtnImageListener(info,
				// position, isMine));
				if (null != bmp) {
					holder.message_image
							.setLayoutParams(new FrameLayout.LayoutParams(
									LayoutParams.MATCH_PARENT,
									LayoutParams.MATCH_PARENT));
					holder.message_layout.setBackgroundResource(0);
					holder.message_image.setImageBitmap(bmp);
					setBackground = false;
				} else {
					holder.message_image
							.setImageResource(R.drawable.pull_default_message_error_image);
					setBackground = true;
				}
				holder.image_progress.hideProgress();
			}
				break;

			default: {
				holder.message_image
						.setImageResource(R.drawable.pull_default_message_error_image);
				setBackground = true;
				holder.image_progress.hideProgress();
			}
				break;
			}
		} else if (loadStateType == TYPE_IMAGE_CONTENT) {
			// 平常图片
			switch (msgLoadState) {
			case ConstantKeys.MESSAGE_STATE_UNLOAD: {
				holder.message_image
						.setImageResource(R.drawable.pull_default_message_image);
				setBackground = true;
				holder.image_progress.showProgress();
				downLoadImage(info, holder);
			}
				break;

			case ConstantKeys.MESSAGE_STATE_LOADDING: {
				if (null != bmp) {
					holder.message_image
							.setLayoutParams(new FrameLayout.LayoutParams(
									LayoutParams.MATCH_PARENT,
									LayoutParams.MATCH_PARENT));
					holder.message_layout.setBackgroundResource(0);
					holder.message_image.setImageBitmap(bmp);
					setBackground = false;
				} else {
					holder.message_image
							.setImageResource(R.drawable.pull_default_message_image);
					setBackground = true;
				}
				holder.image_progress.showProgress();
			}
				break;

			case ConstantKeys.MESSAGE_STATE_FINISH_SUCCESSED: {
				downLoadImage(info, holder);
				// if (null != bmp) {
				// holder.message_image
				// .setLayoutParams(new FrameLayout.LayoutParams(
				// LayoutParams.MATCH_PARENT,
				// LayoutParams.MATCH_PARENT));
				// holder.message_layout.setBackgroundResource(0);
				// holder.message_image.setImageBitmap(bmp);
				// // if (!isMine) {
				// // holder.message_image
				// // .setOnClickListener(new BtnImageListener(
				// // info, position, isMine));
				// // }
				// //
				// info.setMsgReadStatus(ConstantKeys.MESSAGE_STATE_FINISH_SUCCESSED);
				//
				// setBackground = false;
				// } else {
				// holder.message_image
				// .setImageResource(R.drawable.pull_default_message_error_image);
				// setBackground = true;
				// }
				holder.image_progress.hideProgress();

			}
				break;

			case ConstantKeys.MESSAGE_STATE_FINISH_FAILED: {
				// holder.message_image
				// .setOnClickListener(new BtnImageListener(info,
				// position, isMine));
				if (null != bmp) {
					holder.message_image
							.setLayoutParams(new FrameLayout.LayoutParams(
									LayoutParams.MATCH_PARENT,
									LayoutParams.MATCH_PARENT));
					holder.message_layout.setBackgroundResource(0);
					holder.message_image.setImageBitmap(bmp);
					setBackground = false;
				} else {
					holder.message_image
							.setImageResource(R.drawable.pull_default_message_error_image);
					setBackground = true;
				}
				holder.image_progress.hideProgress();
			}
				break;

			default: {
				holder.message_image
						.setImageResource(R.drawable.pull_default_message_error_image);
				setBackground = true;
				holder.image_progress.hideProgress();
			}
				break;
			}
		}

		return setBackground;
	}

	/**
	 * 下载用户头像
	 * 
	 * @param holder
	 * 
	 * @param info
	 */
	private void downLoadUserPhotoImage(MessageInfo messageInfo,
			final MessageHolderBase holder) {
		try {
			if (null == messageInfo)
				return;

			if (null == mContext)
				return;

			final String userPhotoImageUrl = messageInfo.getUserPhoto();

			mImageLoader.get(userPhotoImageUrl, new ImageListener() {

				@Override
				public void onErrorResponse(VolleyError arg0) {
					Logger.TEST.error("下载图片失败");
				}

				@Override
				public void onResponse(ImageContainer container, boolean isCache) {
					if (container != null) {
						Bitmap bitmap = container.getBitmap();
						if (bitmap != null) {
							holder.userphoto.setImageBitmap(bitmap);
						}
					}
				}
			});

		} catch (Exception e) {
		}
	}

	/**
	 * @Description 下载图片信息
	 * @param messageInfo
	 */
	private void downLoadImage(MessageInfo messageInfo,
			final MessageHolderBase holder) {
		try {
			if (null == messageInfo)
				return;

			if (null == mContext)
				return;

			final String smallImageUrl = messageInfo.getImageUrl();

			mImageLoader.get(smallImageUrl, new ImageListener() {

				private ImageMessageHolder imageHolder;

				@Override
				public void onErrorResponse(VolleyError arg0) {
					Log.e("kkk", "下载失败");
				}

				@Override
				public void onResponse(ImageContainer container, boolean isCache) {
					if (container != null) {
						Bitmap bitmap = container.getBitmap();
						if (bitmap != null) {
							if (holder instanceof ImageMessageHolder) {
								imageHolder = (ImageMessageHolder) holder;
								imageHolder.message_image
										.setImageBitmap(bitmap);
								// updateMessageState(messageInfoFinal,
								// ConstantKeys.MESSAGE_STATE_LOADDING);
								// notifyDataSetChanged();
							}

						}
					}

				}
			});

		} catch (Exception e) {
		}
	}

	/**
	 * 多图布局
	 * 
	 * @param holder
	 * @param convertView
	 */
	private void fillMultyImageMessageHolder(MultyImageMessageHolder holder,
			View convertView) {
		fillBaseMessageholder(holder, convertView);
		holder.gridview_images = (GridView) convertView
				.findViewById(R.id.zone_item_message_multy_images_gv);
	}

	/**
	 * 填充文字布局
	 * 
	 * @param holder
	 * @param convertView
	 */
	private void fillTextMessageHolder(TextMessageHolder holder,
			View convertView) {
		fillBaseMessageholder(holder, convertView);
		holder.message_content = (TextView) convertView
				.findViewById(R.id.zone_item_content_tv);
	}

	/**
	 * 填充图片布局
	 * 
	 * @param holder
	 * @param convertView
	 */
	private void fillImageMessageHolder(ImageMessageHolder holder,
			View convertView) {
		fillBaseMessageholder(holder, convertView);
		holder.message_layout = convertView
				.findViewById(R.id.zone_item_message_layout);
		holder.message_image = (ImageView) convertView
				.findViewById(R.id.zone_item_message_image_iv);
		holder.image_progress = (LoadingProgressbar) convertView
				.findViewById(R.id.zone_item_image_progress);
		holder.image_progress.setShowText(false);
	}

	/**
	 * 填充公共的布局
	 * 
	 * @param holder
	 * @param convertView
	 */
	private void fillBaseMessageholder(MessageHolderBase holder,
			View convertView) {
		holder.content = (TextView) convertView
				.findViewById(R.id.zone_item_content_tv);
		holder.username = (TextView) convertView
				.findViewById(R.id.zone_item_username_tv);
		holder.userphoto = (ImageView) convertView
				.findViewById(R.id.zone_item_userphoto_iv);
		holder.good = (TextView) convertView
				.findViewById(R.id.zone_item_message_good_tv);
		holder.collect = (TextView) convertView
				.findViewById(R.id.zone_item_message_collect_tv);
		holder.comment = (TextView) convertView
				.findViewById(R.id.zone_item_message_comment_tv);
	}

	@Override
	public int getItemViewType(int position) {
		if (position >= mMessageList.size()) {
			return MESSAGE_TYPE_INVALID;
		}
		if (mMessageList != null) {
			Object obj = mMessageList.get(position);
			if (obj instanceof MessageInfo) {
				MessageInfo info = (MessageInfo) obj;
				int displayType = info.getDisplayType();
				if (displayType == ConstantKeys.DISPLAY_TYPE_TEXT) {
					return MESSAGE_TYPE_TETX;
				} else if (displayType == ConstantKeys.DISPLAY_TYPE_IMAGE) {
					return MESSAGE_TYPE_IMAGE;
				} else if (displayType == ConstantKeys.DISPLAY_TYPE_VOICE) {
					return MESSAGE_TYPE_VOICE;
				} else if (displayType == ConstantKeys.DISPLAY_TYPE_MULTY_IMAGES) {
					return MESSAGE_TYPE_MULTY_IMAGES;
				}
			}
		}
		// return super.getItemViewType(position);
		return MESSAGE_TYPE_INVALID;
	}

	public static class MessageHolderBase {
		/**
		 * 头像
		 */
		ImageView userphoto;
		ProgressBar loadingProgressBar;
		TextView username;
		TextView content;
		TextView good;
		TextView collect;
		TextView comment;
	}

	private static class TextMessageHolder extends MessageHolderBase {
		/**
		 * 文字消息体
		 */
		TextView message_content;
	}

	private static class ImageMessageHolder extends MessageHolderBase {
		/**
		 * 可点击的view
		 */
		View message_layout;

		/**
		 * 图片消息体
		 */
		ImageView message_image;

		/**
		 * 图片状态指示
		 */
		LoadingProgressbar image_progress;
	}

	public static class MultyImageMessageHolder extends MessageHolderBase {
		/**
		 * 多图gridview
		 */
		GridView gridview_images;
	}

	private static class VoiceMessageHolder extends MessageHolderBase {
		/**
		 * 可点击的消息体
		 */
		View message_layout;

		/**
		 * 播放视频的view
		 */
		View voice_antt_view;

		/**
		 * 指示视频是否被播放
		 */
		View voice_unread_notify;

		/**
		 * 播放时长
		 */
		TextView voice_duration;
	}
	
	

	@Override
	protected View generateView(int position, View convertView, ViewGroup parent) {
		int type = getItemViewType(position);
		MessageHolderBase holder = null;
		if (convertView == null && mInflater != null) {
			if (type == MESSAGE_TYPE_TETX) {
				// 文本
				convertView = mInflater.inflate(
						R.layout.act_cycling_friends_zone_text_message_item,
						parent, false);
				holder = new TextMessageHolder();
				convertView.setTag(holder);
				fillTextMessageHolder((TextMessageHolder) holder, convertView);

			} else if (type == MESSAGE_TYPE_IMAGE) {
				// 有图片
				convertView = mInflater.inflate(
						R.layout.act_cycling_friends_zone_image_message_item,
						parent, false);
				holder = new ImageMessageHolder();
				convertView.setTag(holder);
				fillImageMessageHolder((ImageMessageHolder) holder, convertView);

			} else if (type == MESSAGE_TYPE_VOICE) {
				// 有视频
			} else if (type == MESSAGE_TYPE_MULTY_IMAGES) {
				// 多图
				convertView = mInflater
						.inflate(
								R.layout.act_cycling_friends_zone_multy_images_message_item,
								parent, false);
				holder = new MultyImageMessageHolder();
				convertView.setTag(holder);
				fillMultyImageMessageHolder((MultyImageMessageHolder) holder,
						convertView);
			}
		} else {
			holder = (MessageHolderBase) convertView.getTag();
		}
		MessageInfo info = (MessageInfo) mMessageList.get(position);

		// todo如果图片加载失败,可以点击重新加载
		if (type == MESSAGE_TYPE_TETX && holder instanceof TextMessageHolder) {
			handleTextMessage((TextMessageHolder) holder, info, parent,
					position);
		} else if (type == MESSAGE_TYPE_IMAGE
				&& holder instanceof ImageMessageHolder) {
			handleImageMessage((ImageMessageHolder) holder, info, position,
					parent);
		} else if (type == MESSAGE_TYPE_MULTY_IMAGES
				&& holder instanceof MultyImageMessageHolder) {
			// 多图
			handleMultyImageMessage((MultyImageMessageHolder) holder, info,
					position, parent);

		}
		return convertView;
	}

}
 
 
发布了71 篇原创文章 · 获赞 15 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/pangzaifei/article/details/42006317