工作内容:
1.ListView,ArrayAdapter.简单适配器(主要用于单一的文本)
2.SimpleAdapter:构造方法SimpleAdapter(Context context,List<Map<String,?>> data,reString [] from,int [] to)
3.自定义适配器继承BaseAdapter,主要方法:getView(int position,View convertView,ViewGroup parent)
4.优化自定义适配器:
①.判定convertView是否为空 【convertView==空的次数是可见列表项数+2】
②.定义一个Holder来减少findViewById的反复使用
5.ListView进阶版之ListView.addHeaderView(View view);
6.ListView让最后一项显示出来的2种方法
学习分享:
这里我就写下对ArrayAdapter,SimpleAdapter和常用自定义适配器继承于BaseAdapter
1.ArrayAdapter就不多说,使用方法参照下面图片
2.SimpleAdapter的使用
在使用它时,最简单的方法是使用构造函数:
SimpleAdapter adapter = newSimpleAdapter(Context context,List<Map<String,?>> data,String [] from,int [] to)
参数:context — 上下文,data — 是一个List<Map<String,?>>,from — 是List中Map的键组成的数组,to — 是自定义list_item.xml中组件ID值数组【需对应前面的from,一一对应,这样在放数据进去的时候才不会乱】
3.自定义适配器继承BaseAdapter
实例:
//List中存放的类(数据存放类) public class User { private String name,pwd; public User(String name, String pwd) { this.name = name; this.pwd = pwd; } public String getName() { return name; } public String getPwd() { return pwd; } } public class MyAdapter extends BaseAdapter { private Context context = null; private int resourceID = 0; private List<User> list = null; /** * 构造函数 * @param context 上下文(ListView所在的Activity) * @param resourceID 布局文件ID(自己创建的一个布局文件,将要显示在ListView项中) * @param list 数据(在ListView显示的数据) */ public MyAdapter(Context context, int resourceID, List<User> list) { this.context = context; this.resourceID = resourceID; this.list = list; } //返回给LiesView,给它说需要显示的项(item)有多少 @Override public int getCount() { return list.size(); } //返回当前项对应的对象 @Override public Object getItem(int position) { return list.get(position); } //返回当前项的位置 @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { User user = (User) getItem(position); ViewHolder viewHolder = new ViewHolder(); /** * 1.如果没有解析过布局文件则去解析,解析过则不解析 * 2.用解析过后得到的view找到布局文件中的文件 * 3.并赋值给viewHolder的属性——以后这个属性就可以重复使用,不再需要去findViewById */ if(convertView == null){ convertView = LayoutInflater.from(context).inflate(resourceID,null); viewHolder.textName = (TextView)convertView.findViewById(R.id.textViewName_yellowpage_sonpage); viewHolder.textNumber = (TextView)convertView.findViewById(R.id.textViewNumber_yellowpage_sonpage); //给convertView设置附加数据 convertView.setTag(viewHolder); }else{ //从convertView拿去附加数据 viewHolder = (ViewHolder) convertView.getTag(); } //设置对应组件显示的内容 viewHolder.textName.setText(user.getName()); viewHolder.textNumber.setText(user.getPwd()); return convertView; } } /** * “持有者”类 * 用于优化适配器 * 用一个对象放置所有组件 * 这样就只需要一次findViewById(耗时,耗内存的操作) */ class ViewHolder{ TextView textName,textNumber; } listView.setAdapter(adapter); listView.setOnItemClickListener(this);
【convertView==null的次数是:可见列表项数+2】
//调用(在一个Activity中的onCreate去用一个ListView组件调用)
...
listView = (ListView)findViewById(R.id.listView_yellowpage_sonpage);
//初始化MyAdapter adapter = new MyAdapter(this,R.layout.list_yellowpage_sonpage,list);//给listView添加适配器
//设置事件监听
...
注意事项:
当数据发生改变时,需提醒适配器,这样才可以达到数据变,内容就变
adapter.notifyDataSetChanged();
4.ListView进阶版之ListView.addHeaderView(View view);
注意:<span style="font-size:14px;">//先初始化ListView View view = LayoutInflater.from(getContext()).inflate(R.layout.layout_contactlist_head, null, true); listView.addHeaderView(view);//必须放在setAdapter()之前 adapter = new ArrayAdapter<String>(getContext(), android.R.layout.simple_list_item_1);//添加布局文件 adapter.addAll(usernames);//添加数据 listView.setAdapter(adapter); listView.setOnItemClickListener(this);</span>
listView.addHeaderView(view);//必须放在setAdapter()之前
listView添加项点击事件后。点击的项是1,获取到的数据项应该是0,因为header占了一个项的位置
5.ListView滚动到最后一项
方式一:Java中动态加载(推荐)
listView.setSelection(listAdapter.getCount() - 1);
方式二:xml中设置/Java设置【操作相同属性】
(项比较少的时候会显示在屏幕下方——上面空白,添加项的时候会将项往上面赶)
android:stackFromBottom="true"
android:transcriptMode="alwaysScroll"
java代码设置这样的属性也可以:
listView.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
listView.setStackFromBottom(true);