最近編碼中遇到和ListView有關的問題,索性在幹完活之後寫一整個博客出來,一方面是分享給大家一起學習,二來是讓自己理一理全部的思路.
ListView控件採用了MVC模式將前段顯示和後端數據進行分離.也就是說ListView加載數據時不是簡單的一個listview.add來添加,而是先加數據添加到控制器(Adapter),再將adapter中的數據添加到listview.ListView幾乎用在了所有APP中,要顯示大量有序數據的話ListView無疑是最好的選擇.我將分爲簡單Listview實現,自定義ListView,ListView增刪改操作的實現,ListView事件獲取四個方面來介紹.
簡單ListView實現
在操作ListView前,我們先要定義一個ListView控件.
<ListView android:id="@+id/listview" android:layout_width="fill_parent" android:layout_height="wrap_content"> </ListView>
在向ListView裝載數據前需要定義一個adapter.
其中this來獲取上下文對象,
android.R.layout.simple_list_item_1,用來指定ListView顯示模板,一般來說我們會自定義一個模板,這裏用的是AndroidSDK提供的模板,你可以在
<Android SDK安裝目錄>\platforms\android-\data\layout目錄找到.
data是我們要顯示的數據集,這裏我定義了一個數據集data
private String[] data=new String[]{"第一行", "第二行", "第三行", "第四行", "第五行", "第六行", "第七行", "第八行", "第九行", "第十行", "第十一行", "第十二行", "第十三行", "第十四行"};
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, R.layout.list_item,data); listView.setAdapter(adapter);
運行之後就可以顯示了.要在加載時九選定某一行,可以添加如下代碼,這樣就默認選中第12行.
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,data); listView.setAdapter(adapter); listView.setSelection(12);
自定義ListView模板的實現
很多時候由於SDK提供的模板不足以滿足我們的要求,我們需要自定義模板,來完成我們自己的數據顯示.比如說我需要實現如下界面
這時候我們就需要定義自己的模板.在layout下新建資源文件list_item
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:descendantFocusability="blocksDescendants" android:layout_width="match_parent" android:layout_height="64dp"> <RelativeLayout android:layout_weight="3" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_marginLeft="10dp" android:layout_centerVertical="true"
android:orientation="vertical"android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/remarkInList" android:focusable="true" android:textSize="22dp" android:textStyle="bold" android:singleLine="true" android:layout_width="wrap_content" android:layout_height="match_parent" /> <TextView android:id="@+id/dateInList" android:layout_marginTop="10dp" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> </RelativeLayout> <LinearLayout android:layout_marginRight="10dp" android:layout_weight="4" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:text=" ¥ " android:textSize="30dp" android:layout_gravity="center_horizontal|center_vertical" android:gravity="center_vertical|center_horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/spendMoneyInList" android:layout_width="wrap_content" android:layout_height="match_parent" android:textSize="30dp" android:textStyle="bold" android:singleLine="true" android:focusable="true" android:layout_gravity="center_horizontal|center_vertical" android:gravity="center_vertical|center_horizontal" /> </LinearLayout></LinearLayout> 在代碼中定義好要顯示的數據集後,在代碼中實現
List<Map<String,String>> list=new ArrayList<>();//保存list數據 for (int x=0;x<data.length;x++){ Map<String,String>map=new HashMap<>();//定義map集合 map.put("data",data[x]); map.put("date",date[x]); map.put("text",text[x]); list.add(map);//增加數據 } SimpleAdapter simpleAdapter=new SimpleAdapter(this,//實例化Simpleadapter list,//要包裝的數據集和 R.layout.list_item,//模板 new String[]{"data","date","text"},//定義要顯示的map的key new int[]{R.id.remarkInList,R.id.dateInList,R.id.spendMoneyInList}//用來顯示的id ); listView.setAdapter(simpleAdapter);//設置顯示數據這樣我們九完成看自定義模板的顯示
ListView中的增刪改操作的實現
public class myListViewAdapterDates { String remark,money,date,unixTime; public String getUnixTime() { return unixTime; } public void setUnixTime(String unixTime) { this.unixTime = unixTime; } public String getMoney() { return money; } public void setMoney(String money) { this.money = money; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } public myListViewAdapterDates() { } public myListViewAdapterDates(String remark, String date, String money) { this.remark = remark; this.date = date; this.money = money; this.date = date; } }
public class myListViewAdapter extends BaseAdapter { private Context context; private List<myListViewAdapterDates> datas = new ArrayList<myListViewAdapterDates>();//定義要顯示的list集合 public myListViewAdapter(Context context,List<myListViewAdapterDates> datas) { this.context = context; this.datas=datas; } @Override public int getCount() { if (datas == null) return 0; return datas.size(); } @Override public Object getItem(int position) { return datas.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { convertView = View.inflate(context, R.layout.list_item,null); myListViewAdapterDates entity = datas.get(position);//從list集合中取出數據並現實到頁面中 ((TextView) convertView.findViewById(R.id.remarkInList)).setText(entity.getRemark()); ((TextView)convertView.findViewById(R.id.dateInList)).setText(entity.getDate()); ((TextView)convertView.findViewById(R.id.spendMoneyInList)).setText(entity.getMoney()); return convertView; } /** 移除item數據 */ public void delData(int position) { if (datas != null && datas.size() > 0) datas.remove(position);// 移除指定數據 } public void removeAll(){ datas.clear(); } }接下來我們在代碼中實現listview與adapter的綁定.與增刪改的實現.
public class Activity2 extends Activity { private myListViewAdapter adapter; private ListView listView; private List<myListViewAdapterDates> Arrays = new ArrayList<>(); private static int count = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView= (ListView) findViewById(R.id.listview); adapter=new myListViewAdapter(this,Arrays);//綁定adapter與數據集 listView.setAdapter(adapter); } public void add(int position,String remark, String money, String date){//增加列表項到指定位置 myListViewAdapterDates dates=new myListViewAdapterDates(); dates.setDate(date); dates.setRemark(remark); dates.setMoney(money); Arrays.add(position,dates);//增加列表項到指定位置 0代表最頂端 adapter.notifyDataSetChanged(); count++; } public void modify(int position,String remark, String money, String date){//修改指定列表項內容 /** * 我們可以先刪掉指定項內容,然後在次進行修改 * ***/ del(position); add(position,remark, money, date); } public void del(int position){//刪除指定列表項 adapter.delData(position); adapter.notifyDataSetChanged(); if (count > 0) count--; } public void delAll(){//刪除所有列表項 adapter.removeAll(); adapter.notifyDataSetChanged(); } }
ListView事件獲取
listView.setOnItemClickListener(new OnItemClickListener1());//列表項點擊事件 listView.setOnItemSelectedListener(new OnItemSelectedListener1());//列表項選擇事件 listView.setOnItemLongClickListener(new ItemLongClickListener1());//列表項長按事件
private class OnItemClickListener1 implements android.widget.AdapterView.OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //列表項點擊後處理 } } private class OnItemSelectedListener1 implements AdapterView.OnItemSelectedListener { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { //列表項選擇後處理 } @Override public void onNothingSelected(AdapterView<?> parent) { //列表項無選擇處理 } } private class ItemLongClickListener1 implements AdapterView.OnItemLongClickListener { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { //列表項長按處理 return false; } }