LIstView 适配器 (Item事件)

一直以来觉得很懂ListView,什么适配器!原来在开发的时候问题就全部出来,简单对listVIew谈谈理解,listView就是一行一行有规律,有顺序的排列、统一数据样式!

以下谈谈它的适配器,为什么需要适配器呢?原来listView是一种标准的MVC模式,模型-----视图-----控制器 (三者组成)   说白了,listView就是空壳、要啥没啥,没有数据、没有样式、没有组件、就是一个躯壳,需要你往里面添油加醋什么的...  拿什么来添加呢? 对!1.数据源   2.布局文件(组件)

listVIew有三种适配器:1.ArrayAdapter   2.SimpleAdapterActivity   3.SimpleCursorAdapterActivity   4.BaseAdapter(自定义适配器)

各种适配器有自己的优势、在不用的需求情况下,发挥独特亮点,本人在SimpleCursorAdapterActivity (和数据库打交道数据适配) 用的比较少、所以没怎么研究!


一、ArrayAdapter   

一行显示、一段代码搞定,比较普通,系统自带样式,多用于选择信息方面,后期维护比较麻烦,也说明一个道理:简单的东西,扩展麻烦,是件麻烦的事!


	/**
	 * ArrayAdapter 适配器 数据支持<T> 泛型
	 */
	public void ListViewData1() {
		String[] stringsDate = { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六",
				"星期日", };
		ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
				getApplicationContext(), // 当前Activity
				android.R.layout.simple_expandable_list_item_1, // 样式 系统自带(很多的)
				stringsDate); // 数据源
		listView.setAdapter(arrayAdapter);
	}



二、SimpleAdapterActivity 

比较适合用规律,统一大方、在数据和样式之间是“一一对应式”,其中数据源为List<Map<String, Object>> 也就是list里面放Map键值对,必须为这种数据源,后面会发现它的巧妙之处,继续看效果图!


/**
	 * SimpleAdapter 适配器
	 */
       public void ListViewData2() {
	//调用数据源
	List<Map<String, Object>> list=Data();
	SimpleAdapter simpleAdapter = new SimpleAdapter(
			getApplicationContext(),  			  //当前 Activity
			list,						  //数据 必须  List<? extends Map<String, ?>>  类型
			R.layout.item,   				  //每个item的样式 也就是布局文件(是每一行的布局)
			new String[] {"Imag", "Name", "Age" },  	  //Map中的K  (巧妙之处)
			new int[] { R.id.ImageView,R.id.Name, R.id.Age }  //item中的属性id
			);
	listView.setAdapter(simpleAdapter);
	}



三、SimpleCursorAdapterActivity   
就是从数据库比如SQLitem读出的数据显示比较方便、开发还未用到过,所以没啥好说,等以后遇到了在继续补上,呵呵!


四、BaseAdapter 

好了、关键来了,也是最重要,最常用的适配器,灵活、等特性..... 

继续看图叻.....



主要的功能是BaseAdapter适配器,主要功能点击每一行的Item下方出现俩个控件,点击别的Item原来的取消,当前下方继续显示俩控件!

/**
	 * 自定义适配器、
	 * 
	 * @author
	 */
	public class ListViewBaseAdapter extends BaseAdapter {
		// 数据源
		List<Map<String, Object>> list = Data();
		LayoutInflater layoutInflater; // 布局


		public ListViewBaseAdapter(Context context) {
			this.layoutInflater = LayoutInflater.from(context);
		}


		// 数据一单被修改,就刷新listView 可以不重写只是拿出来看看
		@Override
		public void notifyDataSetChanged() {
			super.notifyDataSetChanged();
		}


		// 显示的ListView的长度
		@Override
		public int getCount() {
			return list.size();
		}


		// 当前位置
		@Override
		public Object getItem(int position) {
			return position;
		}


		// 可以返回id,间接传递到了list.setOnItemClickListener (Item事件函数long arg3 最后个)
		@Override
		public long getItemId(int position) {
			return 12345;
		}


		/**
		 * 最重要的方法getView 1.int position 位置 2.View convertView当前view 绑定的View
		 * 3父类原始的 用的比较少
		 */
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			ViewHolder holder; // 控件集合
			// 观察convertView随ListView滚动情况
			Log.v("MyListViewBase", "getView " + position + " " + convertView);
			// 由于要刷新、所以开始都是为null、
			if (convertView == null) {
				convertView = layoutInflater.inflate(R.layout.item_list, null);
				holder = new ViewHolder();
				holder.Name = (TextView) convertView.findViewById(R.id.Name);
				holder.Age = (TextView) convertView.findViewById(R.id.Age);
				holder.bt = (ImageView) convertView
						.findViewById(R.id.ImageView);
				holder.LinearLayoutImag = (LinearLayout) convertView
						.findViewById(R.id.LinearLayoutImag);
				holder.Image_List_repBut = (ImageButton) convertView
						.findViewById(R.id.Image_List_repBut);
				holder.Image_List_zanBut = (ImageButton) convertView
						.findViewById(R.id.Image_List_zanBut);
				// 绑定ViewHolder对象
				convertView.setTag(holder);
			} else {
				// 取出组件
				holder = (ViewHolder) convertView.getTag();
			}
			// 数据处理、赋值
			holder.Name.setText(list.get(position).get("Name").toString());
			holder.Age.setText(list.get(position).get("Age").toString());
			holder.bt.setBackgroundResource(R.drawable.ic_launcher);


			// 判断,点击Item是否显示(具体可下载代码浏览)
			if (position == currentPosition) {
				System.out.println("等于");
				holder.LinearLayoutImag.setVisibility(View.VISIBLE);
				holder.Image_List_repBut.setClickable(true);
				holder.Image_List_zanBut.setClickable(true);
				holder.Image_List_repBut
						.setOnClickListener(new OnClickListener() {


							@Override
							public void onClick(View v) {
								System.out.println("回复》》》》》》》");
							}
						});


				holder.Image_List_zanBut
						.setOnClickListener(new OnClickListener() {


							@Override
							public void onClick(View v) {
								System.out.println("攒》》》》》》》");


							}
						});


			} else {
				System.out.println("不等于!");
				holder.LinearLayoutImag.setVisibility(View.GONE);
				holder.Image_List_repBut.setClickable(false);
				holder.Image_List_zanBut.setClickable(false);
			}
			return convertView;
		}


	}

简单总结下: listView一般只是加载当前能够显示的Item数据、出现了就开始绘制,所以在处理要注意,在控件上如果有Button......什么的会优先夺取ListVIew事件,所以必须把Button的事件去掉,***.setClickable(false); 这样Item就获得事件源!别的暂时木有了,后期再补.....

源代码:点击打开链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值