Android ListView 多選狀態 checked state
這幾天在處理 ListView 多選的功能
首先是自定義的 List Item。
要在 List Item 最外層的 Layout 實作 Checkable Interface
以下為參考各路好漢後,所歸納整理出的程式碼
———————————————————————
—————————————————————————————————————————
自定義的多選功能搞定後
再來是選項數量有上限的限制。
試了半天 AdapterView.OnItemSelectedListener 在多選的 ListView 中無反應
只有 AdapterView.OnItemClickListener 有反應
在點選 List Item,Checkable 的狀態更新後,onItemClick 才會被呼叫
原本實作時,直接透過 Checkable 更改被點選項目的狀態
但無論是 setChecked 或是 toggle 都無法正確的更新狀態
最後透過 ListView.setItemChecked( position, state ) 才正確的處理選擇的狀態。
首先是自定義的 List Item。
要在 List Item 最外層的 Layout 實作 Checkable Interface
以下為參考各路好漢後,所歸納整理出的程式碼
———————————————————————
package com.javahand.util; import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; import android.widget.CheckedTextView; import android.widget.LinearLayout; import android.widget.Checkable; public class CheckableLinearLayout extends LinearLayout implements Checkable { private CheckedTextView m_CheckedTextView; public CheckableLinearLayout( Context context, AttributeSet attrs ) { super( context, attrs ); } // end Constructor CheckableLinearLayout( Context, AttributeSet ) @Override protected void onFinishInflate() { super.onFinishInflate(); // find checked text view m_CheckedTextView = findCheckedChild(this ); } // end Method onFinishInflate() private CheckedTextView findCheckedChild( ViewGroup vg ) { CheckedTextView ctv = null; View v; int iChildCount = vg.getChildCount(); int i = 0; while ( i < iChildCount && ctv == null ) { v = getChildAt( i++ ); if ( v instanceof CheckedTextView ) { ctv = (CheckedTextView)v; } else if ( v instanceof ViewGroup ) { ctv = findCheckedChild((ViewGroup)v ); } // end If } // end While return ctv; } // end If public boolean isChecked() { return m_CheckedTextView != null && m_CheckedTextView.isChecked(); } // end Method boolean isChecked() public void setChecked( boolean b ) { if ( m_CheckedTextView != null ) { m_CheckedTextView.setChecked( b ); } // end If } // end Method public void toggle() { if ( m_CheckedTextView != null ) { m_CheckedTextView.toggle(); } // end If } // end Method toggle()} // end Class CheckableLinearLayout
—————————————————————————————————————————
自定義的多選功能搞定後
再來是選項數量有上限的限制。
試了半天 AdapterView.OnItemSelectedListener 在多選的 ListView 中無反應
只有 AdapterView.OnItemClickListener 有反應
在點選 List Item,Checkable 的狀態更新後,onItemClick 才會被呼叫
原本實作時,直接透過 Checkable 更改被點選項目的狀態
但無論是 setChecked 或是 toggle 都無法正確的更新狀態
最後透過 ListView.setItemChecked( position, state ) 才正確的處理選擇的狀態。
留言
張貼留言