Android UI 之 ListView
来源:互联网 发布:arcgis能安装在mac吗 编辑:程序博客网 时间:2024/06/07 19:35
一、ListView的三要素
1、ListView本身
在主布局中添加ListView控件,用来显示列表
2、数据源
ListView要显示的内容
3、适配器
将数据源匹配到指定行模板(一个布局文件),并将每行集中“添加”到ListView中,是数据源与ListView结合起来的关键纽带
二、ListView的两种常用适配器
1、ArrayAdapter
ArrayAdapter适用于每行只简单显示字符串的ListView
ArrayAdapter的常用的构造方法有三个参数
一个是Context对象,一个行模板布局文件以及数据源(数据源都是List类)
ListView通过setAdapter的方法设置指定的适配器对象
ListView通过setOnItemClickListener方法为每一行设置监听事件
private void init(){ view= (ListView) findViewById(R.id.root_list); data=getData(); adapter=new ArrayAdapter(this,android.R.layout.simple_list_item_1,data); view.setAdapter(adapter); view.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { TextView textView= (TextView) view.findViewById(android.R.id.text1); Toast.makeText(ArrayAdapterActivity.this, "点击了"+textView.getText(), Toast.LENGTH_SHORT).show(); } }); }
2、SimpleAdapter
仅仅只是简单的文字列表有时是无法满足用户需求,如果需要每一行能显示更多样化的元素,不妨使用一下SimpleAdapter。
其实SimpleAdapter与ArrayAdapter很类似,唯一区别在与构造方法的使用上,以及数据源稍稍改变
SimpleAdapter的常用构造方法是带5个参数的
分别是当前上下文对象,数据源,行模板布局,剩下两个是from,to就是从数据源一一映射到行模板上
adapter=new SimpleAdapter( getContext(), list, R.layout.simple_adapter_layout, new String[]{"image_s","title_s","info_s"}, new int[]{R.id.image_s,R.id.title_s,R.id.info_s} );
数据源的获取方法:List列表下的是一个Map键值对集合,因为要映射的内容较多,当然也可以是类对象的列表
public List<Map<String,Object>> getData(){ List<Map<String,Object>> dlist=new ArrayList<>(); Map<String,Object> data=new HashMap<>(); data.put("image_s",R.mipmap.icon_broswer_green); data.put("title_s","浏览"); data.put("info_s","绿色的浏览图标"); dlist.add(data); data=new HashMap<>(); data.put("image_s",R.mipmap.icon_debug_green); data.put("title_s","调试"); data.put("info_s","绿色的调试图标"); dlist.add(data); data=new HashMap<>(); data.put("image_s",R.mipmap.icon_refresh_green); data.put("title_s","刷新"); data.put("info_s","绿色的刷新图标"); dlist.add(data); data=new HashMap<>(); data.put("image_s",R.mipmap.icon_share_green); data.put("title_s","分享"); data.put("info_s","绿色的分享图标"); dlist.add(data); return dlist; }
三、自定义ListView
虽然SimpleAdapter可以丰富的显示每一行,但每一行的控件并无法响应监听事件,例如按钮点击了没有设定好的点击效果,为了满足这一需求就必须自定义ListView,说白了就是自定义Adapter。
以下是我自定义Adapter,通过新建一个类然后继承BaseAdapter,并实现四个方法
其中的关键方法是getView,在实现getView方法前先定义一个内部类ViewHolder在存放行模板的每一个部件(优化ListView,减少内存与时间的消耗),然后在getView中通过Inflater动态加载行模板布局文件,绑定每一个部件后,并设置相应的值或状态。最后在主Activity中通过setAdapter方法设置适配器为自定义的Adapter即可
package com.example.yougel.listviewdemo;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.ImageView;import android.widget.TextView;import android.widget.Toast;import java.util.List;public class CustomBtnAdapter extends BaseAdapter { private Context context; private List<User> users; private LayoutInflater inflater; public CustomBtnAdapter(Context context, List<User> users) { this.context = context; inflater=LayoutInflater.from(context); this.users = users; } private final class ViewHolder{ private ImageView image_cb; private TextView username_cb; private TextView age_cb; private Button btn_cb; } @Override public int getCount() { return users.size(); } @Override public Object getItem(int position) { return null!=users.get(position)?users.get(position):null; } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; final User user= (User) getItem(position); if(convertView==null){ convertView=inflater.inflate(R.layout.custom_cb_layout,null); viewHolder=new ViewHolder(); viewHolder.image_cb= (ImageView) convertView.findViewById(R.id.image_cb); viewHolder.username_cb= (TextView) convertView.findViewById(R.id.username_cb); viewHolder.age_cb= (TextView) convertView.findViewById(R.id.age_cb); viewHolder.btn_cb= (Button) convertView.findViewById(R.id.btn_cb); final ViewHolder finalViewHolder=viewHolder; viewHolder.btn_cb.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {// User btnUser= (User) finalViewHolder.btn_cb.getTag(); int num= (int) finalViewHolder.btn_cb.getTag(); Toast.makeText(context,"点击了第"+(num+1)+"行",Toast.LENGTH_SHORT).show(); } }); convertView.setTag(viewHolder); viewHolder.btn_cb.setTag(position); }else { viewHolder= (ViewHolder) convertView.getTag(); viewHolder.btn_cb.setTag(position); } String age=String.valueOf(user.getAge()); viewHolder.image_cb.setBackgroundResource(user.getImgId()); viewHolder.username_cb.setText(user.getUsername()); viewHolder.age_cb.setText(age); return convertView; }}
以上的编码方式涉及到ListView的优化内容,优化的详细请参考以下网址
http://blog.csdn.net/huanongjingchao/article/details/42918869
- Android UI 之 ListView
- Android UI 之ListView组件
- Android学习之 UI--ListView
- Android基础UI之ListView
- Android之UI- listview特别的属性
- Android的UI组件之ListView(三)
- android UI之ListView的自定义
- Android UI之最优ListView写法
- Android UI控件之ListView&RecyclerView
- Android UI之最优ListView写法
- Android开发学习之路--UI之ListView
- Android开发学习之路--UI之ListView
- Android UI学习 - ListView
- Android UI学习 - ListView
- Android UI学习 - ListView
- Android UI:ListActivity & ListView
- Android+UI学习+-+ListView
- Android UI: Listview & ListActivity
- ADF(BC)--获取数据库记录字段的旧值
- MFC下的格式转换
- 《R语言初学指南》读后感
- 王爽汇编第二册:将每个单词的前四位改为大写字母
- 20160918
- Android UI 之 ListView
- Java死锁实例代码
- 深入理解CSS3 Animation 帧动画(step详解)
- Android6.0发送短信Demo
- java基础知识
- Unity Editor(二)C#特性与Editor
- ANSI C,C90,C99
- mac下安装docker
- java基础知识(续)