Listview 多个ViewHolder实现

简单代码示例:

package com.edaixi.adapter;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.edaixi.activity.R;
import com.edaixi.dataset.MyAddressDataSet;

public class SelectAddressListAdapter extends BasicAdapter {
	private MyAddressDataSet mTrueDataSet = null;
	private MyAddressDataSet mFalseDataSet = null;
	private Context context;
	public static int TRUE_TITLE = 1;
	public static int TRUE_ITEM = 2;

	public SelectAddressListAdapter(Context mContext,
			MyAddressDataSet mTrueDataSet, MyAddressDataSet mFalseDataSet) {
		super(mContext);
		this.mTrueDataSet = mTrueDataSet;
		this.mFalseDataSet = mFalseDataSet;
		this.context = mContext;
	}

	@Override
	public int getCount() {
		if (mTrueDataSet.size() > 0 && mFalseDataSet.size() > 0) {
			return mTrueDataSet.size() + mFalseDataSet.size() + 2;
		} else if (mTrueDataSet.size() == 0 && mFalseDataSet.size() == 0) {
			return mTrueDataSet.size() + mFalseDataSet.size();
		} else {
			return mTrueDataSet.size() + mFalseDataSet.size() + 1;
		}
	}

	@Override
	public Object getItem(int position) {
		if (position == 0) {
			return null;
		} else if (position < mTrueDataSet.size() + 1) {
			return mTrueDataSet.getIndexBean(position);
		} else {
			return mFalseDataSet.getIndexBean(position - mTrueDataSet.size()
					- 2);
		}
	}

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

	@Override
	public int getItemViewType(int position) {

		if ((mTrueDataSet.size() > 0) && (position == 0)) {
			return TRUE_TITLE;
		} else if ((mFalseDataSet.size() > 0)
				&& (position == mTrueDataSet.size() + 1)) {
			return TRUE_TITLE;
		} else {
			return TRUE_ITEM;
		}
	}

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

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		ViewHolderItem mViewHolder = null;
		ViewHolderTitle mViewHolderTitle = null;
		final int _position = position;
		int viewType = getItemViewType(position);
		if (convertView == null) {
			if (viewType == 2) {
				mViewHolder = new ViewHolderItem();
				convertView = View.inflate(context,
						R.layout.item_address_select, null);
				mViewHolder.mName = (TextView) convertView
						.findViewById(R.id.address_item_name);
				mViewHolder.mPhone = (TextView) convertView
						.findViewById(R.id.address_item_tel);
				mViewHolder.mDetailAdd = (TextView) convertView
						.findViewById(R.id.address_item_text);
				mViewHolder.mAddLayout = (RelativeLayout) convertView
						.findViewById(R.id.rl_address_select);
				convertView.setTag(mViewHolder);
			} else {
				mViewHolderTitle = new ViewHolderTitle();
				convertView = View.inflate(context,
						R.layout.address_select_true_tips_title, null);
				mViewHolderTitle.mTitleName = (TextView) convertView
						.findViewById(R.id.tv_address_title);
				convertView.setTag(mViewHolderTitle);
			}
		} else {
			if (viewType == 2) {
				mViewHolder = (ViewHolderItem) convertView.getTag();
			} else {
				mViewHolderTitle = (ViewHolderTitle) convertView.getTag();
			}
		}

		if ((mTrueDataSet.size() > 0) && (position == 0)) {
			mViewHolderTitle.mTitleName.setText("可用地址");
		} else if ((mFalseDataSet.size() > 0)
				&& (position == mTrueDataSet.size() + 1)) {
			mViewHolderTitle.mTitleName.setText("不可用地址");
		} else {
			if (position <= mTrueDataSet.size()) {
				mViewHolder.mAddLayout.setBackgroundColor(context
						.getResources().getColor(R.color.white));
				mViewHolder.mName.setTextColor(context.getResources().getColor(
						R.color.text_1));
				mViewHolder.mName.setText(mTrueDataSet.getIndexBean(
						_position - 1).getUsername());

				if (mTrueDataSet.getIndexBean(_position - 1).getTel() != null) {
					mViewHolder.mPhone.setTextColor(context.getResources()
							.getColor(R.color.text_1));
					mViewHolder.mPhone.setText(mTrueDataSet.getIndexBean(
							_position - 1).getTel());
				}
				mViewHolder.mDetailAdd.setTextColor(context.getResources()
						.getColor(R.color.text_1));
				if (mTrueDataSet.getIndexBean(_position - 1).getAddress() != null)
					mViewHolder.mDetailAdd.setText(mTrueDataSet.getIndexBean(
							_position - 1).getCity()
							+ mTrueDataSet.getIndexBean(_position - 1)
									.getArea()
							+ mTrueDataSet.getIndexBean(_position - 1)
									.getAddress().trim());

			} else {
				mViewHolder.mAddLayout.setBackgroundColor(context
						.getResources().getColor(R.color.gray));
				mViewHolder.mName.setTextColor(context.getResources().getColor(
						R.color.falseaddress));
				mViewHolder.mName.setText(mFalseDataSet.getIndexBean(
						position - mTrueDataSet.size() - 2).getUsername());

				if (mFalseDataSet.getIndexBean(
						position - mTrueDataSet.size() - 2).getTel() != null) {
					mViewHolder.mPhone.setTextColor(context.getResources()
							.getColor(R.color.falseaddress));
					mViewHolder.mPhone.setText(mFalseDataSet.getIndexBean(
							position - mTrueDataSet.size() - 2).getTel());
				}
				mViewHolder.mDetailAdd.setTextColor(context.getResources()
						.getColor(R.color.falseaddress));
				if (mTrueDataSet.getIndexBean(
						_position - mTrueDataSet.size() - 2).getAddress() != null)
					mViewHolder.mDetailAdd.setText(mFalseDataSet.getIndexBean(
							position - mTrueDataSet.size() - 2).getCity()
							+ mFalseDataSet.getIndexBean(
									position - mTrueDataSet.size() - 2)
									.getArea()
							+ mFalseDataSet
									.getIndexBean(
											position - mTrueDataSet.size() - 2)
									.getAddress().trim());
			}
		}
		return convertView;
	}

	private static class ViewHolderItem {
		private TextView mName;
		private TextView mPhone;
		private TextView mDetailAdd;
		private RelativeLayout mAddLayout;
	}

	private static class ViewHolderTitle {
		private TextView mTitleName;
	}
}

  

