Android开发技巧——自定义单选或多选的ListView

ÕâƪÆäʵӦ¸ÃÊÇÊôÓÚд×Ô¶¨Ò嵥ѡ»ò¶àÑ¡µÄListViewµÄ»ù´¡½Ì³Ì£¬ÎÞÄÎÄ¿Ç°Ðí¶àÈ˶Դ˵ÄʵÏÖ´ó¶à¶¼ÈÆÁËԶ·£¬·´¶øʹµÃÕâÕý¹æµÄд·¨µ¹ÏÔµÃÓÐЩ¼¼ÇÉÐÔÁË¡£

AndroidÖУ¬ListView¿ÉÒÔÉèÖÃchoiceMode£¬¿É¼ûAndroid¶ÔListViewµÄµ¥Ñ¡»ò¶àÑ¡ÊÇÓнøÐзâ×°µÄ£¬È»¶øÎÒ¿´µ½µÄÐí¶àµ¥Ñ¡»ò¶àÑ¡µÄListView£¬°üÀ¨ÎÒÒÔǰдµÄÀý×Ó£¬ÒÔÇ°¼¸¸öÀÏÍâ·â×°µÄ¿â£¬¶¼ÊÇ×Ô¼ºÎ¬»¤ÁËÒ»¸ö¼¯ºÏ£¬ÓÃÓÚ´æ·Åÿ¸öitemµÄÑ¡ÖÐ״̬¡£ÕâÑùÒ»À´£¬²»µ«´úÂëÏԵ÷±¸´£¬Âß¼­ÉÏÒ²³ÉÈßÓ࣬¶øÇÒÈÝÒ׳öBUG¡£

Æäʵ£¬ListViewÖУ¬ÒѾ­×Ô¼ºÎ¬»¤ÁËÒ»¸öSparseBooleanArray£¬ÓÃÓÚ±£´æÿһÏîµÄÑ¡ÖÐ״̬¡£¶ø¶ÔÓÚÿһÏËüÊÇͨ¹ýadapterµÄgetViewÖлñÈ¡µÄview£¬À´ÉèÖÃËüµÄÑ¡ÖÐ״̬µÄ¡£ËùÒÔ£¬ÎÒÃÇÐèҪʹµÃadapterÖУ¬getViewÖзµ»ØµÄÕâ¸öviewʵÏÖCheckable½Ó¿Ú¡£ÏÂÃ棬½«½éÉܾßÌåʵÏÖ¡£

ÕâÀï½éÉܵÄʵÏÖ·½Ê½ÓÐÁ½¸ö£¬Ò»ÖÖÊÇ´ÓÁãдһ¸öµ¥Ñ¡µÄListView¡£ÁíÒ»ÖÖÊǵ÷ÓÃÎÒµÄÒ»¸ö¿âµÄ´úÂëÀ´ÊµÏÖ¡£ÒòΪÎÒÒѾ­¶ÔÏà¹ØµÄ±ØÒªÂß¼­¶¼·â×°ÔÚÁËÁ½¸öÀàÀʹµÃÒ×ÓÚʹÓá£

Ô­ÉúʵÏÖ

1£¬ÏÈдitemµÄ²¼¾ÖÎļþ¡£

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="wrap_content">
    <RadioButton
        android:id="@+id/checkedView"
        android:layout_centerVertical="true"
        android:layout_alignParentLeft="true"
        android:clickable="false"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:layout_width="wrap_content"
        android:layout_height="48dp" />
    <TextView
        android:id="@+id/text"
        android:gravity="center_vertical"
        android:layout_alignParentRight="true"
        android:layout_width="wrap_content"
        android:layout_height="48dp" />
</RelativeLayout>

×¢Ò⣬ÕâÀïµÄRadioButton£¬ÐèÒªÉèÖÃÈý¸öÊôÐÔ£¬·Ö±ðÊÇ£º

        android:clickable="false"
        android:focusable="false"
        android:focusableInTouchMode="false"

2£¬½ÓÏÂÀ´£¬¼Ì³Ðij¸öLayout£¬À´ÊµÏÖ¿ÉÒÔµ¥Ñ¡µÄÕâ¸öitem¡£

package com.githang.android.choicelistview;
import android.content.Context;
import android.view.View;
import android.widget.Checkable;
import android.widget.FrameLayout;
import android.widget.RadioButton;
import android.widget.TextView;
/**
 * FIXME
 *
 * @author Geek_Soledad ([email protected])
 */
