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 (msdx.android@qq.com)
*/
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ͼ£º