Android中ListView与适配器ArrayAdapter,SimpleAdapter,定义BaseAdapter适配器,ListView添加headerView,ListView滚动到最后一项

来源:互联网 发布:模块化编程的好处 编辑:程序博客网 时间:2024/06/05 07:16

工作内容:

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;">//先初始化ListViewView 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);

1 0
原创粉丝点击