public class ChoiceView extends FrameLayout implements Checkable{
    private TextView mTextView;
    private RadioButton mRadioButton;
    public ChoiceView(Context context) {
        super(context);
        View.inflate(context, R.layout.item_single_choice, this);
        mTextView = (TextView) findViewById(R.id.text);
        mRadioButton = (RadioButton) findViewById(R.id.checkedView);
    }
    public void setText(String text) {
        mTextView.setText(text);
    }
    @Override
    public void setChecked(boolean checked) {
        mRadioButton.setChecked(checked);
    }
    @Override
    public boolean isChecked() {
        return mRadioButton.isChecked();
    }
    @Override
    public void toggle() {
        mRadioButton.toggle();
    }
}

×îºó£¬ÔÚlistviewµÄadapterµÄgetView·½·¨À·µ»ØÕâ¸öʵÏÖÁËCheckable½Ó¿ÚµÄChoiceView¡£

package com.githang.android.choicelistview;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        List<String> data = new ArrayList<>();
        for(int i = 0; i < 5; i++) {
            data.add("test" + i);
        }
        ListView listView = (ListView) findViewById(R.id.list_view);
        listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        ListAdapter adapter = new ArrayAdapter<String>(this, R.layout.item_single_choice, data) {
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                final ChoiceView view;
                if(convertView == null) {
                    view = new ChoiceView(MainActivity.this);
                } else {
                    view = (ChoiceView)convertView;
                }
                view.setText(getItem(position));
                return view;
            }
        };
        listView.setAdapter(adapter);
    }
}

´úÂëºÜ¼òµ¥·½±ã£¬ÍêÈ«²»ÓÃ×Ô¼ºÈ¥Î¬»¤Ò»¸öÑ¡ÖÐ״̬µÄ¼¯ºÏ¡£Demo ÏîÄ¿ÏÂÔصØÖ·£ºhttp://www.400gb.com/file/94898213

ʹÓÃAndroidSnippetÀïµÄÀàʵÏÖ

½ÓÏÂÀ´»¹Óиü¼òµ¥µÄʵÏÖ·½·¨£¬¼´Ê¹ÓÃÎÒ·â×°µÄÀàÀ´ÊµÏÖ¡£ÕâÖÖÇé¿öÏ£¬Ö»ÐèҪдһ¸öitemµÄ²¼¾ÖÎļþ£¬È»ºóдһ¸öadapter¼´¿É£¬ºÍдÆÕͨµÄListViewû¶à´óÇø±ð¡£

item µÄ²¼¾ÖÎļþ£º

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="wrap_content">
    <RadioButton
        android:id="@+id/checkedView"
        android:layout_centerVertical="true"
        android:layout_alignParentLeft="true"
        android:layout_width="wrap_content"
        android:layout_height="48dp" />
    <TextView
        android:id="@+id/text"
        android:gravity="center_vertical"
        android:layout_alignParentRight="true"
        android:layout_width="wrap_content"
        android:layout_height="48dp" />
</RelativeLayout>

¹ØÓÚRadioButtonµÄÈý¸öÊôÐÔÎÒÒѾ­ÔÚ´úÂëÀï·â×°ºÃÁË£¬ËùÒÔÕâÀïд²»Ð´ÄÇÈý¸öÊôÐÔ¶¼ÎÞËùν¡£

½ÓÏÂÀ´£¬¾ÍÊÇʹÓÃÎÒ·â×°µÄChoiceListAdapter£¬À´ÊµÏÖµ¥Ñ¡£¨»ò¶àÑ¡£©µÄListView£¬´úÂëÈçÏ£º

        listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        ChoiceListAdapter adapter = new ChoiceListAdapter<String>(this, R.layout.item_single_choice,
                data, R.id.checkedView) {
            @Override
            protected void holdView(ChoiceLayout view) {
                view.hold(R.id.text);
            }
            @Override
            protected void bindData(ChoiceLayout view, int position, String data) {
                TextView text = view.get(R.id.text);
                text.setText(data);
            }
        };
        listView.setAdapter(adapter);

ÕâÀïµÄChoiceLayout ÎÒ»¹¶Ôholder½øÐÐÁË·â×°£¬ÓÃÆðÀ´ÊDz»ÊǸü¼ò½à·½±ã£¿

¹ØÓÚAndroidSnippet ¿â£¬ÎÒÒÑ°Ñ´úÂëÍйܵ½github :https://github.com/msdx/AndroidSnippet¡£ÆäÖйØÓÚµ¥Ñ¡ÁбíµÄÀý×Ó£¬ÔÚapp moduleÖÐÓС£

×îºó¸½ÉÏʵÏÖЧ¹û¡£

Ч¹ûÊÓƵ£ºhttp://v.youku.com/v_show/id_XOTYxMzE1MTQ4.html

Ч¹ûGIFͼ£º