ListView多视图(那些范二的bug)

ListView的效果千变万化,却始终围绕着Adapter和ViewHolder,所以掌握这两个对于实现你想要的效果很重

要:多视图ListView在应用中有很多例子,比如:聊天界面里面的不同内容,,是文本,表情,图片,语音等

等,还有微信的订阅号里面的推送内容,都是一种多视图ListView。下面我们来看这次实现的效果:

关键代码:(ContactMsgAdapter.java)

package com.multiviewlistview.adapter;import java.util.List;import android.annotation.SuppressLint;import android.content.Context;import android.text.Html;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.Toast;import com.multiviewlistview.R;import com.multiviewlistview.bean.ContactMsg;@SuppressLint("SimpleDateFormat")public class ContactMsgAdapter extends BaseAdapter {private List<ContactMsg> lstContactMsg;private Context mContext;// 消息类型/** 商户活动 */public static final int MSG_TYPE_BUSINESS_ACTIVITIES = 101;/** 消费结果 */public static final int MSG_TYPE_CONSUME_RESULT = 102;/** 获取积分 */public static final int MSG_TYPE_GAIN_BENEFIT = 103;/** 使用积分 */public static final int MSG_TYPE_USE_BENEFIT = 104;// 消息状态/** 未读 */public static final int MSG_STATUS_UNREAD = 1;/** 已读 */public static final int MSG_STATUS_READ = 2;/** 已评论 */public static final int MSG_STATUS_HAVE_COMMENTS = 3;public ContactMsgAdapter(List<ContactMsg> lstContactMsg, Context context) {this.lstContactMsg = lstContactMsg;mContext = context;}@Overridepublic int getCount() {return lstContactMsg == null ? 0 : lstContactMsg.size();}@Overridepublic Object getItem(int position) {return lstContactMsg == null ? 0 : lstContactMsg.get(position);}@Overridepublic long getItemId(int position) {return position;}/** * 根据数据源的position返回需要显示的的layout的type * * type的值必须从0开始 * * */@Overridepublic int getItemViewType(int position) {int type = lstContactMsg.get(position).getType();int status = lstContactMsg.get(position).getState();if (type == MSG_TYPE_CONSUME_RESULT && (status == MSG_STATUS_UNREAD || status == MSG_STATUS_READ)) {// 消费结果&&(未读||已读)type = 0;} else if (type == MSG_TYPE_CONSUME_RESULT && status == MSG_STATUS_HAVE_COMMENTS) {// 消费结果&&已评论消费结果type = 1;} else if (type == MSG_TYPE_GAIN_BENEFIT || type == MSG_TYPE_USE_BENEFIT) {// 获取权益||使用权益type = 2;}return type;}/** * 返回所有的layout的数量 * * */@Overridepublic int getViewTypeCount() {return 3;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ContactMsg contactMsg = lstContactMsg.get(position);int status = contactMsg.getState();int type = contactMsg.getType();MsgViewHolder viewHolder = null;if (type == MSG_TYPE_CONSUME_RESULT && (status == MSG_STATUS_UNREAD || status == MSG_STATUS_READ)) {// 消费结果&&(未读||已读)viewHolder = MsgViewHolder.get(mContext, convertView, parent, R.layout.item_contact_msg_consume_result,position);setConsumeResultData(viewHolder, contactMsg);} else if (type == MSG_TYPE_CONSUME_RESULT && status == MSG_STATUS_HAVE_COMMENTS) {// 消费结果&&已评论消费结果viewHolder = MsgViewHolder.get(mContext, convertView, parent, R.layout.item_contact_msg_comment, position);setCommentConsumeResultData(viewHolder, contactMsg);} else if (type == MSG_TYPE_GAIN_BENEFIT || type == MSG_TYPE_USE_BENEFIT) {// 获取权益||使用权益viewHolder = MsgViewHolder.get(mContext, convertView, parent, R.layout.item_contact_msg_coupon, position);setGainBenefitData(viewHolder, contactMsg);}return viewHolder.getConvertView();}/** * 设置评价过的消费结果数据 */public void setCommentConsumeResultData(MsgViewHolder viewHolder, ContactMsg contactMsg) {if (contactMsg != null) {viewHolder.setText(R.id.tv_time, contactMsg.getCreateTime());viewHolder.setText(R.id.tv_consume_content, Html.fromHtml(contactMsg.getContent()));}}/** * 设置待评价的消费结果数据 */public void setConsumeResultData(MsgViewHolder viewHolder, final ContactMsg contactMsg) {if (contactMsg != null) {viewHolder.setText(R.id.tv_time, contactMsg.getCreateTime());viewHolder.setText(R.id.tv_consume_content, Html.fromHtml(contactMsg.getContent()));viewHolder.setOnclick(R.id.ly_comment, new OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(mContext, "去评论", Toast.LENGTH_SHORT).show();}});}}/** * 设置获取权益数据 */public void setGainBenefitData(MsgViewHolder viewHolder, ContactMsg contactMsg) {if (contactMsg != null) {viewHolder.setText(R.id.tv_time, contactMsg.getCreateTime());viewHolder.setText(R.id.tv_content, Html.fromHtml(contactMsg.getContent()));viewHolder.setText(R.id.tv_shop_name, contactMsg.getShopName());}}/** * 设置使用权益数据 */public void setUseBenefitData(MsgViewHolder viewHolder, ContactMsg contactMsg) {if (contactMsg != null) {viewHolder.setText(R.id.tv_time, contactMsg.getCreateTime());viewHolder.setText(R.id.tv_content, Html.fromHtml(contactMsg.getContent()));viewHolder.setText(R.id.tv_shop_name, contactMsg.getShopName());}}}

MsgViewHolder.java积极的人在每一次忧患中都看到一个机会,而消极的人则在每个机会都看到某种忧患。

ListView多视图(那些范二的bug)

相关文章:

你感兴趣的文章:

标签云: