LIstView 适配器 (Item事件)
来源:互联网 发布:mono for mac os x 编辑:程序博客网 时间:2024/05/05 19:47
一直以来觉得很懂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(), // 当前Activityandroid.R.layout.simple_expandable_list_item_1, // 样式 系统自带(很多的)stringsDate); // 数据源listView.setAdapter(arrayAdapter);}
比较适合用规律,统一大方、在数据和样式之间是“一一对应式”,其中数据源为List<Map<String, Object>> 也就是list里面放Map键值对,必须为这种数据源,后面会发现它的巧妙之处,继续看效果图!
/** * SimpleAdapter 适配器 */ public void ListViewData2() {//调用数据源List<Map<String, Object>> list=Data();SimpleAdapter simpleAdapter = new SimpleAdapter(getApplicationContext(), //当前 Activitylist, //数据 必须 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);}
就是从数据库比如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 可以不重写只是拿出来看看@Overridepublic void notifyDataSetChanged() {super.notifyDataSetChanged();}// 显示的ListView的长度@Overridepublic int getCount() {return list.size();}// 当前位置@Overridepublic Object getItem(int position) {return position;}// 可以返回id,间接传递到了list.setOnItemClickListener (Item事件函数long arg3 最后个)@Overridepublic long getItemId(int position) {return 12345;}/** * 最重要的方法getView 1.int position 位置 2.View convertView当前view 绑定的View * 3父类原始的 用的比较少 */@Overridepublic 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() {@Overridepublic void onClick(View v) {System.out.println("回复》》》》》》》");}});holder.Image_List_zanBut.setOnClickListener(new OnClickListener() {@Overridepublic 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就获得事件源!别的暂时木有了,后期再补.....
源代码:点击打开链接
- LIstView 适配器 (Item事件)
- ListView、GridView适配器只操作指定item
- android ListView Item 点击事件
- PopupWindow响应ListView Item事件
- ListView Item点击事件失效
- ListView item点击事件失效
- listview中的item增加事件
- listview捕获点击item事件
- ListView的item点击事件
- listview <二> item点击事件
- ListView中的item点击事件
- android listview系列之item的点击事件及item布局中的点击事件(四)
- Fragment中ListView的Item的点击事件(包含Item内部控件的点击事件)
- 解决ListView中Item的子控件(比如Button)与Item点击事件冲突
- ListView 适配器(Adapter)
- ListView(自定义适配器)
- android屏蔽listview 的item事件
- ListView中Item点击事件失效
- JavaScript数组函数总结
- NULL和0以及'\0'
- POJ1251-Jungle Roads
- 3款 jquery tab
- google 找后台
- LIstView 适配器 (Item事件)
- JavaScript编程:java事件模型
- java方法重载深层思考
- 自定义用户
- sql语句的使用(三)
- UVAOJ 253-cube painting
- JavaScript编程:浏览器对象模型BOM
- 多线程总结-----黑马程序员
- s3c2410 MMU 启用后设置中断跳转指令遇到的问题