时间: 2024-10-17 12:57:02

Listview 多个ViewHolder实现的相关文章

ListView优化为何ViewHolder用static类(转载)

如果有人还不了解ViewHolder为什么可以起到优化作用,我这边再做下简单说明:Android的findViewById动作是比较耗时的,需要遍历布局的树形结构,才能找到相应的视图.所以如果想在这一块进行优化,我们就需要把find过后的内容进行缓存,所以就用ViewHolder的方法. 这个方法很容易理解,但是可能有些人还是比较较真,就像我,这样可以起到缓存作用,那为什么内部类非得要声明成static的呢,普通的内部类不是也起到这样的效果吗?这个疑问也困扰了我很久.直到我看了<Effectiv

四种方案解决ScrollView嵌套ListView问题(转)

在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollView嵌套ListView结构的原因.这个结构碰到的问题.几种解决方案和优缺点比较,这4个方面来为大家阐述.分析.总结. 实际上不光是ListView,其他继承自AbsListView的类也适用,包括ExpandableListView.GridView等等,为了方便说明,以下均用ListView来代表. 一. 为什么要使用S

四种方案解决ScrollView嵌套ListView问题

在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollView嵌套ListView结构的原因.这个结构碰到的问题.几种解决方案和优缺点比较,这4个方面来为大家阐述.分析.总结. 实际上不光是ListView,其他继承自AbsListView的类也适用,包括ExpandableListView.GridView等等,为了方便说明,以下均用ListView来代表. 一. 为什么要使用S

Android Json数据的解析+ListView图文混排+缓存算法Lrucache 仿知乎

前几天心血来潮,打算根据看知乎的API自己做一个小知乎,定制的过程遇到ListView的优化问题及图片未缓存重加载等等许多问题,解决了以后打算和博友分享一下. 接口数据:http://api.kanzhihu.com/getpostanswers/20150925/archive 首先,Json数据太常用,相信每一位开发者Json的解析都是必备的.我们要准备以下知识: JavaBean,枚举你需要的元素,用来存储数据. 异步加载网络内容的必备途径,多线程加载+AsyncTask两种方式. Jso

?ScrollView、ListView嵌套

1.手动设置ListView高度 经过测试发现,在xml中直接指定ListView的高度,是可以解决这个问题的,但是ListView中的数据是可变的,实际高度还需要实际测量.于是手动代码设置ListView高度的方法就诞生了. /** * 动态设置ListView的高度 * @param listView */ public static void setListViewHeightBasedOnChildren(ListView listView) { if(listView == null)

Android listview的适配器以及各种监听、效率的提升

之前写过一篇关于listview的博客,现在感觉那篇博客关于listview认识不够全面.但有些方法还是可取,例如灵活的监听,写适配器.链接在这里android listview长按,单击各种事件捕捉.那个单击监听是一项项设置监听,效率也不好. 不断工作的过程,也是不断总结过程.现在对于listview有了更透彻的理解,所以重新写了一个实践demo.这个demo有涉及到listview的数据源,布局,适配器以及各种监听.效率的提升.现在对于这些理解,想写出一个通用的适配器,但发现还是有点困难,就

ScrollView与ListView冲突的四种解决办法

在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollView嵌套ListView结构的原因.这个结构碰到的问题.几种解决方案和优缺点比较,这4个方面来为大家阐述.分析.总结. 实际上不光是ListView,其他继承自AbsListView的类也适用,包括ExpandableListView.GridView等等,为了方便说明,以下均用ListView来代表. 一. 为什么要使用S

四种方法解决scrollview嵌套listview,listview高度确定问题

以下文章转自@安卓泡面 在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollView嵌套ListView结构的原因.这个结构碰到的问题.几种解决方案和优缺点比较,这4个方面来为大家阐述.分析.总结. 实际上不光是ListView,其他继承自AbsListView的类也适用,包括ExpandableListView.GridView等等,为了方便说明,以下均用ListView来代表

ListView与ScrollView冲突的4种解决方案

问题解决方案1.手动设置ListView高度    经过测试发现,在xml中直接指定ListView的高度,是可以解决这个问题的,但是ListView中的数据是可变的,实际高度还需要实际测量.于是手动代码设置ListView高度的方法就诞生了. /** * 动态设置ListView的高度 * @param listView */ public static void setListViewHeightBasedOnChildren(ListView listView) { if(listView