ListView實用指南

最近編碼中遇到和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"},//定義要顯示的mapkey
        new int[]{R.id.remarkInList,R.id.dateInList,R.id.spendMoneyInList}//用來顯示的id
        );

listView.setAdapter(simpleAdapter);//設置顯示數據
這樣我們九完成看自定義模板的顯示


ListView中的增刪改操作的實現

我們用listview的目標肯定不止於此,更多的時候我們需要動態的來添加,刪除,修改listview中的內容.這樣的話我們就需要自定義一個數據集和adapter來操作了.
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的OnItemClickListener,OnItemSelectedListener,OnItemLongClickListener來完成對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;
    }
}

本文到此結束,demo我稍後上傳,歡迎大家指出文中不足之處,共同進步.


發佈了22 篇原創文章 · 獲贊 14 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章