Android ListView 多選狀態 checked state

這幾天在處理 ListView 多選的功能
首先是自定義的 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 ) 才正確的處理選擇的狀態。










留言

這個網誌中的熱門文章

泰文子音與字形之間的變化

AUTOMAXX UP-5HX 使用心得