Android学习心得第三课

来源:互联网 发布:javascript动态效果图 编辑:程序博客网 时间:2024/05/22 13:04

今天学习了Android的一个重要的控件listview,最近的学习状态和前几天相比,下降的还是比较明显的,这里要给自己提一个醒,千里之行始于足下,后面一定要珍惜时间,戒骄戒躁。
下面来对listview进行一个总结,listview顾名思义是一个列表形式的控件,表现的形式如下图所示,这里采用的就是listview的形式来排列的。

这里写图片描述

要完成相应的视图可以用到两种适配器,分别是 ArrayAdapter 和SimpleAdapter这两种适配器,下面分别对这两种适配器进行讲解。

public class MainActivity extends Activity implements OnItemClickListener,OnScrollListener{    private ListView lv;    private ArrayAdapter<String> arr_adapter;    private SimpleAdapter simadapter;    private List<Map<String, Object>>datalist;    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        lv = (ListView) findViewById(R.id.listView);        //1、新建一个适配器        //2、ArrayAdapter的函数的第一个参数是上下文        //3、第二个参数是当前的listview的每一个列表项所对应的布局文件                                                                                                                          //4、第三个参数是数据源        String[] arr_data={"慕课网1","慕课网2","慕课网3","慕课网4"};        arr_adapter = new ArrayAdapter<String>        (this, android.R.layout.simple_list_item_1, arr_data);        datalist = new ArrayList<Map<String,Object>>();        //加载适配器          lv.setAdapter(arr_adapter);    }    private List<Map<String, Object>> getData(){        for(int i=0;i<20;i++){           //在datalist中插入数据            Map<String, Object>map = new HashMap<String, Object>();            map.put("pic",R.drawable.ic_launcher);            map.put("text", "CCNU"+i);            datalist.add(map);        }        return datalist;    }}

运用SimpleAdapter,代码如下:

public class MainActivity extends Activity implements OnItemClickListener,OnScrollListener{    private ListView lv;    private ArrayAdapter<String> arr_adapter;    private SimpleAdapter simadapter;    private List<Map<String, Object>>datalist;    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        lv = (ListView) findViewById(R.id.listView);     /*         * SimpleAdapter解析         * 1、第一个参数是上下文         * 2、第二个参数是数据源,data的形式是List<? extends Map<String, ?>> data         *                 data必须是一个map组成的list集合         *                 每一个map代表的是listview列表中的每一行          *                 每一个map(键-值)中的键必须包含所有在from中指定的键         * 3、第三个参数是列表项的布局文件ID         * 4、from:map中的键名         * 5、to:绑定数据视图中的ID,与from成相对关系         */        datalist = new ArrayList<Map<String,Object>>();        simadapter = new SimpleAdapter(this, getData(), R.layout.main, new String[]{"pic","text"}, new int[]{R.id.pic,R.id.text});        //加载适配器         lv.setAdapter(simadapter);        lv.setOnItemClickListener(this);        lv.setOnScrollListener(this);    }    private List<Map<String, Object>> getData(){        for(int i=0;i<20;i++){            Map<String, Object>map = new HashMap<String, Object>();            map.put("pic",R.drawable.ic_launcher);            map.put("text", "CCNU"+i);            datalist.add(map);        }        return datalist;    }    public void onScrollStateChanged(AbsListView view, int scrollState) {       switch (scrollState) {        case SCROLL_STATE_FLING:            Log.i("main","手指在离开屏幕前,由于用力滑动了一下,导致视图仍旧依靠惯性滑动");//这里为了实现下拉刷新功能,用map将新的数据加入进去            Map<String, Object>map = new HashMap<String, Object>();            map.put("pic", R.drawable.ic_launcher);            map.put("text", "增加项");            datalist.add(map);、//这句话非常的重要,因为仅仅用map将数据加入进去是无法再页面上进行显示的,因为map仅仅会  实现后台上数据的一个增加,要想让UI界面同时进行一个刷新,就必须借助于notifyDataSetChanged函数来实现UI界面上的一个更新            simadapter.notifyDataSetChanged();            break;           case SCROLL_STATE_IDLE:            Log.i("main", "视图停止滑动");             case SCROLL_STATE_TOUCH_SCROLL:            Log.i("main", "手指没有离开屏幕,视图正在滑动");            break;        }    }    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {        // TODO Auto-generated method stub        String text = lv.getItemAtPosition(position)+"";          Toast.makeText(this,"position="+position+"text="+text,Toast.LENGTH_SHORT).show();    }}

最后在这里要特别提醒一下,我在编写程序犯了一个非常愚蠢的错误,setContentView(R.layout.activity_main)这句话被我写成了setContentView(R.layout.main);,main这个xml是我写的listview里面每一行的样式,而activity_main是包含listview的整个页面的布局,必须从这个页面启动,才能实现相应的效果。 simadapter = new SimpleAdapter(this, getData(), R.layout.main, new String[]{“pic”,”text”}, new int[]{R.id.pic,R.id.text});这句里面的R.layout.main这个参数就是告诉适配器listview里面的每一行的样式是用该main.xml下的样式。

0 0