效果图:一个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;
}
}