1. 程式人生 > >android UI進階之實現listview中checkbox的多選與記錄

android UI進階之實現listview中checkbox的多選與記錄

 今天繼續和大家分享涉及到listview的內容。在很多時候,我們會用到listview和checkbox配合來提供給使用者一些選擇操作。比如在一個清單頁面,我們需要記錄使用者勾選了哪些條目。這個的實現並不太難,但是有很多朋友來問我如何實現,他們有遇到各種各樣的問題,這裡就一併寫出來和大家一起分享。

ListView的操作就一定會涉及到item和Adapter,我們還是先來實現這部分內容。

首先,寫個item的xml佈局,裡面放置一個TextView和一個CheckBox。要注意的時候,這裡我設定了CheckBox沒有焦點,這樣的話,無法單獨點選checkbox,而是在點選listview的條目後,Checkbox會響應操作。

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="fill_parent"
  4.     android:layout_height="fill_parent"
  5.     android:orientation="horizontal">
  6.     <TextView
  7.         android:id="@+id/item_tv"
  8.         android:layout_width
    ="0dp"
  9.         android:layout_height="wrap_content"
  10.         android:layout_weight="1"
  11.         android:gravity="center_vertical"
  12.          />
  13.     <CheckBox
  14.         android:id="@+id/item_cb"
  15.         android:layout_width="wrap_content"
  16.         android:layout_height="wrap_content"
  17.         android:clickable="false"
  18.         android:focusable="false"
  19.         android:focusableInTouchMode="false"
  20.         android:gravity="center_vertical"
  21.         />
  22. </LinearLayout>

