ÕâÆªÆäʵӦ¸ÃÊÇÊôÓÚд×Ô¶¨Ò嵥ѡ»ò¶àÑ¡µÄ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
½ÓÏÂÀ´»¹Óиü¼òµ¥µÄʵÏÖ·½·¨£¬¼´Ê¹ÓÃÎÒ·â×°µÄÀàÀ´ÊµÏÖ¡£ÕâÖÖÇé¿öÏ£¬Ö»ÐèҪдһ¸ö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ͼ£º