今天学习了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下的样式。