下面就寫一個Adapter類,我們依然繼承BaseAdapter類。這裡我們使用一個HashMap<Integer,boolean>的鍵值來記錄checkbox在對應位置的選中狀況,這是本例的實現的基礎。

  1. package com.notice.listcheck; 
  2. import java.util.ArrayList; 
  3. import java.util.HashMap; 
  4. import android.content.Context; 
  5. import android.view.LayoutInflater; 
  6. import android.view.View; 
  7. import android.view.ViewGroup; 
  8. import android.widget.BaseAdapter; 
  9. import android.widget.CheckBox; 
  10. import android.widget.TextView; 
  11. publicclass MyAdapter extends BaseAdapter{ 
  12.     // 填充資料的list
  13.     private ArrayList<String> list; 
  14.     // 用來控制CheckBox的選中狀況
  15.     privatestatic HashMap<Integer,Boolean> isSelected; 
  16.     // 上下文
  17.     private Context context; 
  18.     // 用來匯入佈局
  19.     private LayoutInflater inflater = null
  20.     // 構造器
  21.     public MyAdapter(ArrayList<String> list, Context context) { 
  22.         this.context = context; 
  23.         this.list = list; 
  24.         inflater = LayoutInflater.from(context); 
  25.         isSelected = new HashMap<Integer, Boolean>(); 
  26.         // 初始化資料
  27.         initDate(); 
  28.     } 
  29.     // 初始化isSelected的資料
  30.     privatevoid initDate(){ 
  31.         for(int i=0; i<list.size();i++) { 
  32.             getIsSelected().put(i,false); 
  33.         } 
  34.     } 
  35.     @Override
  36.     publicint getCount() { 
  37.         return list.size(); 
  38.     } 
  39.     @Override
  40.     public Object getItem(int position) { 
  41.         return list.get(position); 
  42.     } 
  43.     @Override
  44.     publiclong getItemId(int position) { 
  45.         return position; 
  46.     } 
  47.     @Override
  48.     public View getView(int position, View convertView, ViewGroup parent) { 
  49.         ViewHolder holder = null
  50.             if (convertView == null) { 
  51.             // 獲得ViewHolder物件
  52.             holder = new ViewHolder(); 
  53.             // 匯入佈局並賦值給convertview
  54.             convertView = inflater.inflate(R.layout.listviewitem, null); 
  55.             holder.tv = (TextView) convertView.findViewById(R.id.item_tv); 
  56.             holder.cb = (CheckBox) convertView.findViewById(R.id.item_cb); 
  57.             // 為view設定標籤
  58.             convertView.setTag(holder); 
  59.         } else { 
  60.             // 取出holder
  61.             holder = (ViewHolder) convertView.getTag(); 
  62.             } 
  63.         // 設定list中TextView的顯示
  64.         holder.tv.setText(list.get(position)); 
  65.         // 根據isSelected來設定checkbox的選中狀況
  66.         holder.cb.setChecked(getIsSelected().get(position)); 
  67.         return convertView; 
  68.     } 
  69.     publicstatic HashMap<Integer,Boolean> getIsSelected() { 
  70.         return isSelected; 
  71.     } 
  72.     publicstaticvoid setIsSelected(HashMap<Integer,Boolean> isSelected) { 
  73.         MyAdapter.isSelected = isSelected; 
  74.     } 

 註釋已經寫的非常詳盡了,通過

  1. holder.cb.setChecked(getIsSelected().get(position)); 

這行程式碼我們實現了設定CheckBox的選中狀況。

那麼我們只需要在點選事件中,控制isSelected的鍵值即可控制對應位置checkbox的選中了。

在Activity中我們除了放置一個ListView外,還放置了三個按鈕,分別實現全選,取消和反選。

看下Activity類的程式碼:

  1. package com.notice.listcheck;   
  2. import java.util.ArrayList;   
  3. import android.app.Activity;   
  4. 相關推薦

    android UI實現listviewcheckbox記錄

     今天繼續和大家分享涉及到listview的內容。在很多時候,我們會用到listview和checkbox配合來提供給使用者一些選擇操作。比如在一個清單頁面,我們需要記錄使用者勾選了哪些條目。這個的實現並不太難,但是有很多朋友來問我如何實現,他們有遇到各種各樣的問

    Android 動畫動畫切換

    ram 屏幕 pre 退出 tac 旋轉動畫 utf 轉動 XML 一、Activity切換動畫   在Android開發中,經常會遇到Activity之間切換效果,下面介紹一下,Activity左右滑動切換效果。在Android2.0以後版本,在Activity中添加了

    Android高階自定義View

    前言 在網上看到一張圖,花了些時間自己嘗試著寫了一個自定義View,裡面涉及到了自定義屬性、自定義View padding屬性的處理、畫筆(Paint)和畫布(Canvas)的使用、解析度適配問題、效能問題、屬性動畫等,覺得還是有些東西值的記錄一下的,效果圖如下: 自定義屬

    Android高階 TextInputLayout用法

    TextInputLayout見名知義與文字輸入有關係,TextInputLayout控制元件通過內嵌EditText來實現輸入文字時,根據預先設定的屬性向使用者展示相應的提醒文字並附有酷炫的動畫效果。例如,當文字框裡的字元長度大於10的時候自動給使用者提示,無需編寫額外的程

    Android開發NIO非阻塞包(二)

    有關Android NIO我們主要分為三大類,ByteBuffer、FileChannel和SocketChannel。由於篇幅原因今天Android123只對前兩個做說明。NIO和傳統的I/O比較大的區別在於傳輸方式非阻塞,一種基於事件驅動的模式,將會使方法執行完後立即返回

    Android開發NIO非阻塞包(三)

    有關Android NIO的精髓主要用於高負載的Socket網路傳輸,相對於傳統I/O模型的Socket傳輸方式的優勢,我們已經在 Android開發進階之NIO非阻塞包(一) 中講到了,這裡不再贅述,一起來看看Android NIO有關Socket操作提供的類吧: 一、S

    Android高手系列-正在進行

    作為物件的建立模式,單例模式確保某一個類只有一個例項,而且自行例項化並向整個系統提供這個例項。這個類稱為單例類。 單例模式的結構   單例模式的特點: 單例類只能有一個例項。 單例類必須自己建立自己的唯一例項。 單例類必須給所有其他物件提供這一例項。   餓漢式單例類 pu

    Android使用multidex(產生個dex)解決Dex超出方法數65535的限制

    1 概述 1.1 為什麼要拆包 隨著應用不斷迭代,業務線的擴充套件,應用越來越大(比如集成了各種第三方sdk或者公共支援的jar包,專案耦合性高,重複作用的類越來越多),出現了一個 dex 包裝不下的情況,出現65536問題。 1.2 為什麼方法數不能

    Android 高手自定義View,自定義屬性(帶進度的圓形進度條)

    很多的時候,系統自帶的View滿足不了我們功能的需求,那麼我們就需要自己來自定義一個能滿足我們需求的View,自定義View我們需要先繼承View,新增類的構造方法,重寫父類View的一些方法,例如onDraw,為了我們自定義的View在一個專案中能夠重用,有時候我們需要自定

    【SSH路】Hibernate對映——對一單向關聯對映(四)

    【SSH進階之路】Hibernate基本原理(一) ,小編介紹了Hibernate的基本原理以及它的核心,採用物件化的思維操作關係型資料庫。 【SSH進階之路】Hibernate搭建開發環境+簡單例項

    Android通過Adapter獲取ListView內容

    前言:獲取ListView中CheckBox多選值的方式多種多樣,比如利用setMultiChoiceModeListener這個介面通過監聽ListView獲取到選中值,也可以通過HashMap的鍵值來記錄CheckBox對應位置的選中狀態從而拿到選中值,

    路】執行緒池配置調優的一些高階選項(一)

    >這一篇的內容主要來自於《java併發程式設計實戰》,有一說一,看這種寫的很專業的書不是很輕鬆,也沒辦法直接提高多少開發的能力,但是卻能更加夯實基礎,就像玩war3,熟練的基本功並不能讓你快速地與對方拉開差距,但是卻能再每一次團戰中積累優勢。 ### 一、執行緒池的基礎 ### 1、執行緒池的相關屬性:

    路】執行緒池拓展CompletionService操作非同步任務

    > 大家好,我是練習java兩年半時間的南橘,小夥伴可以一起互相交流經驗哦。 ## 一、擴充套件ThreadPoolExecutor ### 1、擴充套件方法介紹 ![](https://img-blog.csdnimg.cn/img_convert/b805ebf5547556a68e75a50

    路】自定義註解介紹實戰

    在使用spring框架的時候,我們經常會感嘆註解式程式設計真是大大簡化了開發的時間,幾個小小的註解,就能解決一系列的配置問題,讓寫程式碼像寫詩一樣輕鬆明快。 我們都知道,在spring框架的前期,大多使用XML配置進行開發。XML配置起來有時候冗長,如實體類的對映,使用XML進行開發會顯得十分複雜。同時註解

    路】詳解資料庫事物隔離級別

    >這段時間忙於上線和重構、寫文章的是減少了很多,更新不得不變得遲緩起來~ ## 一、事務的特性 事務是指作為單個邏輯工作單元執行的一系列操作,**要麼都執行成功,要麼都執行失敗**。資料庫事物有四種特徵:即原子性、一致性、隔離性和永續性,也就是我們俗稱的 ACID 特性。事務處理可以確保除只有本事務單

    我的Android旅------&gt;Android二級ListView列表的實現

    cat -i gravity 寫真 技術分享 家政服務 個性 韓國 服務 實現例如以下圖所看到的的二級列表效果 首先是在布局文件裏,布局兩個ListView,代碼例如以下: <LinearLayout xmlns:android="htt

    Android高手教程(十六)---Android萬能的BaseAdapter(Spinner,ListView,GridView)的使用!

    private idt save idv -- imp drawable android中 welcome 大家好!今天給大家講解一下BaseAdapter(基礎適配器)的用法,適配器的作用主要是用來給諸如(Spinner,ListView,GridView)來填充數據的。

    AndroidListView實現條資料同時倒計時功能

    1 概述 最近在做一個網購APP,有個小功能就是限時搶購商品在限定時間內有優惠活動,我們需要給每個件商品做一個倒計時顯示告訴使用者還剩下多少時間。專案中我們有用到ListView和GridView來載入我們的商品資料,對每條資料(對應一件商品)進行倒計時。倒計

    我的Android旅------&gt;Androidandroid:windowSoftInputMode的使用方法

    onf ecif 標簽 ear evel per another not 行為 面試題:怎樣在顯示某個Activity時馬上彈出軟鍵盤? 答案:在AndroidManifest.xml文件裏設置<activity>標簽的android:win

    我的Android旅------&gt;怎樣在個LinearLayout加入分隔線

    lai tex pre draw white 方法 utf == 技術分享 假設要適合於全部的Android版本號,能夠在多個LinearLayout放置用於顯示分隔線的View。比如,放一個ImageView組件。然後將其背景設為分隔線的顏色或圖像,分隔線